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





  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值