其他MATLAB数字图像处理的相关内容
MATLAB求图像的均值、中值、众数、方差、协方差、相关系数
MATLAB图像imshow函数显示问题、uint8与double类型转换、自定义图像显示函数
前言
在图像处理中,我们需要显示图像来查看效果,所以我对我在显示图像时遇见的一些问题进行了总结。
提示:以下是本篇文章正文内容
一、图像显示问题说明
1.说明
在我对图像进行线性拉伸时,发现将一些图像拉伸到0~255后无法正常显示,通过阅读相关文章终于明白了是什么原因。
MATLAB储存图像时一般会使用 uint8类型 (1个字节无符号整数,值在0~255之间),使用uint8类型可以起到节省存储空间的作用,但是由于uint8类型在0-255中间,所以在进行算术运算时很容易溢出,我们在进行算数运算前需要把uint8类型转换为double类型。
有一些图像不是以uint8类型储存的,而是直接以double类型储存的,或者我们为了进行运算把uint8类型转换为double类型还没有转换回去,这时如果我们想用 imshow() 函数来显示图像就会有一些要求。
当我们使用imshow()函数来显示图像时,如果这个时候的图像矩阵的数据类型是double类型。如果直接运行imshow(img),这时显示的图像可能是一个纯白色的图像。
这是因为imshow()显示图像时,默认double类型的值都在0-1范围内,所以这个时候大于1时都会显示为白色,imshow()显示uint8类型时是0-255范围。
如果我们想要double型数据的图像正常显示:①需要把他的范围拉伸到0-1,②或者将范围在0-255之间的double类型数据转换为uint8类型数据,就可以看到正常显示的数据了。
2.案例展示
先读入下面文件
a=imread('原图像.jpg');
可以看到这张图像是以uint8类型储存的
这时候我们直接使用imshow()函数,图像可以正常显示
这时候我们读入另外一张图像(由于过大无法上传)
b=imread('南京.jpg');
可以发现数据的范围在0-1之间,这时我们调用imshow()函数,图也像可以正常显示。
这时候我们把0-1的图像拉伸到0-255(使用的函数是自己写的后面会发出来),然后再使用imshow函数可以发现,图像显示为全白色。
c=xianxinglashen(b,0,255);%将b的范围拉伸到0-255
imshow(c);
显示图像,可以发现图像为纯白色
二、图像类型转换
我们通过使用MATLAB自带的函数就可以完成图像类型的转换
a = imread('原图像.jpg'); % 读入unit8类型(值在0~255之间)的数据
b = double(a)/255; % 将uint8类型转换成double类型,并且把范围限制在0~1之间
c = im2double(a); % 直接把图像转换成double类型并且值在0~1之间,相当用一个函数完成上面的操作
使用double(a)是最普通的数据类型转换,将无符号整型转换为双精度浮点型double,不会改变数据值的大小,原本数据是0-255之间,转化后还是0-255。
使用im2double(img)则除了将uint8转换到double类型外,还会把数据大小从0-255区间映射到0-1区间。
其他转换函数
uint8(a); % 将数据类型转成uint8类型
im2double(); % 将图像数组转换成double精度类型
im2uint8(); % 将图像数组转换成unit8类型
im2uint16(); % 将图像数组转换成unit16类型
同样的,uint8()函数是最普通的数据类型转换,不会改变数据值的大小,会对数字进行自动取整,单独使用时需要注意,double的值是否是0-255;
而如果矩阵数据图像是double类型(并且范围0-1之间),这是使用im2uint8(),不仅可以完成数据类型转换,还将0-1之间的数据映射到0-255之间的数据。
但是这是又有新的问题,如果此时图像矩阵数据是double类型且范围在0-255之间,这是使用im2uint8函数转换,matlab会将大于1的数据都转换为255,所以这时应该使用uint8()函数。
三、自定义显示函数
为了适应多种类型图像的显示,我自己写了一个自定义的展示函数来解决问题。
1.函数代码
这里我选择把所有值转换为double类型并且归一化。(如果想处理多个波段根据下面的函数改写即可)
代码如下(示例):
function [ x ] = show1( a )
%a为单波段图像的图像矩阵
a=double(a);
b=a(:);
[r,c]=size(a);
ma=max(b);
mi=min(b);
for i=1:r
for j=1:c
a(i,j)=a(i,j)/(ma-mi);
end
end
x=a;
imshow(x);
end
2.函数调用
代码如下(示例):
b=imread('南京.jpg');
c=xianxinglashen(b,0,255);
show1(c);
图像可以正常显示了
总结
文章中的内容时在完成作业过程中通过各种途径学习到的,还存在很多问题和不足,希望能够逐步完善。