以1.jpg文件为例,进行简要说明。 首先输入图像:
f=imread('D:\Desktop\1.jpg');
灰度化命令有两种: 第一种:
I2=rgb2gray(I1);%灰度化
I3=double(I2);
I4=uint8(I3);%转换为uint8并显示
figure,imshow(I4)
显示结果如图:
uint8类型,值为0-255
第二种:
I5=im2double(I2);
figure,imshow(I5)
显示结果如图:
double类型,值为0-1
这时就会产生一个问题,两个不同的数据类型为什么会产生相同的图像呢? 我们先来查阅一下这几个函数的含义:
- I=rgb2gray(RGB) 将真彩色图像 RGB 转换为灰度图像 I。
- imshow(I) 显示图像 I
- double() 转换为双精度,仅仅转换类型,数值不变
- im2double(I) 将图像 I 转换为双精度,并进行归一化(类型和数值均发生变化)
原来,用rgb2gray 将彩色图像转换为灰度图像。matlab读入图像的数据是uint8,而matlab中数值一般采用double型(64位)存储和运算。所以要先将图像转为double格式的才能运算;imshow()显示图像时对double型是认为在0-1范围内即大于1时都是显示为白色,而imshow显示uint8型时是0-255范围。所以对double类型的图像显示的时候,要么归一化到0-1之间,要么将double类型的0-255数据转为uint8类型。
关于上面那个问题的答案也就迎刃而解了,如果图像要进行存储和运算就需要转换为double类型,而如果只进行显示,则0-255范围内的uint8或0-1范围内的double类型均可。
现在,我们再来看所有代码:
I2=rgb2gray(I1);%灰度化
I3=double(I2);
I4=uint8(I3);%转换为uint8并显示
figure,imshow(I4)
I5=im2double(I2);
figure,imshow(I5)
I1是读入的原始图像uint8类型,I2是灰度化后的0-255uint8类型,I3转换为double类型但未进行归一化,I4转换为uint8编码并进行输出;而第二种方法的I5是转化为double类型并归一化为0-1之间的类型。因此,虽然I4和I5类型不同,但其输出结果图像均相同。
【注】:这里可能会有人怀疑,第一种方案中为什么要转换为double再转换回uint8?这不是多此一举吗?这里声明一下,因为double类型适合matlab存储和运算,因此如果后面要进行运算,则需要对I3进行处理即可。
参考:https://blog.csdn.net/didi_ya/article/details/105428758
(未完待续。。。建议收藏)
参考:https://ww2.mathworks.cn/help/pdf_doc/matlab/matlab_refbook_zh_CN.pdf