2013-07-02 65 views
0

如果我在MATLAB中使用這個命令,圖像會失真並且不會被保留。這是爲什麼?爲什麼結果不等同於原始圖像?

>> b = imread('eight.tif'); 
>> b2 = imdivide(b,64); 
>> bb2 = immultiply(b2,64); 
>> imshow(bb2) 
>> imshow(b); 
+0

我不能重現這一點,在這裏工作得很好(除了一些明顯的顏色變化)......你能不能上傳你的數字? –

+0

「扭曲」是什麼意思? – Shai

+0

如果'b'是'uint8'數組怎麼辦?我認爲對於'b'的所有元素來說,小於64的相應'b2'元素將是零,因此將由於整數運算而成爲'bb2'元素。 – anandr

回答

2

這是因爲你分割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上執行的。

+0

順便說一下,你可以使用'unique(b(:))'。這將列出'b'矩陣中的所有唯一值,它可以幫助您檢查更改的內容。 – Diana

3

您正在對作爲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') 

enter image description here

+0

是的,我猜想這件事會發生,但他說「扭曲」,所以我認爲形狀,大小和/或比例改變......嗯,無論如何+1 :) –

+0

我沒有得到它。我可以請外行解釋嗎? – user75736

+0

@ user75736你不明白什麼?你熟悉'uint8'數據類型嗎? – Shai

相關問題