4.2 图像平移
图像平移就是将图像中所有的点按照指定的平移量水平或者垂直移动。
4.2.1 图像平移的变换公式
设(x0,y0)为原图像上的一点,图像水平平移量为tx,垂直平移量为ty,如图 4.2所示。
▲图4.2 平移变换坐标图
则平移之后的点坐标(x1,y1)变为
用矩阵表示为
对变换矩阵求逆,可以得到逆变换
即
这样,平移后的目标图像中的每一点都可以在原图像中找到对应的点。例如,对于新图中的(i, j)像素,代入上面的方程组,可以求出对应原图中的像素(i-tx,j-ty)。而此时如果tx大于i或ty大于j,则点(i-tx,j-ty)超出了原图的范围,可以直接将它的像素值统一设置为0或者255。
对于原图中被移出图像显示区域的点通常也有两种处理方法,可以直接丢弃,也可以通过适当增加目标图像的尺寸(将新生成的图像宽度增加tx,高度增加ty)的方法使得新图像中能够包含这些点。在稍后给出的程序实现中,我们采用了第一种处理方法。
4.2.2 图像平移的Matlab实现
imtransform 函数用于完成一般的二维空间变换,本章后续介绍的很多几何变换都可以通过该函数来实现,原型如下。
B = imtransform(A,TFORM,method);
● 参数A为要进行几何变换的图像。
● 空间变换结构TFORM指定了具体的变换类型。
● 可选参数method允许为imtransform函数选择插值方法,其合法值如表4.1所示。
表4.1 合法值
这些插值方式的具体含义请参见4.7节。默认时为双线性插值 —'bilinear'。
函数输出B为经imtransform变换后的目标图像。
可以通过两种方法来创建TFORM结构,即使用maketform函数和cp2tform函数。cp2tform是一个数据拟合函数,它需要原图像与目标图像之间的对应点对作为输入,用于确定基于控制点对的几何变换关系,我们将在 4.8 节图像配准中对它进行介绍,这里仅给出使用 maketform 函数获得TFORM结构的方法。
T=maketform(transformtype, Matrix);
● 参数transformtype指定了变换的类型,如常见的'affine'为二维或多维仿射变换,包括平移、旋转、比例、拉伸和错切等。
● Matrix为相应的仿射变换矩阵,例如对于平移变换,该矩阵为 。
使用imtransform函数实现图像平移的方法如例4.1所示。
[例4.1]图像平移
本例将图像平移的实现封装在 imMove()函数中,读者可以在金羽图书论坛( http://bbs. book95.com)的“金羽图书与答疑”板块与本书同名的主题帖子附件的“chapter3/code/imMove.m”中找到它。
function I_out = imMove(I, tx, ty)
% 平移变换
% 输入:I - 输入图像
% tx- 水平方向平移量
% ty- 竖直方向平移量
% 输出:I_out - 输出图像
tform = maketform('affine',[1 0 0;0 1 0; txty1]);
%定义平移变换矩阵
I_out = imtransform(I,tform,'XData',[1 size(I,2)],'YData',[1 size(I,1)]); %图像平移
subplot(1,2,1),imshow(I);
title('原图像');
subplot(1,2,2),imshow(I_out);
title('平移图像');
注意
由于平移变换前后的 2 幅图像像素本身及其关系并无变化,导致与输入图像相同尺寸的输出图像I_out在显示时与输入图像I没有任何差别。在imtransform函数中加入了XData和YData选项可以解决之一问题。本章后续的一些几何变换则不需要使用XData与YData选项。
下面的命令调用imMove()函数后的平移效果如图4.3所示,注意到对于映射在原图像之外的点算法直接采用黑色(0)填充,并丢弃了变换后目标图像中被移出图像显示区域的像素。
I_out = imMove(I, 10, 30); %水平方向平移10个像素,竖直方向平移30个像素
▲图4.3 平移变换效果