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');
显示结果
imshow与显示图像时的全白问题相关推荐
- matlab中imshow函数输出图像全白全黑问题
imshow 显示图像全白 在matlab中,为了保证精度,经过了运算的图像矩阵A其数据类型会从unit8型变成double型.imshow()显示图像时对double型是认为在0-1范围内,即大于1 ...
- OpenCV的imwrite或者imshow全白
我们在使用imshow或者imwrite时,往往会错误的全白的纯色图像. 这是因为,imshow函数在处理时是分情况的,当Mat.type为浮点数时,默认区间为[0,1],当浮点数大于1时就是白色:当 ...
- OpenCV的imshow不能显示图像(显示的图像全灰)
问题:OpenCV的imshow不能显示图像,虽然能打开一个显示图像的窗口,但是只显示出背景(全灰色) 解决方法:在imshow语句后面加一句waitKey(100); 在imshow之后如果没有wa ...
- 使用plt.savefig()方法保存绘图时出现图片全白或全黑的问题
使用plt.savefig方法保存绘图时出现图片全白或全黑的问题 1.问题 2.解决办法 [将plt.savefig("figures/1.png")放至plt.show()语句前 ...
- MATLAB,画一个全白的图
只用生成一个全白的图就OK 在这里插入代码片 clear all; cm = 0.01; um = 1e-6; nm = 1e-9; mm = 1e-3; lambda = 638.8*nm;Pitc ...
- matlab显示的图片,手动保存时四周有白边
matlab显示的图片,或者用matlab画出来的图片,手动保存时四周有白边. girl = imread('girl.jpg'); imshow(girl); 用File-Save或者Save As ...
- vs中imshow函数报错_opencv编程:8 imshow不显示图像和waitkey函数
想用opencv对图像做一些操作,先实现简单的读取和显示,但是利用下面的代码,只是显示了窗口没有显示图像, Mat image=imread("T1.jpg"); namedWin ...
- 解决 plt.savefig 保存图像为全白或全黑图像方法
在使用 python 载入数据绘图并保存时,可能会存在保存的图像为全白图像(默认背景为白色),例如,以如下数据为例,保存的图像为全黑色(设置的背景色为黑色). 解决方式: 将 plt.show ...
- 更新vetur和vscode版本后,vetur失效,代码全白
2019/10/12: vscode版本号1.39.1,veter插件版本0.22.4. setting.json文件确认已关联.vue文件, 选中vue文件时右下角也已经识别, vetur也卸载重装 ...
最新文章
- PPLIVe是如何通过URL来启动程序的?
- VC基于MSCOMM控件串口通讯
- Jenkins构建之常用的触发器和Git Hook自动构建
- 手把手教你用1行代码实现人脸识别 -- Python Face_recognition
- 奉献一个窗口置顶的小工具
- 【金融】【python】使用python处理多种期货数据指标
- Linux文件类型及颜色标识整理
- 【企鹅电竞直播源】浏览器抓取真实直播源地址(纯前端JS PHP解析源码)
- Java代码执行Linux脚本
- java 基站定位_android基站定位 | 学步园
- 一文搞定权限设计模型(RBAC,ABAC)超详细图文解析
- 怎么禁止恢复微信聊天记录?学会这几招以备不时之需
- 百战归来再读书--一个程序员的2008年阅读书目
- I am a boy!
- Android APK反编译哟~~~
- Ubuntu16.04 NVIDIA显卡驱动卸载与安装
- Mybatis 中的事务
- 计算机编程专业有哪些好的大学?
- 苹果cms模板_苹果cms10好看的模板有那些?
- 银联商务技术开发笔试题目