8.2  图像的几何运算

本节介绍一种图像的基本变换,即几何变换。它主要是改变图像中物体(像素)之间的空间关系,可以看成将各像素在图像内移动的过程。几何变换通常包括图像的平移、图像的镜像变换、图像的转置、图像的缩放和图像的旋转等。

8.2.1  图像的平移

图像平移就是将图像中所有的点都按照指定的平移量水平、垂直移动。如图8-9所示,设(x0,y0)为原图像上的一点,图像水平平移量为tx,垂直平移量为ty,则平移后点(x0,y0)坐标将变成(x1,y1)。

在MATLAB中,可以使用函数translate来实现图像的平移。其调用语法为:SE2 = translate(SE,V)。其中,SE为一个模板,使用函数strel来创建,V是一个向量,用来指定平移的方向。

【例8-8】  在水平和竖直方向移动图像。

I = imread('football.jpg');

se = translate(strel(1), [30 30]);  %  向下和向右移动30个位置

J = imdilate(I,se);                  %  利用膨胀函数平移图像

subplot(121);imshow(I), title('原图')

subplot(122), imshow(J), title('移动后的图像');

运行的结果如图8-10所示。

图8-9  图像中点的平移

图8-10  图像的平移

8.2.2  图像的镜像变换

图像的镜像变换分为两种:一种是水平镜像,另一种是垂直镜像。图像的水平镜像操作是将图像左半部分和右半部分以图像垂直中轴线为中心镜像进行变换,图像的垂直镜像操作是将图像上半部分和下半部分以图像水平中轴线为中心镜像进行变换。

【例8-9】  对图像分别进行水平镜像和垂直镜像变换。

对图像进行水平镜像和垂直镜像变换是通过对图像的像素数据做变换实现的。使用函数fliplr和flipud对像素矩阵进行水平和垂直反转,就可以完成图像的镜像变换。

I = imread('cameraman.tif');

Flip1=fliplr(I);               %  对矩阵I左右反转

subplot(131);imshow(I);title('原图');

subplot(132);imshow(Flip1);title('水平镜像');

Flip2=flipud(I);               %  对矩阵I垂直反转

subplot(133);imshow(Flip2);title('竖直镜像');

运行的结果如图8-11所示。

图8-11  图像的镜像变换

8.2.3  图像缩放

上面介绍的几种图像几何变换都是1∶1不改变图像比例的变换,本小节介绍的图像变换将涉及图像的缩放。这些操作产生的图像中的像素可能在原图中找不到相应的像素点,这样就必须进行近似处理。一般的方法是直接赋值为和它最相近的像素值,也可以通过一些插值算法来计算。后者处理的效果要好些,但是运算量也相应地会增加很多。

MATLAB提供了imresize函数用于改变图像的尺寸,其调用语法如下。

(1)B = imresize(A,m,method):使用由参数method指定的插值元素来改变图像的尺寸,m为缩放比例,如果m大于1那么就是放大,如果m小于1大于0那么就是缩小。method的值可选择,其中nearest为邻近点插值,bilinear为双线性插值,bicubic(默认)为双三次插值。

(2)B = imresize(A,[mrows ncols],method) :返回一个指定行列的图像,[mrows ncols]用来指定B的行数和列数。若行列比例和原图不一致,输出图像就会变形。

【例8-10】  图像缩放示例。

本例中的rice.png和trees.tif为系统自带的测试图片。

I = imread('rice.png');

J = imresize(I, 0.5);                    %  缩小

figure, imshow(I), figure, imshow(J)

[X, map] = imread('trees.tif');

[Y, newmap] = imresize(X, map, 0.5);      %  索引图像的缩小

figure, imshow(X,map)

figure, imshow(Y, newmap)

运行的结果如图8-12和图8-13所示。

图8-12  图像的缩放图

8-13  索引图像的缩放

8.2.4  图像的旋转

旋转通常的做法是以图像的中心为圆心旋转。MATLAB提供了imrotate函数用于实现图像的旋转。该函数调用语法如下。

(1)B = imrotate(A,angle):将图像A绕中心按照指定角度angle向逆时针方向旋转,如果需要顺时针旋转,那么只需要将角度值设置为负数即可。

(2)B = imrotate(A,angle,method):method用来指定插值的方法,nearest(默认)为邻近点插值,bilinear为双线性插值,bicubic为双三次插值。

(3)B = imrotate(A,angle,method,bbox):bbox用来指定返回图像的大小。bbox有两种取值:crop,返回图像与原来图像一样大小,多余部分将会被裁剪掉;loose(默认),包括整个旋转后的图像,通常比原图像大。

【例8-11】  图像旋转示例。

I=imread('cameraman.tif');

%  双线性插值法旋转图像,并裁剪图像,使其和原图像大小一致

B=imrotate(I,60,'bilinear','crop');

subplot(121),imshow(I),title('原图');

subplot(122),imshow(B),title('旋转图像60^{o},并剪切图像');

运行的结果如图8-14所示。

图8-14  图像的旋转

8.2.5  图像的剪切

对于要处理的图像,用户可能只关心图像的一部分内容,而不是整个图像。如果对整个图像进行处理,不仅要花费大量的时间,而且图像的其他部分可能会影响处理的效果,所以这时就要剪切出所要关心的部分图像,这样可以大大地提高处理的效率。MATLAB提供了imcrop函数用来实现图像的剪切,其调用语法如下。

(1)I2=imcrop(I)、I2=imcrop(X,map)和RGB2 = imcrop(RGB)是交互式的剪切操作,分别对灰度图像、索引图像和真彩色图像进行区域剪切。程序运行时,等待鼠标选定矩形区域进行剪切。

(2)I2 = imcrop(I,rect)、X2 = imcrop(X,map,rect)和RGB2 = imcrop(RGB,rect)分别对指定的矩形区域rect进行剪切操作。

【例8-12】  图像剪切示例。

I = imread('circuit.tif');

I2 = imcrop(I,[75 68 130 112]);         %  [75 68 130 112]为剪切区域

imshow(I), figure, imshow(I2)

运行的结果如图8-15所示。

图8-15  图像的剪切