2016-07-15 7 views
1

Использование Matlab, я пытаюсь решить аффинное преобразование из 6 треугольников (см A и Aprime) ...Как найти аффинное преобразование между треугольниками?

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.x = [x1 x2 x3; x4 x5 x6; x7 x8 x9]
и A.y = [y1 y2 y3; y4 y5 y6; y7 y8 y9]

и есть еще 3 треугольника в Aprim.

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

Где X/Y координата АПРИТ является:
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 - это аффинное преобразование, отображающее треугольник 1 от A до треугольника 1 апреля.
  • t2 - это аффинное преобразование, отображающее треугольник2 от А до треугольника2 апреля.
  • t3 - это аффинное преобразование, отображающее точки треугольника3 от A до треугольника3 апреля.

Проблема № 1: В моем коде, ТГогт только дать мне аффинное преобразование t3. Я не знаю, как изменить его, чтобы знать аффинное преобразование для t1, t2, t3.
Проблема №2: Моя другая проблема в том, что в tform матрица, какие элементы являются переводом, вращением, масштабированием значений? как найти масштабирование, угол поворота и значения сдвига?

Может кто-нибудь помочь мне скорректировать мой код в формате MATLAB ниже? Как решить t1, t2 и 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 (перевод, поворот, масштаб и сдвиг). Например, мы не можем сказать, что первый элемент показывает значение шкалы вдоль оси х или косинуса угла поворота.

Другая проблема заключается в том, что вы сказали, что вы хотите карты каждый треугольник из 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

@jiang вам нужно задать другой вопрос. Есть много подробностей, которые следует объяснить, и комментарий не подходит для этого. – saastn

 Смежные вопросы

  • Нет связанных вопросов^_^