HiveBrain v1.2.0
Get Started
← Back to all entries
patternMinor

Using homogeneous coordinates to rotate an image

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
imagecoordinateshomogeneoususingrotate

Problem

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

% input image
input_matrix = imread('placa.bmp');
[rows cols] = size(input_matrix);

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

% 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];

Solution

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.

Code Snippets

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

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

Context

StackExchange Code Review Q#15846, answer score: 3

Revisions (0)

No revisions yet.