這是昨天的問題:
RGB = imread('A.jpg');
加入此時得到的RGB是uint8類型的三維數組。
那麼
imshow(RGB),ok完全沒問題,得到的是原圖。
但是
imshow( double(RGB) )
或者imshow( uint16(RGB) )
亦或是imshow( single(RGB) )
得到的都是全黑或全白的。
搞半天,感覺可能是各種類型的範圍是不一樣的,因為對於grayscale image 就是不同類型有不同範圍【imshow(I,[low high])】
對於truecolor image怎麼辦呢?
現在大概明白點:
在help檔案中,有這麼一句:For grayscale images of classsingle ordouble,the default display range is[0 1]
那麼也可以聯想對於truecolor,single和double類型的也需要在[0,1]範圍內吧。
因此將 imshow( double(RGB) )換成imshow(double(RGB)/255),或者imshow(
single(RGB) )換成imshow(single(RGB)/255)就可以了;
而對於unit16,我們知道unit8的範圍是[0 255],而uint16範圍是[0 2^16-1],按同樣的道理,將imshow( uint16(RGB) )換成imshow(
uint16(RGB)*255 )
(PS:我想大概truecolor的範圍都只是【0 255】,所以就預設為uint8類型了,這個時候需要注意,相加的時候可能出錯誤,如uint8的180和uint8的180相加就溢出了,得到還是255.這裡需要格外注意!解決辦法應該換成uint16或者double吧,但double是,最後imshow的時候也要防止錯誤。所以我在想有沒有一種辦法可以不要那麼麻煩,不要那麼轉來轉去?)
在轉換類型的時候需要注意:
t = [1 2 3]; 此處t為double類型的,如果想轉成unit8的,只需 t = uint8(t)即可;對於uint16,signle等等之類的都用類似的辦法。
但是如果你用 “im2XX”函數需要格外注意,double類型的預設範圍是【0 1】,而uint8是 【0 255】。
看下面例子:
t = [1 2 3]; %這裡t是double類型的
%下面希望用t轉成uint8類型
t1 = im2uint8(t);
%得到的結果是
t1 = [255 255 255] %這是錯誤的
%如何得到正確的結果
t2 = uint8(t); %此時得到的結果就是t2=[1 2 3]並且是unit8類型的。
%或者
t2 = im2uint8(t/255); %此時的t2=[0 1 2]並且是unit8類型的。
同理:想將t轉換成uint16的兩種辦法:
t = [1 2 3];t1 = im2uint16(t/65535); %因為uint16的範圍是[0 65535]t2 = uint16(t) %直接用uint16函數