matlab——uint8、im2uint8、double、im2double和mat2gray的说明

参考:https://blog.csdn.net/FX677588/article/details/53301740

1、图像在matlab中的保存

matlab读取图片后保存的数据是uint8类型(8位无符号整数,即1个字节),以此方式存储的图像称作8位图像,比double型(64位,8个字节),节省了存储空间。
**imread()**是将灰度图像存入一个8位矩阵;若为RGB图像时,就存入8位RGB矩阵中。如,彩色图像像素大小是400*300( 高 x 宽 ),则保存的数据矩阵为400x300x3,其中每个颜色通道值是处于0~255之间。
虽然matlab中读入图像的数据类型是uint8,但图像矩阵运算的时,使用的数据类型却是double类型。一是为了保证精度,二是因为如果不转换,在对uint8进行加减时会产生溢出。
1个字节无符号整型最大只能存储数据为255,对图片的操作所以很容易溢出。

2、unit8和im2unit8

  • uint8():简单地把一个变量类型转换成uint8类型,数值大小不变
  • im2unit8():把图像数据类型转换为unit8类型。如果输入图像是unit8类型的,返回的图像和源图像相同。如果源图像不是unit8类型的,该函数将返回和源图像相同但数据类型为uint8的图像。(必要时对图像进行调整)。
  • matlab默认double类型图片数据是位于0-1之间的,而uint8是位于0-255。
  • 如果矩阵数据图像是double类型(0-1之间)可直接im2uint8,这样不仅完成数据类型转换,而且将0-1之间映射为0~255之间的数据。
  • 如果图像矩阵数据是double类型的0-255,直接im2uint8转换的话,matlab会将大于1的数据都转换为255,将小于0的数据转换为0,0-1之间的数据才会映射到0~255之间整型的数据。

3、double和im2double

  • d = double():简单地把一个变量类型转换成double类型,数值大小不变,原本数据是0-255之间,转化后还是0~255。
  • d = im2double(img):将输入数据图像转换成double类型。
    如果图像img是double型的,d=img;
    如果图像是二值的logical或single型图像,d=double(img);
    如果图像是uint8型,d=double(img)/255,将其值归一化到0~1之间;
    如果图像是uint16型,d=double(img)/65535,将其值归一化到0~1之间。

4、mat2gray

实现图像矩阵的归一化操作,使矩阵的每个元素的值都在0和1之间。

  • I = mat2gray(A, [amin amax])
    将图像矩阵A中介于amin和amax的数据归一化处理, 其余小于amin的元素都变为0, 大于amax的元素都变为1。
  • I = mat2gray(A)
    将图像矩阵A归一化为图像矩阵I, 归一化后矩阵中每个元素的值都在0到1范围内(包括0和1)。类型为double型。其中0表示黑色,1表示白色。

5、imshow显示类型问题

imshow()显示图像时对double型是认为在0-1范围内,大于1时显示为白色,故对double类型的数据使用imshow进行显示时,有时会呈现一个白色图像(当double类型是数据在0-255范围时);而显示uint8型时是0-255范围。
解决方案:(针对double类型0-255数据的图像显示)

  • 归一化到0-1之间;
  • 将double类型的0~255数据转为uint8类型。
发布了12 篇原创文章 · 获赞 2 · 访问量 7744

猜你喜欢

转载自blog.csdn.net/denglavender/article/details/104479031
今日推荐