【四】图像的几何变换

1 整体思路

整体上可分为两个部分,一是对图像进行平移、旋转等,二是在变换后可能要进行灰度插值,保证图像能够完整显示。

2 图像的平移

对每个像素平移相同的位移量,缺失的就用插值补充。(一般默认为双线性插值,也可设为最近邻插值或双三次插值)

Matlab实现
imMove.m

function I_out = imMove(I,Tx,Ty)
%平移变换
%输入:I - 输入图像
%     Tx - 水平方向平移量
%     Ty - 数值方向平移量
%输出:T_out - 输出图像

tform = maketform('affine',[1 0 0;0 1 0;Tx Ty 1]);
%定义平移变换矩阵

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('平移图像');

主程序

I = imread('pout.tif');
I_out = imMove(I,10,20);

在这里插入图片描述

3 图像镜像

镜像分为水平镜像和竖直镜像,水平镜像就是左右两部分图像以竖直中线为中心轴进行对换,竖直镜像就是上下两部分图像以水平中线为中心轴进行对换。

Matlab实现

A = imread('pout.tif');
[height,width,dim] = size(A);%各值分别对应每个维度的长度

%水平镜像
tform = maketform('affine',[-1 0 0;0 1 0;width 0 1]);
B = imtransform(A,tform,'nearest');

%竖直镜像
tform2 = maketform('affine',[1 0 0;0 -1 0;0 height 1]);
C = imtransform(A,tform2,'nearest');

subplot(1,3,1),imshow(A);
title('原图像');
subplot(1,3,2),imshow(B);
title('水平镜像');
subplot(1,3,3),imshow(C);
title('竖直镜像');

在这里插入图片描述

4 图像反转

对于图像来说,就是x,y坐标互换。
对于矩阵来说,就是求转置矩阵。

Matlab实现

A = imread('pout.tif');
tform = maketform('affine',[0 1 0;1 0 0;0 0 1]);
B = imtransform(A,tform,'nearest');

subplot(1,2,1),imshow(A);
title('原图像');
subplot(1,2,2),imshow(B);
title('图像转置');

在这里插入图片描述

5 图像缩放

图像缩放就是图像按照给定的比率放大或缩小(水平和竖直方向可以有不同的缩放比率)

Matlab实现

A = imread('pout.tif');
B = imresize(A,1.5,'nearest');
figure,imshow(A),title('原图像');
figure,imshow(B),title('图像缩放');

在这里插入图片描述

6 图像旋转

以某点为中心进行旋转。

Matlab实现

A = imread('pout.tif');
%最近邻插值法逆旋转30度,并剪切图像
B = imrotate(A,30,'nearest','crop');
subplot(1,2,1),imshow(A);
title('原图像');
subplot(1,2,2),imshow(B);
title('逆时针旋转30度');

在这里插入图片描述

7 插值算法

插值算法就是输出反映射到输入的时候,原输入没有的值就需要根据附近的值进行近似。

最近邻插值:最简单的插值算法,输出直接采用距输入最邻近的采样点的灰度值。

双线性插值:输出值为输入图像中距离最近的2*2邻域内灰度值的加权平均。

高阶插值:这个可以理解是双线性插值的优化版,取的是4*4邻域。

Matlab实现

A = imread('pout.tif');
B = imrotate(A,30,'nearest');
C = imrotate(A,30,'bilinear');
D = imrotate(A,30,'bicubic');
subplot(1,3,1),imshow(B);
title('最近邻插值');
subplot(1,3,2),imshow(C);
title('双线性邻插值');
subplot(1,3,3),imshow(D);
title('双三次插值');

在这里插入图片描述

8 实例——人脸图像配准

通过确定几个对应的点,可将图片“拉”成想要的样子。

第一步,加载图片

Matlab实现

Iin= imread('1.jpg');
Ibase = imread('2.jpg');
figure;
subplot(1,2,1),imshow(Iin);
subplot(1,2,2),imshow(Ibase);
cpselect(Iin(:,:,1),Ibase);%这是取rgb得一个分量,如果是灰度图就直接用cpselect(Iin,Ibase)

这个时候会出现一个工具箱来设置基准点。
在这里插入图片描述

第二步,设置基准点

设置几对关键点,左图与右图一一对应。
在这里插入图片描述

第三步,配准

Matlab实现

tform = cp2tform(cpstruct.inputPoints,cpstruct.basePoints,'affine');
Iout = imtransform(Iin,tform);
figure;
subplot(1,2,1),imshow(Iout);
subplot(1,2,2),imshow(Ibase);

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值