如果我在MATLAB中使用這個命令,圖像會失真並且不會被保留。這是爲什麼?爲什麼結果不等同於原始圖像?
>> b = imread('eight.tif');
>> b2 = imdivide(b,64);
>> bb2 = immultiply(b2,64);
>> imshow(bb2)
>> imshow(b);
如果我在MATLAB中使用這個命令,圖像會失真並且不會被保留。這是爲什麼?爲什麼結果不等同於原始圖像?
>> b = imread('eight.tif');
>> b2 = imdivide(b,64);
>> bb2 = immultiply(b2,64);
>> imshow(bb2)
>> imshow(b);
這是因爲你分割UINT8圖像。當你將圖像(其值範圍在0到255之間)除以64時,你將得到一個值爲0,1,2,3和4的圖像。當你乘以它時,你將得到0,64 ,128,192和255,而不是你最初的全部值。
檢查了這一點:imshow(b/64*64)
。這會向你展示相同的神器。
現在檢查這個:imshow(uint8(double(b)/64*64))
。這會顯示原始圖像。您可以在這種情況下恢復值,因爲這些操作是在雙打而不是uint8上執行的。
順便說一下,你可以使用'unique(b(:))'。這將列出'b'矩陣中的所有唯一值,它可以幫助您檢查更改的內容。 – Diana
您正在對作爲uint8
(無符號8位)存儲的圖像的像素執行操作。
將像素除以64,您基本上將值右移6(!)位,也就是說,每個像素只剩下2(1)個最高有效位。乘以64乘以零填充6個最低有效位 - 數據丟失。
這裏有一個小例子:
>> a = uint8(153); dec2bin(a)
ans =
0b10011001
>> b = a/64; dec2bin(b)
ans =
0b00000010
注意如何將所有右邊的6位(011001
)都不見了!只剩下左邊的兩位(10
)(右移)。這種劃分操作導致你數據丟失。
現在,乘回:右側
>> c = b*64; dec2bin(c)
ans =
0b10000000
所有6位是現在0
!前面的值011001
是GONE!
另一個exampe通過Rody:
data = uint8(1:255);
figure(1), clf, hold on
plot(data, data, 'b')
plot(data, data/uint8(64)*uint8(64), 'r')
xlabel('Original Values')
ylabel('Ouptut values')
axis tight
legend('Original color space', 'Color space after integer division/multiply',...
'Location', 'NorthWest')
我不能重現這一點,在這裏工作得很好(除了一些明顯的顏色變化)......你能不能上傳你的數字? –
「扭曲」是什麼意思? – Shai
如果'b'是'uint8'數組怎麼辦?我認爲對於'b'的所有元素來說,小於64的相應'b2'元素將是零,因此將由於整數運算而成爲'bb2'元素。 – anandr