/ / промяна на броя на сиви нива в сивата скала в MATLAB - обработка на изображения, MATLAB

промяна на сиви нива в сивата скала в MATLAB - обработка на изображения, MATLAB

Аз съм доста нов в MATLAB, но се надявахнякой може да помогне с този въпрос. Така че имам цветен образ, който искам да преобразувам в сивата скала и след това да намаля броя на сивите нива. Така че прочетох в изображението и аз използвах rgb2gray () за преобразуване на изображението в сивата скала. Въпреки това, не съм сигурен как да конвертирате изображението, за да използвате само 32 сиви нива вместо 255 сиви нива.

Опитвах се да използвам colormap (сиво (32)), но това сякаш нямаше ефект върху самото изображение или върху цветната лента под изображението. Така че не бях сигурен къде да погледна друго. Някакви съвети там? Благодаря.

Отговори:

2 за отговор № 1

Можете да намалите броя на различните стойности в изображението чрез просто закръгляване:

I = rgb2gray(imread("image.gif"));
J = 8*round(I/8)

виждам imhist(I) и imhist(J) за ефекта.

Ако обаче искате да намалите размера на изображението, виеможе да е по-добре да използвате програма за обработка на изображения като Photoshop, Gimp или IrfanView и да запазите като 32-цветен gif. По този начин действително ще намалите палитрата на файла и мисля, че това нещо не може да направи Matlab.


2 за отговор № 2

Докато result = (img/8)*8 конвертира изображение в сивата скала в диапазона [0,255] до подмножество от този диапазон, но сега използвайки само 32 стойности, може да създаде нежелани артефакти. Метод, който може да произвежда визуално по-добри изображения, се нарича подобрена квантизация на сивото (съкратено като IGS). Псевдо-кодът за извършването му може да бъде даден като:

mult = 256 / (2^bits)
mask = 2^(8 - bits) - 1
prev_sum = 0
for x = 1 to width
for y = 1 to height
value = img[x, y]
if value >> bits != mask:
prev_sum = value + (prev_sum & mask)
else:
prev_sum = value
res[x, y] = (prev_sum >> (8 - bits)) * mult

Като пример, разгледайте следната фигура и съответните квантували с bits = 5, bits = 4, и bits = 3 използвайки горния метод:

въведете описанието на изображението тук въведете описанието на изображението тук въведете описанието на изображението тук въведете описанието на изображението тук

Сега същите изображения, но квантувани чрез правене (img/(256/(2^bits)))*(256/(2^bits)):

въведете описанието на изображението тук въведете описанието на изображението тук въведете описанието на изображението тук въведете описанието на изображението тук

Това не е патологичен пример.


0 за отговор № 3

Проверете дали типът на вашите изображения е такъв uint8 което бих подозирал. Ако този случай разделят изображението на 8, за да злоупотреби с ефекта на настилката на цялото разделение, умножете отново с 8 и настройте: I2=(I/8)*8. I2 ще има само 32 нива на сиво.