Code covered by the BSD License  

Highlights from
Rotate an image around a point

5.0

5.0 | 6 ratings Rate this file 54 Downloads (last 30 days) File Size: 4.5 KB File ID: #40469
image thumbnail

Rotate an image around a point

by

 

22 Feb 2013 (Updated )

Performs rotation of an image around any point inside of the image.

| Watch this File

File Information
Description

The rotation around a point is performed in following sequence:
1) Padding of the image.
2) Rotation of the image around the image's center with IMROTATE.
3) Cropping of the image.

Required Products Image Processing Toolbox
MATLAB release MATLAB 6.5 (R13)
Tags for This File   Please login to tag files.
Please login to add a comment or rating.
Comments and Ratings (8)
26 Aug 2014 Ehsan

It's Really work!
Thank you, your code solve a major problem in my project.............

13 Aug 2014 Maider

I meant to change lines 35 and 36 in rotateAround from
shiftX = round(pointX-(centerX+newX));
shiftY = round(pointY-(centerY-newY));
to
shiftX = floor(pointX-(centerX+newX));
shiftY = floor(pointY-(centerY-newY));

13 Aug 2014 Maider

Thanks for this submision. This is a very clever way to use imrotate.
But the function can be improved. For example:
1. If you use rotateAround_test and use pointX = 1; and pointY = 1; and run, the result shows that position (1,1) and (2,1) are black as they belong to the lost pixels in the rotation, that should not happen.
2. It does not work well with small angles such as 0.1. In such case rotateAround produces a rotation identical to imrotate.
Running
%% Set test parameters
imageX = 300;
imageY = 200;
pointX = 1;
pointY = 1;
angle = 0.1;

%% Create test image - black dot on white field
image = ones(imageY, imageX);
image(pointY, pointX) = 0;
rot = imrotate(image,angle,'bilinear', 'crop');

%% Rotate the image around the black dot
rotated = rotateAround(image, pointY, pointX, angle,'bilinear');

>> norm(rot - rotated)

ans =

0

I suggest to change lines 35 and 36 in rotateAround from
shiftX = round(pointX-(centerX+newX));
shiftY = round(pointY-(centerY-newY));
to
centerX = floor(imageWidth/2+1);
centerY = floor(imageHeight/2+1);

That solved both problems for me.

19 Jul 2014 Gaurav Mittal

Thanks, works great.

01 May 2014 Yun Inn  
21 Apr 2014 Jan Motl

Thanks for suggestion. I swapped the parameters of the function call.

03 Mar 2014 Juan P. Viera

Really useful. I think you should change the rotation line:
rot = imrotate(padded,angle,'crop',method);
for
rot = imrotate(padded,angle,method,'crop');

12 Jul 2013 jamesyu92

Works great for me.

Updates
21 Apr 2014

Extended support from grayscale to RGB images. Swapped order of the parameters in imrotate function call.

01 May 2014

Removed dependency on deg2rad function.

Contact us