version 1.0.0.0 (47 KB) by
Prakash Manandhar

converts rectangular image to polar and back

Conversion from Rectangular to Polar Image and back from Polar to Rectangular.

Image Processing Toolbox required only for loading and displaying images

V0.1 16 Dec 2007 (Created), Prakash Manandhar pmanandhar@umassd.edu

Prakash Manandhar (2020). Polar To/From Rectangular Transform of Images (https://www.mathworks.com/matlabcentral/fileexchange/17933-polar-to-from-rectangular-transform-of-images), MATLAB Central File Exchange. Retrieved .

1.0.0.0 | Added inverse function and examples. |

Created with
R14

Compatible with any release

Create scripts with code, output, and formatted text in a single executable document.

JoaquinBDid anyone find a faster code? I have a polar 3D image (280x3072x4000) and i think this takes more than 7 hours to apply to the whole image. Does anyone know how to improve the efficiency? Thanks!

AFSAL CPGOOD

Thilo SchuchortMaria CamporeseNathan LaxagueVinceZhaoVery good functions. One typo in "PolarToIm" function:

"y = (yi - On)/sx;" should be "y = (yi - On)/sy;"

Biswarup MukherjeeYannick Mermethi there

I am using the ImtoPolar.m file. how do I display the polar image after the transformation?

SophiaKristian MoesgaardHere the code is to work with RGB image and independent on image format. Thought somebody might find it useful :)

function imP = FISHCOLOR2(imR)

rMin=0.1;

rMax=1;

reduced_dim = min(size(imR,1),size(imR,2));

imR = imresize(imR,[reduced_dim reduced_dim]);

M=size(imR,1);N=size(imR,2);

CenterX = (M+1)/2; % co-ordinates of the center of the image

CenterY = (N+1)/2;

ScaleX = (M-1)/2; % scale factors

ScaleY = (N-1)/2;

DeltaR = (rMax - rMin)/(M-1);

DeltaTheta = 2*pi/N;

R=rMin:DeltaR:rMin+(M-1)*DeltaR;

Theta=0:DeltaTheta:(N-1)*DeltaTheta;

[R,Theta]=meshgrid(R,Theta);

X=R*cos(Theta);

Y=R*sin(Theta);

LatX = X*ScaleX + CenterX;

LongY = Y*ScaleY + CenterY;

for k=1:3 % colors

imP(:,:,k) = interp2(imR(:,:,k), LatX, LongY); % add k channel

end

imP = imresize(imP,[size(imP,1), size(imP,2)/3]);

imP = imrotate(imP,270);

Peter Caday@Kristian: If your RGB image comes from the imread function, it is an M x N x 3 array. You can then apply ImToPolar or PolarToIm (whichever you're interested in) 3 times, once for each plane (R,G,B) of the image. For instance:

polar = imread('.../myimage.jpg');

im(:,:,1) = PolarToIm(polar(:,:,1), rMin, rMax, Mr, Nr);

im(:,:,2) = PolarToIm(polar(:,:,2), rMin, rMax, Mr, Nr);

im(:,:,3) = PolarToIm(polar(:,:,3), rMin, rMax, Mr, Nr);

Hope this helps!

Kristian MoesgaardGreat and functional work.. Does anybody know a quick way of converting this code so that i can be used on a RGB image?

Killoramshait worked out :) awsm work

ramshaif i want to transform circluar to rectangle ? thn

Yves DELIGNONThank you, very useful

FlorianCool! Thanks a lot

Ruth LivingstoneSorry, That looks a little unclear. Here it is again

function imC = Polar2Im(imP,W,method)

%Polar2Im turns a polar image (imP) into a cartesian image (imC) of width W

%method can be: '*linear', '*cubic', '*spline', or '*nearest'.

imP(isnan(imP))=0;

w = round(W/2);

xy = (1:W-w);

[M N P]= size(imP);

[x y] = meshgrid(xy,xy);

n = round(N/4);

rr = linspace(1,w,M);

W1 = w:-1:1;

PM = [2 1 3;1 2 3;2 1 3;1 2 3];

W2 = w+1:2*w;

nn = [1:n; n+1:2*n; 2*n+1:3*n; 3*n+1:N;];

w1 = [W1;W2;W2;W1];

w2 = [W2;W2;W1;W1];

aa = linspace(0,90*pi/180,n);

