作為一個強大的科學計算軟體,MATLAB廣泛運用于較多領域,以其簡單的程式設計風格著稱。這篇文章便通過matlab語言來講述如何進行圖像的各種幾何變換。
圖像幾何變換又稱為圖像空間變換,它是将一幅圖像中的坐标位置,映射到另一幅圖像中的新坐标位置。幾何變換不改變圖像的像素值,隻是在圖像平面上進行像素的重新安排。
接下來就是圖像算法的第二講,主要涉及的知識點有:
1. 幾何變換:平移、鏡像、轉置、縮放、旋轉;
2. 插值算法
圖像平移:imtransform(),maketform()
%平移就是按照指定的平移量進行 【水準】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
顯示出平移後的圖像,平移過的地方變成了黑色的。
圖像鏡像:imtransform(),maketform()
%平移就是按照指定的平移量進行 【水準】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('豎直鏡像');
圖像轉置:imtransform(),maketform()
%平移就是按照指定的平移量進行 【水準】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('圖像轉置');
圖像縮放:imresize()
%圖像縮放是指圖像按照比率進行放大或者縮小
%縮放變換矩陣:
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('圖像縮放');
圖像旋轉:imrotate()
%旋轉一般是将圖像圍繞某一點旋轉一定的角度。旋轉也會改變圖像的大小。
%旋轉變換矩陣:
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度');
插值: 'bilinear' , 'nearest'
之前說到的method:在這裡主要介紹一下
- 最近鄰插值算法 % 'nearest' 最近鄰插值
- 雙線性插值算法 % 'bilinear' 雙線性插值
%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人臉特征抽取、局部二進制
~~~~