作为一个强大的科学计算软件,MATLAB广泛运用于较多领域,以其简单的编程风格著称。这篇文章便通过matlab语言来讲述如何进行图像的各种几何变换。
图像几何变换又称为图像空间变换,它是将一幅图像中的坐标位置,映射到另一幅图像中的新坐标位置。几何变换不改变图像的像素值,只是在图像平面上进行像素的重新安排。
接下来就是图像算法的第二讲,主要涉及的知识点有:
1. 几何变换:平移、镜像、转置、缩放、旋转;
2. 插值算法
%平移就是按照指定的平移量进行 【水平】or【垂直】 的移动。
x1=x0+Tx
y1=y0+Ty
%平移矩阵:
A =
1 0 0
0 1 0
Tx Ty 1
图像平移的表达式:B=imtransform(Img , TFORM , method);
%imtransform函数用于完成一般的二维空间变换
B=imtransform(Img , TFORM , method); %Img- 要进行几何变换的图片
%TFORM- 指具体的变换类型
%method- 允许为imtransform函数选择的插值方法,以下三种可填:
% 'bicubic' 双三次插值
% 'bilinear' 双线性插值
% 'nearest' 最近邻插值
%maketform函数的作用:为获得 TFORM 结构的方法。
T=maketform(transformtype, Matrix );
%参数transformtype指定了变换的类型,例如常见的‘affine’二维仿射变换(平移、旋转、比例、拉伸等)
%例子:
function Img_out = imMove(Img, Tx, Ty ); %平移变换 Img=imread('C:\Users\cat.jpg'); Tx=100; %Tx- 水平方向平移量 Ty=800; %Ty- 竖直方向平移量 tform =maketform('affine',[1 0 0 ; 0 1 0 ; Tx Ty 1 ]); Img_out = imtransform(Img,tform,'XData',[1 size(Img,2)],'YData',[1, size(Img,1)]);%图像平移 figure; subplot(1,2,1);imshow(Img);title('原图'); subplot(1,2,2);imshow(Img_out);title('平移后的图像'); end
显示出平移后的图像,平移过的地方变成了黑色的。
%平移就是按照指定的平移量进行 【水平】or【垂直】 的移动。
图像镜像分为两类:水平镜像,竖直镜像。
%水平镜像矩阵:
B=
-1 0 0
0 1 0
Width 0 1
%竖直镜像矩阵:
C =
1 0 0
0 -1 0
0 Height 1
%举例:
Img=imread('C:\Users\people.jpg'); [Height, Width, dim ]=size(Img); tform_B = maketform('affine',[-1 0 0 ; 0 1 0 ; Width 0 1 ]); %定义水平镜像变换矩阵 Img_B = imtransform(Img,tform,'nearest'); tform_C=maketform('affine',[1 0 0;0 -1 0;0 Height 1]); %定义竖直镜像变换矩阵 Img_C = imtransform(Img,tform_C,'nearest'); figure; subplot(1,3,1);imshow(Img);title('原图'); subplot(1,3,2);imshow(Img_B);title('水平镜像'); subplot(1,3,3);imshow(Img_C);title('竖直镜像');
%平移就是按照指定的平移量进行 【水平】or【垂直】 的移动。
%转置变换矩阵:
D =
0 1 0
1 0 0
0 0 1
%图像转置
Img=imread('C:\Users\people.jpg'); tform_D = maketform('affine',[0 1 0 ; 1 0 0 ; 0 0 1 ]); %定义转置变换矩阵 Img_D = imtransform(Img,tform_D,'nearest'); figure; subplot(1,2,1);imshow(Img);title('原图'); subplot(1,2,2);imshow(Img_D);title('图像转置');
%图像缩放是指图像按照比率进行放大或者缩小
%缩放变换矩阵:
E =
Sx 0 0
1 Sy 0
0 0 1
%图像缩放
Img=imread('C:\Users\people.jpg'); Img_E=imresize(Img, 1.5, 'nearest'); %图像扩大 1.5 倍 figure;imshow(Img);title('原图'); figure;imshow(Img_E);title('图像缩放');
%旋转一般是将图像围绕某一点旋转一定的角度。旋转也会改变图像的大小。
%旋转变换矩阵:
F =
cos(θ) -sin(θ) 0
sin(θ) cos(θ) 0
0 0 1
%围绕中心点的图像旋转
Img = imread('C:\Users\people.jpg'); Img_F = imrotate(Img,30, 'nearest', 'crop'); %最近邻插值法逆旋转30°,并剪切图像; subplot(1,2,1),imshow(Img);title('原图'); subplot(1,2,2),imshow(Img_F);title('逆时针旋转30度');
之前说到的method:在这里主要介绍一下
%imtransform函数用于完成一般的二维空间变换
B=imtransform(Img , TFORM , method); %Img- 要进行几何变换的图片
%TFORM- 指具体的变换类型
%method- 允许为imtransform函数选择的插值方法,以下三种可填:
% 'bicubic' 双三次插值
% 'bilinear' 双线性插值
% 'nearest' 最近邻插值
%最近邻插值 'nearest'
%输出像素的值为输入图像中与其最近的采样点的像素值
f(x,y) = g( round(x), round(y) );
%双线性插值 'bilinear'
%双线性插值又称为一阶插值,可扩展成二维。
首先对上端的两个点进行线性插值,得到: f(x,0) = f(0,0)+x[f(1,0)-f(0,0)]
然后对下端的两个顶点进行线性插值,得到: f(x,1) = f(0,1)+x[f(1,1)-f(0,1)]
最后,对垂直方向进行线性插值,得到: f(x,y) = f(x,y)+x[f(x,0)-f(x,0)]
整理得出:f(x,y) = [ f(1,0)-f(0,0) ]x+ [ f(0,1)-f(0,0) ]y + [ f(1,1)+f(0,0)-f(0,1) ]xy + f(0,0)
其他相关文章请点击:
图像算法一:【图像点运算】灰度直方图、伽马变换、灰度阈值变换、分段线性变换、直方图均衡化
图像算法二:【图像几何变换】平移、镜像、转置、缩放、旋转、插值
图像算法三:【图像增强--空间域】图像平滑、中值滤波、图像锐化
图像算法四:【图像增强--频率域】傅里叶变换、快速傅里叶变换、频域滤波、频域低通滤波、频域高通滤波
图像算法五:【图像小波变换】多分辨率重构、Gabor滤波器、Haar小波
图像算法六:【彩色图像处理】彩色模型、彩图处理
图像算法七:【形态学图像处理】二值运算、膨胀、腐蚀
图像算法八:【图像分割】边缘检测(Roberts,Sobel,canny)、霍夫变换(hough)、阈值分割、区域分割
图像算法九:【图像特征提取】特征降维、PCA人脸特征抽取、局部二进制
~~~~