GIF圖像是什麼被稱爲索引圖像。這意味着您在imread
中讀到的值是索引到顏色映射。每個索引都會爲您生成一種獨特的顏色,這就是GIF圖像的存儲方式。他們從一組預定義的顏色中進行選擇,並且GIF圖像中的每個像素都來自顏色映射中的一種顏色。
您首先需要將圖像轉換爲RGB,然後使用ind2rgb
來完成此操作。但是,您需要先閱讀色彩映射表,然後輸入imread
的雙輸出版本。您還希望將圖像uint8
好做法轉化與im2uint8
:
[X,map] = imread('lena.gif');
I = im2uint8(ind2rgb(X,map));
你下一步需要做的是什麼@NKN建議。您必須將算法應用於所有通道。因此,只需製作一個具有三個通道的輸出矩陣,並將算法獨立應用於每個平面即可。如果我可以提出建議,在縮減採樣後以這種方式訪問像素時,請確保您的圖像座標爲floor
或round
,這樣您就不會無意中指定未定義的位置 - 例如(13.8,25.5)。圖像像素位置是整數,所以你需要確保座標也是整數。
[X,map] = imread('lena.gif');
I = im2uint8(ind2rgb(X,map));
j = size(I,1); %// Change
k = size(I,2);
x_new = j./2;
y_new = k./2;
x_scale = j./x_new;
y_scale = k./y_new;
M = zeros(x_new,y_new,size(I,3)); %// Change
for jj = 1 : size(I,3) %// Change
for count1 = 1:x_new
for count2 = 1:y_new
M(count1,count2,jj) = I(floor(count1.*x_scale),floor(count2.*y_scale),jj); %// Change
end
end
end
figure,imshow(I);
title('Original Image');
M = uint8(M);
figure,imshow(M);
title('Downsample');
爲了測試這一點,我使用了mandrill
數據集的MATLAB的一部分。它是帶有相關顏色映射的索引圖像。這些都不約而同地存儲在X
和map
恭敬的道:
load mandrill;
I = im2uint8(ind2rgb(X,map));
運行修改後的代碼,我得到這兩個數字:
'M'只有一個層,有沒有RGB信息,所以結果是灰色的是有道理的。如果輸入圖像,您應該使用全部3層。 – NKN
如何將RGB信息添加到M呢?我是圖像處理新手:/ @NKN – Blu
爲什麼不使用'imresize'? – bla