将图像从笛卡儿转换为极地

时间:2016-01-09 15:13:18

标签: image matlab image-processing polar-coordinates

我正在尝试转换具有相同中心的多个圆圈的图像,从笛卡儿到极地(这样新图像将是圆圈而不是圆圈,请参见下图),这样就可以了使用以下代码就好了:

[r, c] = size(img);
r=floor(r/2);
c=floor(c/2);
[X, Y] = meshgrid(-c:c-1,-r:r-1);
[theta, rho] = cart2pol(X, Y); 
subplot(221), imshow(img), axis on;
hold on;
subplot(221), plot(xCenter,yCenter, 'r+');
subplot(222), warp(theta, rho, zeros(size(theta)), img);
view(2), axis square;

问题是,我不明白它为什么会起作用? (显然这不是我的代码),我的意思是,当我使用函数cart2pol时,我甚至不使用图像,它只是从meshgrid函数生成的一些向量x和y。 另一个问题是,我想以某种方式获得一个新的图像(不仅仅是能够用包裹函数绘制它),这是原始图像,但是通过theta和rho坐标(意味着相同的像素,但重新排列)......我甚至不确定如何问这个,最后我想要一个矩阵的图像,这样我就可以对每一行求和并将矩阵转换为列向量...

example

1 个答案:

答案 0 :(得分:4)

您可以将图像视为2D矩阵,其中每个像素都有一个X和Y坐标

[(1,1)    (1,2)    (1,3)   ....   (1,c)]
[(2,1)    (2,2)    (2,3)   ....   (2,c)]
[(3,1)    (3,2)    (3,3)   ....   (3,c)]
[....     ....     ....    ....   .... ]
[(r,1)    (r,2)    (r,3)   ....   (r,c)]

在您发布的代码中,它使用图像中心floor(c/2)和{{1将这些(X,Y)坐标中的每一个映射到它的等效极坐标(R,theta)作为参考点。

floor(r/2)

因此,用于(1,1)的任何像素值现在都应显示在% Map pixel value at (1,1) to it's polar equivalent [r,theta] = cart2pol(1 - floor(r/2),1 - floor(c/2)); 的新极坐标空间中。重要的是要注意,要进行此转换,图像中实际像素值的信息不重要,而只是我们只想对图像中的每个像素执行此转换。

首先,我们找出图像中心的位置:

(r,theta)

然后我们计算出图像中每个点的(X,Y)坐标(在中心已被减去之后

[r, c] = size(img);
r = floor(r / 2);
c = floor(c / 2);

现在将所有这些笛卡尔坐标转换为极坐标

[X, Y] = meshgrid(-c:c-1,-r:r-1);

warp现在所做的一切,就是说"在(the,rho)&#的相应位置显示[theta, rho] = cart2pol(X, Y); 在(X,Y)处的值{ 34;

img

现在看来你想要一个尺寸为[nTheta,nRho]的新2D图像。为此,您可以使用griddata将分散的(theta,rho)图像(由上面的warp(theta, rho, zeros(size(theta)), img); 显示)插入到常规网格中。

warp

查看% These is the spacing of your radius axis (columns) rhoRange = linspace(0, max(rho(:)), 100); % This is the spacing of your theta axis (rows) thetaRange = linspace(-pi, pi, 100); % Generate a grid of all (theta, rho) coordinates in your destination image [T,R] = meshgrid(thetaRange, rhoRange); % Now map the values in img to your new image domain theta_rho_image = griddata(theta, rho, double(img), T, R); 的所有interpolation methods,找出最适合您情景的内容。

还有一些其他问题(如中心的四舍五入)导致结果略有不正确。下面提供了一个完整的工作示例

griddata

结果

enter image description here