2021/12/3
matlab图像类型转换 uint8 、double、im2double、im2uint8、mat2gray
- matlab图像保存说明
matlab中读取图片后保存的数据是uint8类型(8位无符号整数,即1个字节),以此方式存储的图像称作8位图像,好处相比较默认matlab数据类型双精度浮点double(64位,8个字节),自然可以节省很大一部分存储空间。
详细来说imread把灰度图像存入一个8位矩阵,当为RGB图像时,就存入8位RGB矩阵中。例如,彩色图像像素大小是400*300( 高 * 宽 ),则保存的数据矩阵为400×300×3,其中每个颜色通道值是处于0~255之间。
但是虽然matlab中读入图像的数据类型是uint8,而在图像矩阵运算的时候,使用的数据类型却是double类型 。一是为了保证精度,二是因为如果不转换,在对uint8进行加减时会产生溢出,(1个字节无符号整型最大只能存储数据为255,对图片的操作所以很容易溢出。)
————————————————
原文链接:https://blog.csdn.net/fx677588/article/details/53301740
1.
img = imread('./1.jpg');
I1 = double(img);
I2 = im2double(I2); % I2数据依然是0~255,并不是0~1,即I1=I2
%%
%% 函数im2double将输入转换成double类型。如果输入是uint8、unit16 或者是二值的logical类型,则函数im2double 将其值归一化到0~1之间,当然就是double类型的了。如果输入本身就是double类型,输出还是double类型,并不进行映射
2.
img = imread('./1.jpg');
I1 = double(img);
I2 = im2double(img);
I2 = I1/255;
- imshow()显示图像
imshow()显示图像时对double型是认为在0~1范围内,即大于1时都是显示为白色;
imshow显示uint8型时是0~255范围。
对double类型的图像显示的时候,要么归一化到0~1之间,要么将double类型的0~255数据转为uint8类型
1. 图像是double类型(0~1之间)可直接im2uint8,不仅完成数据类型转换,而且将0~1之间映射为了0~255之间的数据。
2. 图像矩阵数据是double类型的0~255,直接im2uint8转换的话,matlab会将大于1的数据都转换为255,0~1之间的数据才会映射到0~255之间整型的数据
3.mat2gray()和im2double()区别
这两个如果都是对uint8数据操作,区别就在于前者是归一化操作,归一化后也在0~1之间,自然结果也是double类型,后者是将数据从0-255映射到0-1(即所有数都/255)。例如:
归一化:
I
−
m
i
n
(
I
)
m
a
x
(
I
)
−
m
i
n
(
I
)
\frac{I - min (I)}{max(I) - min (I)}
max(I)−min(I)I−min(I)
3.
I = uint8([1,1,2,3]);
I1 = mat2gray(I); % 归一化,I1结果是double型[0,0,0.5,1]
I2 = im2double(I); % 映射化,I2结果是double型[0.0039,0.0039,0.0078,0.0118]