这是昨天的问题:
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函数