例:imshow(I)
figure,imshow(I2) figure,imshow(I3)
当采用该方法时,创建的图形窗口初始化是空白的。
如果使用的是8位显示系统,那么必须确保调色板人口的总数不超过256。
注意:灰度图像总是使用调色板来进行显示的,所以这些图像所使用的颜色通道总数不能超
过256。
为了避免产生同时显示图像的不正确的显示结果:
1)可采用对调色板进行操作的方法,使之使用较少的颜色 2)将图像转换为RGB格式再进行显示
3)使用ind2rgb函数将索引图像转换为RGB图像:imshow(ind2rgb(X,map))
4)简单使用cat命令将一幅灰度图像显示为一幅RGB图像:imshow(cat(3,I,I,I))
可以采用两种方法将多幅图像显示在同一个单独的图形窗口中。 ①联合使用imshow函数和subplot函数; ②联合使用subimage函数和subplot函数;
subplot函数将一个图形窗口划分为多个显示区域,其语法格式为: subplot(m,n,p)
这种格式将图形窗口划分为m×n个矩形显示区域,并激活第p个显示区域。 例:如果希望并排显示两幅图像,可使用以下语句:
[X1,map1]=imread('forest.tif'); [X2,map2]=imread('trees.tif'); subplot(1,2,1),imshow(X1,map1); subplot(1,2,2),imshow(X2,map2);
若共享调色板出现的显示结果不令人满意,可以使用subimage函数来显示,也可以在装载图像时将所有图像映射到同一个调色板中,这个调色板不是共享调色板情况下所采用的某一幅图像的调色板,而是映射后包含所有图像调色板信息的一个新调色板。
subimage函数在显示图像之前首先将图像转换为RGB图像,因此不会出现调色板问题。该函数的语法格式为:
subimage(X,map) %在一个窗口里显示多个索引图像。 subimage(I) %在一个窗口里显示多个灰度图像。 subimage(RGB) %在一个窗口里显示多个真彩色图像。 subimage(x,y,?) %将图像按指定的坐标系(x,y)显示。
H=subimage(?) %返回图像对象的句柄,其中输入的图像可以是uint8或double类型。
以下代码将显示与上面同样的两幅图像,其程序清单为: [X1,map1]=imread('forest.tif'); [X2,map2]=imread('trees.tif'); subplot(1,2,1),subimage(X1,map1); subplot(1,2,2),subimage(X2,map2);
3.3.3图像显示中的常见问题
(1)彩色图像显示为灰度图像
图像可能是一幅索引图像,这就意味显示这幅图像需要一个调色板。产生这个问题的原因可能是在装载索引图像时函数的调用方法不正确,正确调用格式如下:
[X,map]=imread('filename.ext');
另外,还有注意使用imshow函数的正确形式: imshow(X,map);
(2)二值图像显示为全黑图像
使用islogical或whos命令检查该图像矩阵的逻辑标志是否置为on。如果图像是逻辑的,那么whos命令将在类型头部单词array后面显示logical。如果二值图像是自己创建的,那么产生这个问题的原因可能是图像类型为uint8,记住uint8类型有灰度图像变换范围是[0,255],而不是[0,1]。
(3)装载的是多帧图像,但是MATLAB却仅仅显示一帧图像
必须单独装载多帧图像的每一帧,可以使用一个for循环来实现。可以先调用imfinfo函数获知图像帧数和图像维数。
3.4 图像运算 3.4.1图像的点运算
点运算(对比度增强、对比度拉伸、灰度变换):是一种通过对图像中的每个像素(即像素点上
的灰度值)进行计算,从而改善图像显示效果的操作。
点运算常用于改变图像的灰度范围及分布,是图像数字化及图像显示的重要工具。 典型的点运算应用包括: ①光度学标定:通过对图像传感器的非线性特性做出补偿来反映某些物理特性,如光照强度、
光密度等;
②对比度增强:调整图像的亮度、对比度,以便观察;
③显示标定:利用点运算使得图像在显示时能够突出所有用户感兴趣的特征; ④图像分割:为图像添加轮廓线,通常被用来辅助后续运算中的边界检测; ⑤图像裁剪:将输出图像的灰度级限制在可用范围。
MATLAB图像处理工具箱没有提供对图像进行直接点运算的函数,而将图像的点运算过程直接集成在某些图像处理函数组中(如:直方图均衡化函数histeq和imhist)。如果用户仅仅是希望对图像进行点运算处理,那么可充分利用MATTAB强大的矩阵运算能力,对图像数据矩阵调用各种MATLAB计算函数进行处理。
*例:将灰度图像使用的灰度变换函数进行线性点运算的程序清单: rice=imread('rice.tif'); I=double(rice); J=I*0.43+60; rice2=uint8(J);
subplot(1,2,1),imshow(rice); subplot(1,2,2),imshow(rice2);
3.4.2 图像的代数运算
图像的代数运算:是图像的标准算术操作的实现方法,是两幅输入图像之间进行点对点的加、减、乘、除运算后得到输出图像的过程。
MATLAB图像处理工具箱包含了一个能够实现所有非稀疏数值数据的算术操作的函数
集合。
使用图像处理工具箱中的图像代数运算函数无须再进行数据类型间的转换,这些函数能够接受8位无符号类型或16位无符号类型数据,并返回相同格式的图像结果。
值得注意的是:无论进行哪一种代数运算都要保证输入图像的大小相等,且类型相同。 针对代数运算的结果很容易超出数据类型允许的范围,图像的代数运算函数使用了以下截取规则使运算结果符合数据范围的要求:超出范围的整数数据将被截取为数据范围的极值,分数结果将被四舍五入。
(1)图像的加法运算
图像相加一般用于对同一场景的多幅图像求平均效果(平均是指效果而言,并非算术平均),以便有效地降低具有叠加性质的随机噪声。
MATLAB中的imadd函数用于进行两幅图像的加法或给一幅图像加上一个常数。该函数将某一幅输入图像的每一个像素值与另一幅图像相应的像素值相加,返回相应的像素之和作为输出图像。其调用格式为:
Z=imadd(X,Y)
其中,X和Y表示需要相加的两幅图像,返回值Z表示得到的加法操作结果。两幅图像的像素值相加时产生的结果很可能超过图像数据类型所支持的最大值(称为溢出),当数据发生溢出时,该函数将数据截取为数据类型所支持的最大值,这种截取效果称之为饱和,为了避免这种现象出现,在进行加法计算前最好将图像类型转换为一种数据范围较宽的数据类型。 例:两幅图像叠加 I=imread('rice.png');
J=imread('cameraman.tif'); subplot(1,3,1),imshow(I); subplot(1,3,2),imshow(J); K=imadd(I,J);
subplot(1,3,3),imshow(K);
若不是两幅图像相加,而是给图像的每一个像素加上一个常数(使图像的亮度增加),同样可以采用imadd函数。 *例:RGB图像增加亮度 RGB1=imread('flower.tif'); RGB2=imadd(RGB1,50);
subplot(1,2,1),imshow(RGB1); subplot(1,2,2),imshow(RGB2);
RGB1=imread('rice.png'); RGB2=imadd(RGB1,50);
subplot(1,2,1),imshow(RGB1); subplot(1,2,2),imshow(RGB2);
(2)图像的减法运算
图像减法也称为差分方法,是一种常用于检测图像变化及运动物体的图像处理方法。 在MATLAB中,imsubtract函数用来将一幅图像从另一幅输入图像中减去或从一幅图像中减去一个常数。该函数将一幅图像的像素值从另一幅输入图像相应的像素值中减去,再将相应的像素值之差作为输出图像相应的像素值。该函数的调用格式为:
Z=imsubtract(X,Y)
其中,Z是输入图像X与输入图像Y相减的结果。
减法操作时有时会导致某些像素变为一个负数,此时,该函数自动将这些负数截取为0。为了避免差值产生负值及像素值运算结果之间产生差异,可以调用imabsdiff函数,该函数将计算两幅图像相应像素差值的绝对值,其调用格式与imsubtract函数类似。
例:根据原始图像生成其背景亮度图像,然后再从原始图像中将背景亮度图像减去 rice=imread('rice.png');
background=imopen(rice,strel('disk',15)); rice2=imsubtract(rice,background); subplot(1,2,1),imshow(rice); subplot(1,2,2),imshow(rice2);
若希望从图像数据I的每一像素中减去一个常数,可以将上述调用格式中的Y替换为一个指定的常数值,如:Z=imsubtract(I,50)
(3)图像的乘法运算
两幅图像进行乘法运算可以实现掩模操作,即屏蔽掉图像的某些部分。一幅图像乘以一个常数通常称为缩放。缩放通常将产生比简单添加像偏移量自然得多的明暗效果。如果使用的缩放因数大于1,那么将增强图像的亮度,如果因数小于1,则会使图像变暗。
在MATLAAB中,使用immultiply函数实现两幅图形的乘法。该函数将两幅图像相应的像素值进行元素对元素的乘法,并将乘法的运算结果作为输出图像相应的像素值。其操作时将产生溢出现象,为了避免该现象产生,在执行前可将图像类型转换为一种数据范围较宽的数据类型。该函数的调用格式为:
Z=immultiply(X,Y) 其中,Z=X*Y。
例:使用给定的缩放因数对moon.tif的图像进行缩放的程序清单: I=imread('moon.tif'); J=immultiply(I,1.2);
subplot(1,2,1),imshow(I); subplot(1,2,2),imshow(J);
(4)图像的除法运算
图像除法运算又称为比率变换,给出的是相应像素值的变化比率,而不是每个像素的绝对差异,可用于校正成像设备的非线性影响。
在MATLAB中使用imdivide函数进行两幅图像的除法,该函数对两幅输入图像的所有相应像素执行元素对元素的除法操作,并将得到的结果作为输出图像的相应像素值。其调用格式为:
Z=imdivide(X,Y) 其中,Z=X/Y。
例:将rice.tif的两幅图像进行除法运算的程序清单: rice=imread('rice.png');
background=imopen(rice,strel('disk',15)); rice2=imsubtract(rice,background); subplot(1,3,1),imshow(rice); subplot(1,3,2),imshow(rice2); Ip=imdivide(rice,rice2); subplot(1,3,3),imshow(Ip);
(5)图像的四则代数运算
执行图像四则代数运算操作较好的一个办法是使用函数imlincomb,该函数按照双精度执行所有代数运算操作,而且仅对最后的输出结果进行截取,其调用格式为:
Z=imlincomb(A,X,B,Y,C)
其中,Z=A*X+B*Y+C。MATLAB会自动根据输入参数判断需要进行的运算。
3.4.3 图像几何运算
在处理图像的过程中,有时需要对图像的大小和几何关系进行调整,如:对图像进行缩放及旋转,这时图像中每个像素的值都要发生变化。数字图像的坐标是整数,经过这些变换之后的坐标不一定是整数,因此要对变换之后的整数坐标位置的像素值进行估计。
MATLAB提供了一些函数实现这些功能。这些函数支持所有的图像类型,可实现对图像进行缩放、旋转、裁剪等几何操作。
(1)图像的插值
插值是常用的数学运算,通常是利用曲线拟合的方法,通过离散的采样点建立一个连续函数来逼近真实曲线,用这个重建的函数便可求出任意的函数值。
设已知函数值为?1,?2,?,则未知点x的函数值通过插值可以表示为:
f?x????ih?x?xi?
i?1L其中h(?)为插值核函数,?i为权系数。插值算法的数值精度及计算量与插值核函数有关,插值核函数的设计是插值算法的核心。
MATLAB中的imresize函数和imrotate函数用于二维图像的插值。MATLAB影像处理工具箱提供了三种插值方法:
①最近邻插值(nearest neighbor interpolation) ②双线性插值(bilinear interpolation) ③双立方插值(bicubic interpolation)
1)最近邻插值:是最简单的插值,在这种算法中,每一个插值输出像素的值就是在输入图像中与其最临近的采样点的值。该算法的数学表示为:
11f?x??f?xk??xk?1?xk??x??xk?xk?1?
22最近邻插值是工具箱函数默认使用的插值方法,而且这种插值方法的运算量非常小。对于索引图像来说,它是惟一可行的方法。不过,最近邻插值法的值核频域特性不好,从它的傅立叶谱上可以看出,它与理想低通滤波器的性质相差较大。当图像含有精细内容,也就是高频分量时,用这种方法实现倍数放大处理,在图像中可以明显看出块状效应。
2)双线性插值:该方法输出像素值是它在输入图像中2×2邻域采样点的平均值,它根据某像素周围4个像素的灰度值在水平和垂直两个方向上对其插值。
3)双立方插值:该种插值核为三次函数,其插值邻域的大小为4×4。它的插值效果比较好,但相应的计算量较大。
这三种插值方法的运算方式基本类似。对于每一种来说,为了确定插值像素点的数值,必须在输入图像中查找到与输出像素相对应的点。这三种插值方法的区别在于其对像素点赋值的不同。其中近邻插值输出像素的赋值为当前点的像素点;双线性插值输出像素的赋值为