图像的几何变换又称为图像空间变换,它将一幅图像中的坐标位置映射到另一幅图像中的新生位置。几何变换不改变图像的像素值,只是在图像平面上进行像素的重新安排。
一个几何变换需要两部分运算,首先是空间变换所需的运算,如平移、旋转、镜像等,需要用它来表示输出图像和输入图像之间的像素映射关系;此外,还需要灰度差值算法,因为这种变换关系进行计算出的输出图像的像素很可能被映射到非整数坐标上。
图像平移
图像平移就是将图像中所有的点按照指定的平移量水平或者垂直移动。
变换公式:设(x0,y0)为原图像上的一点,图像水平平移量为Tx,垂直平移量为Ty,则平移后的点坐标(x1,y1)变为 x1=x0-Tx; y1=y0-Ty
matlab实现:
>> A=imread('test.bmp');
>> se=translate(strel(1),[80,50]);
>> B=imdilate(A,se);
>> subplot(1,2,1),imshow(A);
>> subplot(1,2,2),imshow(B);
图像镜像
镜像变换分为水平镜像和竖直镜像。水平镜像即为图像左半部分和右半部分以图像竖直中心线为中心轴进行对换;而竖直镜像则是将图像上半部分和下半部分以图像水平中轴线进行对换。
matlab实现:
matlab中的imtransform()函数用于完成一般的二维空间变换,形式如下,
B=imtransform(A,TFORM,method)
- 参数A为要进行几何变换的图像;
- 空间变换结构TFORM指定了具体的变换类型;
- 可选参数method允许为imtransform()函数选择的插值方法;
合法值 | 含义 |
---|---|
‘bicubic’ | 三次插值 |
‘bilinear’ | 双线性插值 |
‘nearest’ | 最近邻插值 |
- 一般默认为双线性插值;
对于TFORM结构,可以使用maketform()函数和cp2tform()函数来进行创建。cp2tform函数是一个数据拟合函数,需要原图像和目标图像之间对应的点对儿作为输入,用于确定基于控制点对儿的集合变换关系,这里先仅介绍使用maketform()函数获得TFORM结构的方法。
T=maketform(transformtype,Matrix);
- 参数transformtype指定了变换的类型,如常见的‘affine’为二维火多维仿射变换,包括平移、旋转、比例、拉伸、错切等;
- Matrix为相应的仿射变换矩阵。
示例:镜像变换
>> A=imread('test.bmp');
>> [height.width.dim]=size(A);
>> [height,width,dim]=size(A);
>> tform=maketform('affine',[-1 0 0;0 1 0;width 0 1]);
>> %定义水平镜像变换矩阵
>> B=imtransform(A,tform,'nearest');
>> imshow(B)
>> tform2=maketform('affine',[1 0 0;0 -1 0;0 height 1]);
>> C=imtransform(A,tform2,'nearest');
>> subplot(1,3,1),imshow(A);
>> subplot(1,3,2),imshow(B);
>> subplot(1,3,3),imshow(C);
图像转置
图像的转置是将图像的x坐标与图像的y坐标进行互换,图像的大小会随之改变——高度和宽度将会互换。
matlab实现:
>> %图像转置
>> A=imread('test.bmp');
>> tform=maketform('affine',[0 1 0;1 0 0;0 0 1]);
>> %定义转置矩阵
>> B=imtransform(A,tform,'nearest');
>> subplot(1,2,1),imshow(A);
>> subplot(1,2,2),imshow(B);
图像缩放
图像缩放是指图像大小按照指定的比率进行放大或者缩小。假设图像x轴方向的缩放比率是Sx,y轴方向的缩放比率是Sy,直接根据缩放公式计算得到的目标图像中,有些映射原坐标可能不是整数,从而找不到对应的像素位置。例如,当Sx=Sy=2时,图像放大两倍,放大图像中像素(0,1)就对应着原图像中的(0,0.5),并不是整数坐标位置,因此也无法提取其灰度值。
这里就必须进行某种近似处理,一种简单的策略就是直接将它最邻近的整数坐标位置(0,0)或者(0,1)的像素值赋给它,这就是所谓的最近邻插值。
matlab实现:
matlab中仍可以用之前的imtransform()函数进行实现,如下,
>> A=imread('test.bmp');
>> tform=maketform('affine',[0.5 0 0;0 0.5 0; 0 0 1]); %定义相应的缩放变换矩阵
>> B=imtransform(A,tform,'nearest');
>> subplot(1,2,1),imshow(A);
>> subplot(1,2,2),imshow(B);
>> imshow(A);
>> figure
>> imshow(B);
matlab中还有专门的图像缩放函数imresize(),调用形式如下,
B=imresize(A,Scale,method);
- 参数A为要进行缩放的原始图像;
- Scale为缩放比例;
- method为插值方法,默认为最近邻插值,合法取值同imtransform()函数。
示例:
>> A=imread('test.bmp');
>> B=imresize(A,0.5,'nearest');
>> figure,imshow(A),title('原图像');
>> figure,imshow(B),title('缩放0.5倍后的图像');
图像旋转
图像旋转一般是指将图像围绕某一指定点旋转一定的角度。旋转的时候通常也会改变图像的大小,可以采用和图像平移相同的策略,即转出显示区域的图像进行截去,也可以改变输出图像的大小从而扩展显示范围。
假设点P(x0,y0)绕原点逆时针旋转角度θ到点P1(x1,y1)。令L=|OP|=√x²+y²,则有:sinα=y0/L,cosα=x0/L,到达P1点后,则有:sin(α+θ)=y1/L=cosαsinθ+sinαcosθ,cos(α+θ)=x1/L=cosθcoxα-sinθsinα
则,令L=1,则cosα=x0,sinα=y0,于是有,
x1=cosθx0-sinθy0,y1=cosθy0+sinθx0
tip:图像旋转变换的效果受具体插值方法影响比较明显,这里采用最邻近插值。
matlab实现:
matlab中有专门围绕图像中心的旋转变换函数imrotate(),调用方式如下,
B=imrotate(A,angle,method,'crop');
- A是待处理图像;
- angle为旋转角度,单位为度,若指定为一个正值,则按照逆时针旋转相应度数;
- method为插值方法;
- ‘crop’选项会裁剪旋转后增大的图像,使得到的图像与原图大小一致。
具体示例:
>> A=imread('test.bmp');
>> B=imrotate(A,60,'nearest');
>> C=imrotate(A,60,'nearest','crop');
>> figure,imshow(A),title('原图像');
>> figure,imshow(B),title('旋转60度后的图像');
>> figure,imshow(C),title('旋转60度后并裁剪的图像');