imshow与显示图像时的全白问题

参考文档: https://zhidao.baidu.com/question/506147511.html
http://blog.csdn.net/watkinsong/article/details/38535341
感谢@李娜同学的提问,使我改正一个错误。以下有标注。

前言

要说为什么图像经过操作后,直接使用imshow函数显示的结果为什么是一张白纸一样的图像。一个月前,我也是很困惑,不知道为什么代码几乎没错,可就是不能正常显示图像。当时以为matlab坏了的缘故,虽然有很多程序都遇到这样的现象。但我依旧固执地认为是软件的缘故,看来还是naive呀~~~

imshow

显示类型

首先应当明确的是,imshow内部的参数类型可以分为两种。(1)当输入矩阵是uint8类型的时候,此时imshow显示图像的时候,会认为输入矩阵的值范围在0-255之间。(2)如果imshow的参数是double类型的时候,那么imshow会认为输入矩阵值的范围在0-1。

问题原因

大家看出来端倪了吗?其实我们显示不出图像,大多都和性质(2)有关。那是因为当我们对图像矩阵进行操作时,倘若图像矩阵(double型)的矩阵元素不在0-1之间,那么imshow函数会自动把超过1的元素都看作1,因为在归一化到0-1数据范围内,1就等同于整型的255。这也就解释了为什么会将图像显示为全白。也就是说如果矩阵是double类型的,而又没有归一化,那么这样的double类型的矩阵就不能保证矩阵的数据范围在0-1之间。所以就会显示图像为全白的现象。下面以一个简单的例子来说明。

file = 'lena_gray_512.tif';
img = imread(file);
img_1 = double(img);

figure(1);imshow(img_1);title('直接显示');

img_2 = double(img);
% 对矩阵数据进行归一化 x-min/max-min
top  = max(img_2(:)); 
foot = min(img_2(:));

img_2 = (img_2-foot)./(top-foot);
figure(2);imshow(img_2);title('归一化之后');

解决办法

既然找到问题的原因,那么就要动手了。首先我们能想到的是应该是既然它不是0-1之间的double矩阵,那我们就将矩阵元素转换到0-1之间呗。所以就该mat2gray函数出场了,还记得吧,他可是会返回一个归一化的double类型的矩阵呀!!!也许你会想,我就不显示double类型的,我就爱uint8。那不就是把double转为uint8呗,这个不会忘记吧,uint8函数就可以取得这样的效果。但是最后一个办法就比较难想到了(仅针对像我这样的小白,大神别用鄙夷的语气),imshow(K,[]),那它到底是什么意思呢?imshow(K,[])显示K,并将K的最大值和最小值分别作为纯白(255)和纯黑(0),中间的K值映射为0到255之间的标准灰度值。

程序代码

% 测试imshow函数的特性,造成显示图像时就一张白纸的现象
im = imread('../images1/lena_gray_256.tif');

% 将uint8类型的图像矩阵转为double类型的
tran_double = double(im);

% 用imshow显示经过double类型的图像矩阵
figure;imshow(tran_double);title('double transform');
% 解决办法
% solver 1  uint8
% figure;imshow(uint8(tran_double));title('solver');
% solver 2 imshow(I,[])
% 该方法只适用于二维图像(感谢@李娜同学)
% figure;imshow(tran_double,[]);title('solver');
% solver 3 
mat_gray = mat2gray(tran_double);
figure;imshow(mat_gray);title('solver');

显示结果

这里写图片描述

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值