r = sqrt(x.^2 + y.^2);

a = atan2(y,x);

imC= zeros(W,W,P);

for i=1:4 %turn each quarter into a cartesian image

imC(w1(i,:),w2(i,:),:)=permute(interp2(rr,aa,imP(:,nn(i,:))',r,a,method),PM(i,:));

end

imC(isnan(imC))=0;

Ruth LivingstoneHi

Thank you, this code is great, but takes a little too long for my application. After reading the thread I wrote similar code which works ~12 times faster for the PolarToIm section. It doesn't have quite the same functionality but I thought I would share it here in case others are having the same problem

function imC = Polar2Im(imP,W,method)

%Polar2Im turns a polar image (imP) into a cartesian image (imC) of width W

%method can be: '*linear', '*cubic', '*spline', or '*nearest'.

imP(isnan(imP))=0;

w = round(W/2); [M N P]= size(imP);

xy = (1:W-w); [x y] = meshgrid(xy,xy);

n = round(N/4); rr = linspace(1,w,M);

W1 = w:-1:1; PM = [2 1 3;1 2 3;2 1 3;1 2 3];

W2 = w+1:2*w; nn = [1:n; n+1:2*n; 2*n+1:3*n; 3*n+1:N;];

w1 = [W1;W2;W2;W1]; aa = linspace(0,90*pi/180,n);

w2 = [W2;W2;W1;W1]; r = sqrt(x.^2 + y.^2);

a = atan2(y,x); imC= zeros(W,W,P);

for i=1:4 %turn each quarter into a cartesian image

imC(w1(i,:),w2(i,:),:) = permute(interp2(rr,aa,imP(:,nn(i,:))',r,a,method),PM(i,:));

end

imC(isnan(imC))=0;

Dhruv AgrawalIs it correct to use different scaling factors for different axes? A circle in an image should transpose as a rectangle in polar image, but this makes it an ellipse. Could take the min of the scaling factors (sx,sy) for both, though, you might end leaving some portion of the image.

Fernando VillafañeFor what serving the matrix (A) and how is obtained?.

function v = interpolate (imR, xR, yR)

xf = floor(xR);

xc = ceil(xR);

yf = floor(yR);

yc = ceil(yR);

if xf == xc & yc == yf

v = imR (xc, yc);

elseif xf == xc

v = imR (xf, yf) + (yR - yf)*(imR (xf, yc) - imR (xf, yf));

elseif yf == yc

v = imR (xf, yf) + (xR - xf)*(imR (xc, yf) - imR (xf, yf));

else

A = [ xf yf xf*yf 1

xf yc xf*yc 1

xc yf xc*yf 1

xc yc xc*yc 1 ];

r = [ imR(xf, yf)

imR(xf, yc)

imR(xc, yf)

imR(xc, yc) ];

a = A\double(r);

w = [xR yR xR*yR 1];

v = w*a;

end

Raphael Attieim2polar : this update will save you 1 order of magnitude of processing time, by vectorizing the code, and using interp2 (can even do better with mex file ba_interp in file exchange) :

Watch out, this might be the transpose of the original output.

rMin=0;

rMax=1;

[Mr Nr] = size(imR); % size of rectangular image

xRc = (Mr+1)/2; % co-ordinates of the center of the image

yRc = (Nr+1)/2;

sx = (Mr-1)/2; % scale factors

sy = (Nr-1)/2;

imP = zeros(M, N);

dr = (rMax - rMin)/(M-1);

dth = 2*pi/N;

% loop in radius and

r=rMin:dr:rMin+(M-1)*dr;

th=(0:dth:(N-1)*dth)';

[r,th]=meshgrid(r,th);

x=r.*cos(th);

y=r.*sin(th);

xR = x*sx + xRc;

yR = y*sy + yRc;

imP = interp2(imR, xR, yR); %interpolate (imR, xR, yR);

deepak lawrenceAnna SarantiNice work! In PolarToIm.m at line 31 is it perhaps : y = (yi - On)/sy; instead of : y = (yi - On)/sx ?

shoo chenThanks.

PetterLots of for-loops

SaifVery nice work !! thanks !

kinsam yenthank you. i need this function

Eleni VasilakiThanks a lot.

anitha sumathirequiring matlab codes for image normalization in iris recognition in image processing.

Danny LuongThank you, it works great for me!