我试图计算一种将笛卡尔坐标系中的图像转换为极坐标的有效方法。我知道像ImToPolar这样的一些功能正在做它并且它工作得很好但是需要花费相当多的时间来处理大图像,特别是当它们需要来回处理时。
这是我的输入图片:
然后我使用以0为中心的笛卡尔网格和函数cart2pol()
生成极坐标网格。最后,我使用mesh(theta, r, Input)
绘制我的图像。
这就是我获得的:
它正好是我需要的图像,它与ImToPolar
相同或更好。
由于MATLAB知道如何计算它,有人知道如何从这个输出中提取极坐标表示的矩阵吗?或者可能是快速(如快速傅里叶变换)方法在MATLAB上计算极坐标变换(和反向)?
答案 0 :(得分:0)
pol2cart
以及meshgrid
和interp2
足以创建结果:
I=imread('http://i.stack.imgur.com/HYSyb.png');
[r, c,~] = size(I);
%rgb image can be converted to indexed image to prevent excessive copmutation for each color
[idx, mp] = rgb2ind(I,32);
% add offset to image coordinates
x = (1:c)-(c/2);
y = (1:r)-(r/2);
% create distination coordinates in polar form so value of image can be interpolated in those coordinates
% angle ranges from 0 to 2 * pi and radius assumed that ranges from 0 to 400
% linspace(0,2*pi, 200) leads to a stretched image try it!
[xp yp] = meshgrid(linspace(0,2*pi), linspace(0,400));
%translate coordinate from polar to image coordinates
[xx , yy] = pol2cart(xp,yp);
% interpolate pixel values for unknwon coordinates
out = interp2(x, y, idx, xx, yy);
% save the result to a file
imwrite(out, mp, 'result.png')