2016-07-15 196 views
1

利用Matlab,我試圖解決的6個三角形(見AAprime)仿射變換...如何查找三角形之間的仿射變換?

3三角形在A

triangle1: points 1,2,3 of A 
triangle2: points 4,5,6 of A 
triangle3: points 7,8,9 of A 

其中,X/Y A的座標爲:
A.x = [x1 x2 x3; x4 x5 x6; x7 x8 x9]
A.y = [y1 y2 y3; y4 y5 y6; y7 y8 y9]

還有還有在Aprim 3個三角形。

triangle5:points 1,2,3 of Aprim 
triangle6:points 4,5,6 of Aprim 
triangle7:points 7,8,9 of Aprim 

其中,X/Y Aprim的座標爲:
Aprim.x = [xp1 xp2 xp3; xp4 xp5 xp6; xp7 xp8 xp9]
Aprim.y = [yp1 yp2 yp3; yp4 yp5 yp6; yp7 yp8 yp9]

我需要找到這樣的A每個三角形映射到Aprim三角仿射變換:

  • t1是將A的三角形1映射到Aprim的三角形1的仿射變換。
  • t2是將A的三角形2映射到Aprim的三角形2的仿射變換。
  • t3是仿射變換,將A點的三角形3映射到Aprim的三角形3 。

問題#1:在我的代碼,TForm的只給我仿射變換T3。我不知道如何改變它以知道t1,t2,t3的仿射變換。
問題#2:我的其他問題是在tform矩陣中,哪些元素是平移,旋轉,縮放值?如何找到縮放比例,旋轉角度和平移值?

任何人都可以幫我糾正我下面的matlab代碼嗎?如何解決t1,t2 and t3

我的代碼是:

A.x=[309 367 295;273 268 298;295 367 298];    
A.y=[292 259 277;228 253 225;277 259 225]; 
Aprim.x=[267 211 265;267 261 295;259 261 211]; 
Aprim.y=[301 222 325;301 270 306;213 112 222]; 
for i=1:3 
A_xprim(1:3,i)= transpose(Aprim.x(i,1:3)); 
A_yprim(1:3,i)=transpose(Aprim.y(i,1:3)); 


Ax(1:3,i)= transpose(A.x(i,1:3)); 
Ay(1:3,i)=transpose(A.y(i,1:3)); 

tform = maketform('affine',[A_xprim(1:3,i) A_yprim(1:3,i)],[ Ax(1:3,i) Ay(1:3,i)]); 
end 
+0

你有一個代碼,嘗試其他人可以快速檢查嗎?如果你展示你的嘗試,你會得到更快的答案。 –

+0

我不使用Matlab,所以我不能幫助代碼。這** [手冊頁](http://www.mathworks.com/help/images/performing-general-2-d-spatial-transformations.html#f12-33299)**可能會幫助您瞭解該變換矩陣問題... –

回答

1

#1:那是因爲你正試圖所有轉換結構存儲在一個變量。試試這個:

tform(i) = maketform('affine', ...); 

#2:變換矩陣存儲在tform(i).data.T。而this是有關其元素的文檔。但在你的情況下,變換矩陣實際上是matrix multiplication of basic affine transforms(平移,旋轉,縮放和剪切)的結果。例如,我們不能說第一個元素顯示沿着x軸或者旋轉角度的餘弦的刻度值。

另一個問題是,你說你要地圖的A每個三角形的Aprim三角形,但代碼似乎反其道而行之。我編輯你的代碼測試結果:

clc; clear; close all; 
A.x=[309 367 295;273 268 298;295 367 298]; 
A.y=[292 259 277;228 253 225;277 259 225]; 
Aprim.x=[267 211 265;267 261 295;259 261 211]; 
Aprim.y=[301 222 325;301 270 306;213 112 222]; 
for i=1:3 
    Axprim(1:3,i)= transpose(Aprim.x(i,1:3)); 
    Ayprim(1:3,i)=transpose(Aprim.y(i,1:3)); 

    Ax(1:3,i)= transpose(A.x(i,1:3)); 
    Ay(1:3,i)=transpose(A.y(i,1:3)); 

    tform(i) = maketform('affine',[Ax(1:3,i) Ay(1:3,i)],[ Axprim(1:3,i) Ayprim(1:3,i)]); 
end 

[X, Y] = meshgrid(260:5:370, 220:5:300); 
n = numel(X); 
C = ones(n, 3); 
[~, I] = sort(X(:)+Y(:)); 
C(I, 1) = linspace(0, 1, n); 
C = hsv2rgb(C); 

TX = [A.x A.x(:, 1)]; 
TY = [A.y A.y(:, 1)]; 
TPX = [Aprim.x Aprim.x(:, 1)]; 
TPY = [Aprim.y Aprim.y(:, 1)]; 

subplot(221); hold on; axis equal; 

scatter(X(:), Y(:), 100, C, '.'); 
plot(TX', TY', 'linewidth', 2); 
plot(TPX', TPY', '--', 'linewidth', 2); 
xlabel('X'); ylabel('Y'); 
for i = 1:3 
    subplot(2, 2, i+1); 
    axis equal; hold on; 
    [U, V] = tformfwd(tform(i), X(:), Y(:)); 
    scatter(U(:), V(:), 100, C, '.'); 
    plot(TPX', TPY', 'linewidth', 2); 
    xlabel('U'); ylabel('V'); 
end 

enter image description here

+0

感謝您的幫助。我需要計算縮放比例,旋轉角度和平移參數。因爲我想優化它們。你能幫我找到他們嗎? – jiang

+0

@江你需要問另一個問題。有很多細節應該解釋和評論是不正確的地方。 – saastn