matlab—图像显示

参考网址:

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类型后相减才能得到负值;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值