参考文档: 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与显示图像时的全白问题相关推荐

  1. matlab中imshow函数输出图像全白全黑问题

    imshow 显示图像全白 在matlab中,为了保证精度,经过了运算的图像矩阵A其数据类型会从unit8型变成double型.imshow()显示图像时对double型是认为在0-1范围内,即大于1 ...

  2. OpenCV的imwrite或者imshow全白

    我们在使用imshow或者imwrite时,往往会错误的全白的纯色图像. 这是因为,imshow函数在处理时是分情况的,当Mat.type为浮点数时,默认区间为[0,1],当浮点数大于1时就是白色:当 ...

  3. OpenCV的imshow不能显示图像(显示的图像全灰)

    问题:OpenCV的imshow不能显示图像,虽然能打开一个显示图像的窗口,但是只显示出背景(全灰色) 解决方法:在imshow语句后面加一句waitKey(100); 在imshow之后如果没有wa ...

  4. 使用plt.savefig()方法保存绘图时出现图片全白或全黑的问题

    使用plt.savefig方法保存绘图时出现图片全白或全黑的问题 1.问题 2.解决办法 [将plt.savefig("figures/1.png")放至plt.show()语句前 ...

  5. MATLAB,画一个全白的图

    只用生成一个全白的图就OK 在这里插入代码片 clear all; cm = 0.01; um = 1e-6; nm = 1e-9; mm = 1e-3; lambda = 638.8*nm;Pitc ...

  6. matlab显示的图片,手动保存时四周有白边

    matlab显示的图片,或者用matlab画出来的图片,手动保存时四周有白边. girl = imread('girl.jpg'); imshow(girl); 用File-Save或者Save As ...

  7. vs中imshow函数报错_opencv编程:8 imshow不显示图像和waitkey函数

    想用opencv对图像做一些操作,先实现简单的读取和显示,但是利用下面的代码,只是显示了窗口没有显示图像, Mat image=imread("T1.jpg"); namedWin ...

  8. 解决 plt.savefig 保存图像为全白或全黑图像方法

      在使用 python 载入数据绘图并保存时,可能会存在保存的图像为全白图像(默认背景为白色),例如,以如下数据为例,保存的图像为全黑色(设置的背景色为黑色).   解决方式: 将 plt.show ...

  9. 更新vetur和vscode版本后,vetur失效,代码全白

    2019/10/12: vscode版本号1.39.1,veter插件版本0.22.4. setting.json文件确认已关联.vue文件, 选中vue文件时右下角也已经识别, vetur也卸载重装 ...

最新文章

  1. PPLIVe是如何通过URL来启动程序的?
  2. VC基于MSCOMM控件串口通讯
  3. Jenkins构建之常用的触发器和Git Hook自动构建
  4. 手把手教你用1行代码实现人脸识别 -- Python Face_recognition
  5. 奉献一个窗口置顶的小工具
  6. 【金融】【python】使用python处理多种期货数据指标
  7. Linux文件类型及颜色标识整理
  8. 【企鹅电竞直播源】浏览器抓取真实直播源地址(纯前端JS PHP解析源码)
  9. Java代码执行Linux脚本
  10. java 基站定位_android基站定位 | 学步园
  11. 一文搞定权限设计模型(RBAC,ABAC)超详细图文解析
  12. 怎么禁止恢复微信聊天记录?学会这几招以备不时之需
  13. 百战归来再读书--一个程序员的2008年阅读书目
  14. I am a boy!
  15. Android APK反编译哟~~~
  16. Ubuntu16.04 NVIDIA显卡驱动卸载与安装
  17. Mybatis 中的事务
  18. 计算机编程专业有哪些好的大学?
  19. 苹果cms模板_苹果cms10好看的模板有那些?
  20. 银联商务技术开发笔试题目

热门文章

  1. VLSI芯片电路测试分类testMode、模式、时钟复位输入输出
  2. Python爬虫之爬取绝对领域美女图片
  3. 【TigerGraph】图数据库实战入门 —— 数据导入
  4. CentOS7的Tiger VNC设置
  5. 浅谈制药行业实施MES系统
  6. 2022 年合肥市经开区第七届青少年信息学竞赛 小学组试题
  7. 阿里云入门级服务器和企业级服务器有什么区别?
  8. MATLAB报错:尝试将 SCRIPT XXX 作为函数执行
  9. 【网络硬件】6.什么是路由器?
  10. 微信退款php参数格式错误,PHP实现微信申请退款功能