點選上方藍字 關注我們
本文主要講解MATLAB中圖像的鏡像變換:
實作方式1:通過makeform函數實作
maketform函數介紹
maketform函數很有用,不但能進行鏡像變換,還能夠根據我們定義的變換矩陣進行各種變換,就比如我們這裡運用的是平移仿射變換,運用的時候分為下面幾步:
01 導入圖像
cb = checkerboard; figure imshow(cb)
02 定義空間變換
定義二維的空間變換需要一個3X3的變換矩陣,也可以通過在輸入圖像和輸出圖像上指定對應點的方式由maketform自動建立變換矩陣。這裡使用如下的變換矩陣來定義空間平移變換:
% 定義變換矩陣 xform = [ 1 0 0 0 1 0 20 40 1 ];
在這個矩陣中,xform(3, 1)定義了圖像在水準方向上平移的像素數,xform(3, 2)定義了圖像在垂直方向上平移的像素數。這裡要特别介紹一下這個矩陣,平移的時候矩陣的特點我們很容易看出,這個分别是沿着x,y坐标平移了40,20個機關距離,如下圖所示:
matlab中通過定義一個3×3的矩陣實作仿射變換(平移、縮放、旋轉等)。注意到,變換矩陣的第三列恒為【0,0,1】,實際上,确定一個仿射變換隻需要一個2×3的變換矩陣即可。
matlab 仿射變換主要有三種常用形式。
a.自定義變換矩陣
xform = [ 1 0 0 ; 0 1 0 ; 40 40 1]; 在這個矩陣中,xform(3, 1)定義了圖像在水準方向上平移的像素數,
xform(3, 2)定義了圖像在垂直方向上平移的像素數。建立TFORM結構體:
tform_translate =maketform(‘affine’, xform); 執行變換:[cb_trans xdata ydata]= imtransform(cb, tform_translate);
b.已知變換圖像坐标,求變換矩陣
要對一個仿射變換使用此方法,需要在輸入、輸出圖像上拾取3對非線性的點,而對于投影變換,則需要指定四對點。
tform2 = maketform(‘affine’, in_points, out_points)
例如:
tform = maketform('projective',[ 0 0; 1 0; 1 1; 0 1],... [-4 2; -8 -3; -3 -5; 6 3]);
他的含義是,把頂點為 (0 0)、(1 0)、(1 1)、(0 1) 的機關正方形變換為具有頂點 (-4 2)、(-8 3)、(-35)、(6 3) 的四邊形。效果如圖所示:
c.已知比對的特征對,求變換矩陣
圖像的特征點比對運用十分廣泛,如SIFT、SURFF,當我們對圖像特征點比對成功後,可利用estimateGeometricTransform函數,實作幾何變換求解。同樣,可以得到一個3×3的變換矩陣tform。這裡暫時了解一下就好了。
[tform,inlierPtsDistorted,inlierPtsOriginal]=estimateGeometricTransform(matchedPtsDistorted,matchedPtsOriginal,’similarity’);
本部分重點:在鏡像變換的時候,根據變換特點,水準鏡像的矩陣遵循以下公式:
水準鏡像即x變為負,y軸不變:
垂着鏡像遵循以下公式:
垂直鏡像就是x不變,y軸變為負:
對角鏡像:
他的矩陣是x,y都變為負數
注意i,j分别為圖像中像素點的坐标,圖像的大小為M*N,具體例子見下文:
03 建立TFORM結構體
使用maketform函數可以建立TFORM結構體,參數為希望執行變換的類型和變換矩陣。
% 建立TFORM結構體 tform_translate = maketform('affine', xform);
04 執行變換
使用imtransform函數執行變換,參數為要變換的圖像和TFORM結構體,函數将傳回變換後的圖像。
% 執行變換 [cb_trans xdata ydata]= imtransform(cb, tform_translate); %用灰色填充并使用雙三次插值。使輸出大小與輸入大小相同
傳回值中包含的另兩個額外輸出參數xdata和ydata,表示輸出圖像在輸出坐标空間的位置。xdata包含了輸出圖像拐角處像素的x坐标,ydata包含了這些像素的y坐标(這裡說的x、y坐标是指像素的中點)。
鏡像變換執行個體操作
我們輸入以下代碼
I = imread('a.jpg'); [height, width, dim]=size(I); %水準鏡像變換 tform = maketform('affine',[-1 0 0;0 1 0; width 0 1]); B=imtransform(I, tform, 'nearest'); %将二維空間變換應用于圖像 %垂直鏡像變換 tform2 = maketform('affine', [1 0 0; 0 -1 0; 0 height 1]); C=imtransform(I, tform2, 'nearest'); subplot(1,3,1),imshow(I); title('原圖像'); subplot(1,3,2),imshow(B); title('水準圖像'); subplot(1,3,3),imshow(C); title('垂直圖像');
我們成功的實作了水準和垂直鏡像變換,對角鏡像的和這個一樣,改一下變換矩陣就行了。
實作方式2:直接變換
A = imread('aaa.jpg'); A = double(A); subplot(2,2,1); imshow(uint8(A)); H = size(A); B(1:H(1),1:H(2),1:H(3))=A(H(1):-1:1,1:H(2),1:H(3));%垂直鏡像 subplot(2,2,2); imshow(uint8(B)); C(1:H(1),1:H(2),1:H(3))=A(1:H(1),H(2):-1:1,1:H(3));%水準鏡像 subplot(2,2,3); imshow(uint8(C));
這種呢其實原理上和變換矩陣一樣,隻是形式上寫的更簡單而已。
關于MATLAB的學習:
大家可以關注我們的知乎專欄——資料可視化和資料分析中matlab的使用:
https://zhuanlan.zhihu.com/c_1131568134137692160
歡迎大家加入我們的MATLAB學習交流群:
953314432
▼ 往期精彩回顧 ▼ Matlab多項式計算 圖像進行中的代數運算及幾何變換 資料預處理——噪聲值平滑處理
掃碼關注我們 更多精彩等待你發現 出品:Asoul水雲天課堂工作室
好看你就 點點我