matlab编程中涉及到图象矩阵数据类型uint8\double matlab中用imshow()显示图像与图像矩阵的数据类型

转载 2012年04月25日 13:54:06

记得当时用 imshow 显示灰度图有一些问题 进行double转化后解决



这个问题是在刚开始接触使用Matlab处理图像时经常会遇见的困惑。
        网上有这么一种说法:
         默认情况下,matlab将图像中的数据存储为double型,即64位浮点数;matlab还支持无符号整型(uint8uint16);uint型的优势在于节省空间,涉及运算时要转换成double
        但是,问题的真正的解释其实应该是这样的。首先是在数据类型转换时候uint8和im2uint8的区别,uint的操作仅仅是将一个double类型的小数点后面的部分去掉;但是im2uint8是将输入中所有小于0的数设置为0,而将输入中所有大于1的数值设置为255,再将所有其他值乘以255。
         图像数据在进行计算前要转化为double类型的,这样可以保证图像数据运算的精度。很多矩阵的很多矩阵数据也都是double的,要想显示其,必须先转换为图像的标准数据格式。如果转换前的数据符合图像数据标准(比如如果是double则要位于0~1之间,这个是由Matlab中的规定),那么可以直接使用im2uint8。
    如果转换前不满足这个分布规律,则使用uint8,将其自动切割至0~255(超过255的按255)最好使用mat2gray,这个函数可以把一个double类的任意数组转换成取值范围在[0,1]之间的,将一个矩阵转化为灰度图像的数据格式(double)另外,可以用isgray判断矩阵是否是一个图像数据矩阵。

   

 

【转】 matlab中用imshow()显示图像与图像矩阵的数据类型的关系

在matlab中,我们常使用imshow()函数来显示图像,而此时的图像矩阵可能经过了某种运算。在matlab中,为了保证精度,经过了运算的图像矩阵I其数据类型会从unit8型变成double型。如果直接运行imshow(I),我们会发现显示的是一个白色的图像。这是因为imshow()显示图像时对double型是认为在0~1范围内,即大于1时都是显示为白色,而imshow显示uint8型时是0~255范围。而经过运算的范围在0-255之间的double型数据就被不正常得显示为白色图像了。 那么如何解决这个问题呢?笔者曾经用fix()函数把图像矩阵由实数形式转化成整数形式,但这样仍无法改变图像矩阵是double型的事实。 通过搜索,找到两个解决方法: imshow(I/256); -----------将图像矩阵转化到0-1之间 imshow(I,[]); -----------自动调整数据的范围以便于显示 (不明白原理!%lwb 添加内容:此处用了图像灰度拉伸方法,将图像最小的像素值变为0,最大的为255%) 从实验结果看两种方法都解决了问题,但是从显示的图像看,第二种方法显示的图像明暗黑白对比的强烈些!不知什么原理! 此外还找到一些方法,还没有试过,记录如下:
uint8和im2uint8的区别
图像数据在计算前需要转换为double,以保证精度; 很多矩阵数据也都是double的,要想显示其,必须先转换为图像的标准数据格式. 如果转换前的数据符合图像数据标准(比如如果是double则要位于0~1之间),那么可以直接使用im2uint8 如果转换前的数据分布不合规律,则使用uint8,将其自动切割至0~255(超过255的按255) 最好使用mat2gray,将一个矩阵转化为灰度图像的数据格式(double) 另外,可以用isgray判断矩阵是否是一个图像数据矩阵

总之,im2uint8、im2double要跟uint8、double区别开来。

 

double 就是简单地把一个变量类型转换成double类型,数值大小不变;
比如 a=6 是个unit8类型的话,double(a)的结果还是6,不过现在这个6是double类型的。
函数im2double将输入转换成double类型。如果输入是 uint8 unit16 或者是二值的logical类型,则函数im2double 将其值归一化到0~1之间,当然就是double类型的了。如果输入本身就是double类型,输出还是double类型,并不进行归一化。。

