imshow()函數:參數是不同類型的情況

來源:互聯網
上載者:User

這是昨天的問題:

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函數



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.