参考网址:
Images don't show with imshow after converting them to double.
matlab图像类型转换以及uint8、double、im2double、im2uint8和mat2gray等说明
原始的两张图像:
今天在做实验的时候,遇到一个图像显示的问题,就是图像转成double类型处理后忘了转回到uint8类型就imshow显示了,导致没有结果图出来,以下这种两种情况就会显示很花的图像:原因是因为转成double类型后是有符号双精度类型,虽然C的数值上的取值还是[-255,255],但是在imshow时候会把double类型只显示[0 1]范围,大于1的显示白色,小于0的显示黑色,所以会显示如下所示的图像
im1 =double( imread('0144.ppm'));
im2 =double( imread('0160.ppm'));
C=im1-im2;%C的范围是[-255,255]
imshow(C,[]);
imshow(C,[0 1]);%和上面显示的是相同的结果
所以对double类型的图像显示的时候,由于程序会视数据类型来决定显示的值的范围,所以要么归一化到(不能转成double在使用im2double,这样没有什么变化,应该在uint8转的时候使用im2double将[0,255]归一化到[0,1])0~1之间,要么将double类型的0~255数据转为uint8类型,但是由于uint8是unsigned char,RGB是3个uchar类型的,直接相减结果范围为[0,255],相加或相乘会产生上溢,如果直接imshow两种方法都可,但是进行数值计算的时候uint8会影响计算结果,所以还是直接把uint8转成im2double后在进行计算比较好
im1 = imread('0144.ppm');
im2 = imread('0160.ppm');
diff1=im2double(im1)-im2double(im2);%范围在[-1,1]
diff2=im1-im2;%范围为[0,255]
imshow(diff1,[]);%小于0的为黑色
imshow(diff2,[]);
总结:
1.用原始数值直接计算 要么RGB转灰度 要么RGB三通道分别处理;
2.由于uint类型的数据在相加或相乘的时候会产生上溢,所以在读入图像后一般使用im2double把[0,255]映射到[0,1],在进行计算或显示;
3.使用imshow显示的时候转成uint8;
4.如果两张图像都是uint8类型,相减的时候会把得到的负数值转换成0,只有都转成double类型后相减才能得到负值;