转载http://hi.baidu.com/lwb198609_love/blog/item/f4c41f4d0082fa23aec3ab4e.html#0


MATLAB中用imshow()显示图像与图像的数据类型的关系

文章出处:http://www.ilovematlab.cn/thread-100044-1-1.html      (此为本人从CSDN上转载,因前半部分解决了偶的问题,故觉得有些价值,特...
  • zhb123GGGGGG
  • zhb123GGGGGG
  • 2015年04月30日 00:19
  • 956

matlab中用imshow()显示double类型图像中出现的问题

在matlab中,我们常使用imshow()函数来显示图像,而此时的图像矩阵可能经过了某种运算。在matlab中,为了保证精度,经过了运算的图像矩阵I其数据类型会从unit8型变成double型。如果...
  • majinlei121
  • majinlei121
  • 2015年06月25日 10:37
  • 4374

图像类型、MATLAB数据类型,以及类型之间的转换(二)

上篇中我们根据需要将图像分为4种类型,其中每种图像的表示或多或少都牵扯到不同的数据类型,大致如下: 图像类型 使用到的数据类型 灰度图像 像素值为uint8,uint16,归一化doub...
  • Scut_Aspen
  • Scut_Aspen
  • 2015年04月15日 15:27
  • 1891

图像类型、MATLAB数据类型,以及类型之间的转换(一)

在使用MATLAB进行有关图像读取、显示和处理的时候,认真考虑图像类型以及MATLAB中的数据类型,从而根据自己的需要进行必要的类型之间的转换,可以有效避免不必要的细微错误——这样的细微错误有时候恰恰...
  • Scut_Aspen
  • Scut_Aspen
  • 2015年04月14日 16:54
  • 1446

matlab怎么同时显示imshow 两幅图片

matlab怎么同时显示imshow 两幅图片 方法一:subplot()函数 subplot(2,1,1); subplot(2,1,2); 分上下或者左右显示两张图片... 例如: 原始图片分两...
  • tiandijun
  • tiandijun
  • 2015年03月18日 14:45
  • 16182

怎样用MATLAB将矩阵输出为图像并存到硬盘上-图像保存到硬盘!

本文作者是OpenCV代码网,网址http://opencv66.net/ 有时候,我们在看OpenCV源码的时候,需要一幅非常简单的图像来测试(图像简单咱们可以做人工推算,然后与机器运算的结果...
  • wenhao_ir
  • wenhao_ir
  • 2016年04月22日 10:42
  • 4589

Matlab 图像平移、旋转、缩放、镜像

Matlab 图像平移、旋转、缩放、镜像今天学习了用Matlab实现对图像的基本操作。在Matlab中,图像是按照二维矩阵的形式表示的。所以对图像的操作就是对矩阵的操作。 对图像进行缩放、平移、旋转...
  • ACMore_Xiong
  • ACMore_Xiong
  • 2016年11月07日 15:09
  • 11527

没事随便写写——matlab图像与矩阵的转换与存储为txt文件

图像基本的矩阵转换,存储和读取
  • zb1165048017
  • zb1165048017
  • 2015年10月12日 20:22
  • 3066

matlab中用imshow()显示图像与图像矩阵的数据类型的关系

http://blog.csdn.net/tina_lulu_21/article/details/2603162 在matlab中,我们常使用imshow()函数来显示图像,而此时的图像矩...
  • xfortius
  • xfortius
  • 2013年05月11日 10:28
  • 821

uint8、double、mat2uint、imhist绘直方图w恩替藐视

1.问题描述 ImgUS = imread('050.bmp'); Igray = rgb2gray(ImgUS); Igray = double(Igray); figure,imshow(Igr...
  • shenziheng1
  • shenziheng1
  • 2016年03月25日 17:41
  • 1031
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:matlab编程中涉及到图象矩阵数据类型uint8\double matlab中用imshow()显示图像与图像矩阵的数据类型
举报原因:
原因补充:

(最多只允许输入30个字)