天天看點

matlab nearest函數_MATLAB中圖像的鏡像變換

matlab nearest函數_MATLAB中圖像的鏡像變換

點選上方藍字  關注我們

matlab nearest函數_MATLAB中圖像的鏡像變換

本文主要講解MATLAB中圖像的鏡像變換:

matlab nearest函數_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 nearest函數_MATLAB中圖像的鏡像變換

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) 的四邊形。效果如圖所示:

matlab nearest函數_MATLAB中圖像的鏡像變換

c.已知比對的特征對,求變換矩陣

圖像的特征點比對運用十分廣泛,如SIFT、SURFF,當我們對圖像特征點比對成功後,可利用estimateGeometricTransform函數,實作幾何變換求解。同樣,可以得到一個3×3的變換矩陣tform。這裡暫時了解一下就好了。

[tform,inlierPtsDistorted,inlierPtsOriginal]=estimateGeometricTransform(matchedPtsDistorted,matchedPtsOriginal,’similarity’);

本部分重點:在鏡像變換的時候,根據變換特點,水準鏡像的矩陣遵循以下公式:

matlab nearest函數_MATLAB中圖像的鏡像變換

水準鏡像即x變為負,y軸不變:

matlab nearest函數_MATLAB中圖像的鏡像變換

垂着鏡像遵循以下公式:

matlab nearest函數_MATLAB中圖像的鏡像變換

垂直鏡像就是x不變,y軸變為負:

matlab nearest函數_MATLAB中圖像的鏡像變換

對角鏡像:

matlab nearest函數_MATLAB中圖像的鏡像變換

他的矩陣是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('垂直圖像');

matlab nearest函數_MATLAB中圖像的鏡像變換

我們成功的實作了水準和垂直鏡像變換,對角鏡像的和這個一樣,改一下變換矩陣就行了。

實作方式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 nearest函數_MATLAB中圖像的鏡像變換

這種呢其實原理上和變換矩陣一樣,隻是形式上寫的更簡單而已。

關于MATLAB的學習:

大家可以關注我們的知乎專欄——資料可視化和資料分析中matlab的使用:

https://zhuanlan.zhihu.com/c_1131568134137692160

歡迎大家加入我們的MATLAB學習交流群:

953314432

▼ 往期精彩回顧 ▼ Matlab多項式計算 圖像進行中的代數運算及幾何變換 資料預處理——噪聲值平滑處理

matlab nearest函數_MATLAB中圖像的鏡像變換
matlab nearest函數_MATLAB中圖像的鏡像變換
matlab nearest函數_MATLAB中圖像的鏡像變換

掃碼關注我們 更多精彩等待你發現 出品:Asoul水雲天課堂工作室

matlab nearest函數_MATLAB中圖像的鏡像變換
matlab nearest函數_MATLAB中圖像的鏡像變換

好看你就 點點我