# Using homogeneous coordinates to rotate an image

Currently, I have this code snippet, but it's a little bit slow:

% input image
[rows cols] = size(input_matrix);

% rotation
degree = 30;
radians = (pi * degree) / 180;

% output matrix
t_matrix = input_matrix;
t_matrix(t_matrix == input_matrix) = NaN;

% transformation matrix
T = [cos(theta) -sin(theta) 0; sin(theta) cos(theta) 1; 0 0 1];

% loop over each input_matrix coordinate
for n = 1:numel(input_matrix)

% current coordinate
[x y] = ind2sub([rows cols], n);

% transpose
v = [x y 1]';

% homogeneous coordinate
v = T*v;

% transponse again
v = v';

% only integer values
a = floor(v(1));
b = floor(v(2));

if a > 0 && b > 0

% replace in t_matrix
t_matrix(a,b) = input_matrix(x,y);
end
end

% get only a part of t_matrix
t_matrix = t_matrix(1:rows, 1:cols);

figure; imshow(input_matrix); % original image
figure; imshow(t_matrix)


How can I improve it?

Condition: keep using this matrix:

% transformation matrix
T = [cos(theta) -sin(theta) 0; sin(theta) cos(theta) 1; 0 0 1];

-

Rather than looping over all x and y values you could put them into a vector, that should speed things up considerably.

y=repmat(1:cols,rows,1)
x=repmat((1:rows)',cols,1)

M=[x(:) y(:) ones(rows*cols,1)];


Now you just need to multiply M or M' with T or T' and you have subsitituted that part of the code.

-
It would help if you posted an example along with an explanation instead. – Trevor Pilley Nov 14 '12 at 11:01
Added the improved code part – Dennis Jaheruddin Nov 14 '12 at 12:16