我來到一個matlab
代碼,其中它首先讀取圖像並將其如下轉換爲double
圖像:顯示
I = double(imread(img));
在此之後,它示出了圖像,如下所示:
imshow(I/max(I(:)))
那是什麼意思?特別是當我刪除max
部分時,我只得到一個白色背景的圖像。這種劃分的目標是什麼?而且,爲什麼它在完成後正確顯示圖像,並且如果直接顯示讀取的圖像而沒有通過max除法,則無法正確顯示圖像?
謝謝。
我來到一個matlab
代碼,其中它首先讀取圖像並將其如下轉換爲double
圖像:顯示
I = double(imread(img));
在此之後,它示出了圖像,如下所示:
imshow(I/max(I(:)))
那是什麼意思?特別是當我刪除max
部分時,我只得到一個白色背景的圖像。這種劃分的目標是什麼?而且,爲什麼它在完成後正確顯示圖像,並且如果直接顯示讀取的圖像而沒有通過max除法,則無法正確顯示圖像?
謝謝。
表達:
I/max(I(:))
只是正常化的像素值的範圍內0..1.0。它將所有像素值除以最大值。
max(I(:))
似乎是一個歸一化步驟
從documentation遵循imshow需要具有0至1.0之間和
imshow(I)值的輸入矩陣顯示圖像I中的手柄Graphics®圖,其中我 是灰度,RGB(真彩色)或二進制圖像。對於二進制圖像, imshow顯示值爲0(零)的像素爲黑色,1爲 白色。
感謝您的回覆。這種情況是我有一個灰度圖像,其中最小值是'77',最大值是'113'。爲什麼如果我不規範我沒有得到預期的輸出? – Simplicity 2013-04-25 10:03:33
因爲您的值不在0..1.0範圍內,所以您需要對此進行更正。值113將顯示爲白色,而0將顯示爲黑色。你也可以使用'imshow(I,[low high])',在這裏你可以設置範圍。 – Nick 2013-04-25 10:06:42
I
是一個2D或3D矩陣(取決於灰度或顏色)。 I(:)
是將矩陣的所有值寫入列中的向量,就像它們排列在內存中一樣;你也可以通過reshape
來完成。請閱讀Matlab documentation中有關冒號操作符的更多信息,這是Matlab絕對的基本概念。
max
爲您提供了一個向量上的最大值,即max(I(:))
爲您提供了整個圖像的最大值。
這是一個圖像的範圍從0開始。因此,你可以通過將其除以max(I(:))
圖像的值映射到[0,1]
一個不成文的定律。在Matlab中它是這樣做的:myMatrix/myScalar
。
所以I/max(I(:))
爲您提供的圖像的值爲[0,1]
,您要用imshow
顯示的雙重圖像需要什麼。
請注意:
(1)你可以寫imshow(I,[])
代替它會顯示你拉伸到[0,1]
值圖像(差到你的最低版本映射到0以及)。
(2)在我看來,您應該映射圖像的值以便僅在特殊情況下才可視化。它可以給你錯誤的圖像印象(例如,一個非常黑暗的圖像將被視爲完整的對比圖像)。嘗試最大化原始值範圍(通常爲255,4095或65535)。例如:
img = imread('some12bit.png');
img = double(img);
img = img/4095; % [0,4095] -> [0,1]
imshow(img);
(3)在不將圖像映射到[0,1]
所有值> 1
將被解釋爲1
。這就是爲什麼您的圖像顯示爲白色圖像,而未將其映射到[0,1]
之前。
感謝您的回覆。這種情況是我有一個灰度圖像,其中最小值是'77',最大值是'113'。爲什麼如果我不規範我沒有得到預期的輸出? – Simplicity 2013-04-25 10:02:41
如果您將'double'值傳遞給'imshow',它們需要在範圍0 .. 1 - 請參閱@ Nick的答案以獲取更多詳細信息。 – 2013-04-25 10:03:47
例如,如果我們的值爲'77',不會簡單地將它設置爲'77.0'?在這種情況下,「double」意味着什麼? – Simplicity 2013-04-25 10:13:54