imshow()函数:参数是不同类型的情况

这是昨天的问题:

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





展开阅读全文

没有更多推荐了,返回首页