MATLAB Learn How to Rotate Images in Matlab: Step-by-Step Guide | Expert Tips

AI Thread Summary
The discussion revolves around a user attempting to rotate an image in MATLAB but encountering issues with a black background and unwanted artifacts like lines and dots. The provided code reads an image, extracts the red layer, and applies a rotation transformation using a matrix. However, the user notes that after rotation, parts of the image extend beyond the original frame, leading to confusion about how MATLAB handles out-of-bounds pixels. Suggestions include using region properties and centroids to maintain the triangle's position during rotation. Additionally, a potential error in the transformation matrix is highlighted, with a recommendation to correct the matrix to achieve the desired rotation effect.
gnome
Messages
1,031
Reaction score
1
OK here I am, bigshot, giving out advice on how to rotate an image when I'm just trying to learn that myself.

I'm trying to do this in Matlab; it's rotating, but for some reason the rotated image is acquiring a black background and has various lines and dots superimposed on it. Can anyone tell me why?

Here's the code:
Code:
% rotation.m

% reads in and rotates a figure in file triangles.png

a = imread('triangles.png');
image(a);         % this just displays the original image
pause;
close;              % this closes it
[rows cols layers] = size(a);     % this declares 3 variables named rows, cols
                                           % &  layers & assigns to them the dimensions of array a
s = min(rows,cols);
%% want to make sure the new image is square, just for convenience
rows=s;
cols=s;
%% declare a 32-bit int vector p (1 x 2) to hold the coordinates of the new point, initialized (0 0)
p=int32(zeros(1,2));
%% for simplicity, I will only deal with one color so define two 2D matrices, size rows x cols, 
%% type double to allow multiplication, initialized to all 0s
b = double(zeros(rows,cols));
c = double(zeros(rows,cols));
%% loop through the array, copying just the red layer of a to the corresponding pixels of b
for row = 1:rows,
    for col = 1:cols,
        b(row,col)=a(row,col,1);
    end
end

%% define the transformation matrix t
t = [ cos(pi/4) -sin(pi/4); sin(pi/4) cos(pi/4)];
%% now loop through the arrays computing rotated & shifted coordinates for array c
%% and copy pixels from b to their new locations in c
for row = 1:rows,
    for col = 1:cols,
        %% first compute the coords of the new point; note I'm rotating
        %% and shifting to prevent any negative indices
        %% got the 140 right-shift by trial & error
        p = round([row col]*t) + [0 140];
        %% now copy the current pixel value to the new matrix
        c(p(1,1),p(1,2)) = b(row,col);
    end
end

image(c);
hold on;         % this holds the image window open so I can view one superimposed over  the other 
image(b);
imwrite(b,'tri.png');
imwrite(c,'newtri.png');

Images are attached. triangles.png is the original image. tri.png is just the red layer of that file; that's the array I'm rotating. newtri.png is the result.

Edit: I just noticed that tri.png got rotated somehow in the process of uploading, so it wasn't oriented the same as the original image. Now it's OK.

Edit: added more comments to the code (everything starting with % is a comment)
 

Attachments

  • triangles.png
    triangles.png
    1.6 KB · Views: 926
  • newtri.png
    newtri.png
    1.9 KB · Views: 838
  • tri.png
    tri.png
    632 bytes · Views: 896
Last edited:
Physics news on Phys.org
On second thought, I guess what's surprising is that it works at all. Even though I've shifted it so that my triangle figure ends up within the boundaries of the original image frame, no matter where I put it, after rotation there will be corners "hanging out" of the boundaries of the original frame. So apparently Matlab is already doing something to handle that for me, but obviously not perfectly.

So, do I have to change the program so that pixels that get rotated out of the frame are simply dropped?
 
I have no idea how to understand the 'Matlab" lanuage lol. I am still trying to figure this out :P
 
yaa

Yaa may it's th case withthe location of the triangle for every movement u do in the for loop. tryin assigning using the regioprops and centroid of the triangle , and maintain the same coordintes of the centroid even after rotation. that might help U.


:smile:
 
Wrong Matrix?

I haven't tested the code, but off the cuff I think your transformation matrix is wrong:

You have:
t = [ cos(pi/4) -sin(pi/4); sin(pi/4) cos(pi/4)];

I think it should be:

t = [ cos(pi/4) sin(pi/4); -sin(pi/4) cos(pi/4)];
 
Back
Top