2013-10-09 1 views
0

Меня попросили выполнить поворот изображения вокруг произвольной точки. Структура, которую они предоставили, была в Matlab, поэтому мне пришлось заполнить функцию под названием MakeTransformMat, которая получает угол поворота и точку, где мы хотим повернуть.Вращение изображения относительно произвольной точки

Как я уже видел в классе для этого поворота, мы переводим точку в начало координат, затем поворачиваем и, наконец, переводим назад.

Рамка просит меня вернуть матрицу преобразования. Правильно ли построить эту матрицу как умножение матриц перевода-поворота-трансляции? в противном случае, что я забываю?

function TransformMat = MakeTransformMat(theta,center_y,center_x) 

%Translate image to origin 
trans2orig = [1 0 -center_x; 
       0 1 -center_y; 
       0 0 1]; 
%Rotate image theta degrees 
rotation = [cos(theta) -sin(theta) 0; 
      sin(theta) cos(theta) 0; 
      0   0   1]; 
%Translate back to point 
trans2pos = [1 0 center_x; 
      0 1 center_y; 
      0 0 1]; 

TransformMat = trans2orig * rotation * trans2pos; 

end 
+1

Вы попробовали? Вернули ли вы правильно повернутое изображение? – Dan

+0

Нет, я не знаю, потому что я борюсь с другой частью рамки перед тем, как применить это, я не использую MATLAB, и они используют очень странные функции, которые я не знаю, что они делают – BRabbit27

+0

Ну, я бы предложил вам сначала создать рамки для тестирования (или если у вас есть панель обработки изображений, которую вы можете протестировать с помощью ['imtransform'] (http://www.mathworks.com/help/images/ref/imtransform.html)). – Dan

ответ

1

Я ответил на очень похожий вопрос в другом месте: Here is the link.

В коде, связанном, в точке, о которой вы поворачиваете определяется как meshgrid определяется.

Помогло ли это? Вы читали Wikipedia page on rotation matrices?

+0

Я был настроен скептически, но затем я пробовал его шаг за шагом вместе с бумагой, и да, он действительно работает, как будто он должен работать. – BRabbit27

2

Это сработало для меня. Здесь я это входное изображение и J является повернутым изображением

[height, width] = size(I); 
rot_deg = 45;  % Or whatever you like (in degrees) 
rot_xc = width/2; % Or whatever you like (in pixels) 
rot_yc = height/2; % Or whatever you like (in pixels) 


T1 = maketform('affine',[1 0 0; 0 1 0; -rot_xc -rot_yc 1]); 
R1 = maketform('affine',[cosd(rot_deg) sind(rot_deg) 0; -sind(rot_deg) cosd(rot_deg) 0; 0 0 1]); 
T2 = maketform('affine',[1 0 0; 0 1 0; width/2 height/2 1]); 

tform = maketform('composite', T2, R1, T1); 
J = imtransform(I, tform, 'XData', [1 width], 'YData', [1 height]); 

Приветствие.

+0

Хороший ответ! Только последний матикс привязан к центральной точке: T2 = maketform ('affine', [1 0 0; 0 1 0; rot_xc rot_yc 1]); – Felix