1. 图像数据格式
double(64位):matlab中数值一般采用double型存储和运算。
uint8(8位无符号整数):为了节省存储空间,matlab为图像提供的特殊数据类型。imread把灰度图像存入一个8位矩阵,当为RGB图像时,就存入8位RGB矩阵中,因此,matlab读入图像的数据是uint8.
2. 图像类型转换
matlab读入图像的数据是uint8,而matlab中数值一般采用double型(64位)存储和运算。所以要先将图像转为double格式的才能运算,区别如下:
img = imread('test.jpg'); % 读入是unit8型(0~255)数据
I1 = im2double(img); % 把图像转换成double精度类型(0~1)
I2 = double(img)/255; % uint8转换成double,作用同im2double
补充:
(1) im2double( )和double( )的区别。double( img)就是简单的数据类型转换,将无符号整型转换为双精度浮点型double,但是数据大小没有变化,原本数据是0-255之间,转化后还是0-255。例如原来是255,那么转换后为255.0,小数位0个数是由double数据长度决定,实际数据大小还是255,只不过这个255已经是double类型空间存储了,再增加不会发生溢出情况。而im2double(img)则不仅仅是将uint8转换到double类型,而且把数据大小从0-255映射到0-1区间。
(2)对double型数据进行im2double处理没有任何作用,即imdouble不会对double类型数据0-255映射到区间0-1
img = imread('test.jpg'); % 读入是unit8型(0~255)数据
I1 = im2double(img); % 把图像转换成double精度类型(0~1)
I2 = double(img)/255; % uint8转换成double,作用同im2double:
个人体会:在MATLAB中经过部分处理得到double型数据(0-1,如果灰度值超过1可能需要进行归一化操作),如果需要保存但是未来可能还有进一步的图像处理操作,建议将其以.mat矩阵形式保存而不是uint8,否则会大大损失图像精度(如果保存为uint8,下一次处理时有需要从uint8转换为double,在此过程中抹去了灰度值小数的有效数据位)。
3. matlab图像显示imshow类型问题
(1)imshow()显示double型
如果直接对double之间的数据矩阵I运行imshow(I),我们会发现有时候显示的是一个白色的图像。这是因为imshow()显示图像时对double型是认为在0-1范围内,即大于1时都是显示为白色,而imshow显示uint8型时是0-255范围。所以对double类型的图像显示的时候,要归一化到0-1之间。
(2)imshow()显示uint8型
对double类型的图像显示的时候,除了归一化到0-1之间,也可以将double类型的0-255数据转为uint8类型。
imshow(I/255); % 将图像矩阵转化到0-1之间
imshow(I,[]); % 自动调整数据的范围以便于显示
inshow(uint8(I)); % 转成uint8
补充:imshow()用法:imshow(I,[low high])
用指定的灰度范围 [low high]显示灰度图像I。显示结果,图像中灰度值等于或低于low的都将用黑色显示,而灰度值大于等于high的都显示为白色,介于low和high之间的用其灰度级的默认值的中间色调显示。如果你用了一个空矩阵([])来代替 [low high], imshow 函数将使用 [min(I(:))max(I(:))]作为第二个参数。