1. 程式人生 > >MATLAB中imshow()函式處理影象時出現全白顯示的原因

MATLAB中imshow()函式處理影象時出現全白顯示的原因

1、uint8(無符8位)與double     double函式只是將讀入影象的uint8資料轉換為double型別,一般不使用;常用的是im2double函式,將

uint8影象轉為double型別,範圍為0-1,如果是255的影象,那麼255轉為1,0還是0,中間的做相應改變。 MATLAB中讀入影象的資料型別是uint8,而在矩陣中使用的資料型別是double。因此     I2=im2double(I1) :把影象陣列I1轉換成double精度型別;如果不轉換,在對uint8進行加減時會產生

溢位。預設情況下,matlab將圖象中的資料儲存為double型,即64位浮點數;matlab還支援無符號整型

(uint8和uint16);uint型的優勢在於節省空間,涉及運算時要轉換成double型。     im2double():將圖象陣列轉換成double精度型別     im2uint8():將圖象陣列轉換成unit8型別     im2uint16():將圖象陣列轉換成unit16型別

MATLAB中imread(img),讀取儲存的資料是unit8型別的,如果需要運算,最好轉換成double型,直接im2double(img)就可以,然後這樣處理的資料全是[0,1]之間的。

當然imshow(img),img不管是double型還是unit8 型都可以顯示。

imshow(I,[]);       ----------- 自動調整資料的範圍以便於顯示

 imshow(I,[low high])用指定的灰度範圍 [low high]顯示灰度影象 I。顯示結果,影象中灰度值等於或低於low的都將用黑色顯示,而灰度值大於等於high的都顯示為白色,介於low和high之間的用其灰度級的預設值的中間色調顯示。
 如果你用了一個空矩陣 ([]) 來代替 [low high], imshow 函式將使用 [min(I(:))max(I(:))]作為第二個引數。
I = imread('......');
subplot(1,2,1); 
imshow(I);
title('fig 1');
Fa = -1;Fb = 255;
O = Fa.*I + Fb;%轉換為了double型別
subplot(1,2,2);
imshow(O);title('fig 2');

2、uint8和im2uint8     在資料型別轉換時候uint8和im2uint8的區別,uint8的操作僅僅是將一個double型別的小數點後面的部

分去掉;但是im2uint8是將輸入中所有小於0的數設定為0,而將輸入中所有大於1的數值設定為255,再將所

有其他值乘以255。     影象資料在計算前需要轉換為double,以保證精度;很多矩陣資料也都是double的。要想顯示其,必須先

轉換為影象的標準資料格式。如果轉換前的資料符合影象資料標準(比如如果是double則要位於0~1之間)

,那麼可以直接使用im2uint8。如果轉換前的資料分佈不合規律,則使用uint8,將其自動切割至0~255(

超過255的按255)。最好使用mat2gray,將一個矩陣轉化為灰度影象的資料格式(double)

3、double型別影象的顯示     影象資料在進行計算前要轉化為double型別的,這樣可以保證影象資料運算的精度。很多矩陣的很多矩

陣資料也都是double的,要想顯示其,必須先轉換為影象的標準資料格式。如果直接執行imshow(I),我們會

發現顯示的是一個白色的影象。這是因為imshow()顯示影象時對double型是認為在0~1範圍內,即大於1時都

是顯示為白色,而imshow顯示uint8型時是0~255範圍。而經過運算的範圍在0-255之間的double型資料就被

不正常得顯示為白色影象了。具體方法有:  imshow(I/256);    ----------將影象矩陣轉化到0-1之間                 imshow(I,[]);     ----------自動調整資料的範圍以便於顯示 (注意這裡,必須是灰度圖,否

則不行)  imshow(uint8(I));  imshow(mat2gray(I));     上面的mat2gray是將最終獲得的矩陣轉化為灰度影象。常用的為:  A = im2uint8(mat2gray(result))     這樣就將result矩陣轉化為uint8型別的影象。