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);