Аз съм доста нов в 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 нива на сиво.