如何在Matlab中将图像从笛卡尔坐标变为极坐标?

hin*_*han 2 matlab image-processing polar-coordinates

我试图将图像的像素从xy坐标转换为极坐标,我有问题,因为我想自己编写函数.这是我到目前为止所做的代码:

function [ newImage ] = PolarCartRot
% read and show the image
image= imread('1.jpg');
%%imshow(image);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%change to polar coordinate
[x y z]= size(image);
r = sqrt(x*x+y*y);
theta = atan2(y,x);
for i =0:r
    for j= 0:theta
newpixel = [i; j];
newImage(newpixel(1), newpixel(2),:) = image(i,j,:);
    end
end
figure;
imshow (newImage);
Run Code Online (Sandbox Code Playgroud)

Amr*_*mro 15

目前还不是很清楚你要做什么,这就是为什么我要做出自己的榜样......

因此,给定一个图像,我使用CART2POL将像素x/y坐标从笛卡尔坐标转换为极坐标.

在第一张图中,我显示了点的位置,在第二张图中,我绘制了原始图像和带有极坐标的图像.

请注意,我正在使用图像处理工具箱中的WARP功能.在引擎盖下,它使用SURF/SURFACE功能显示纹理映射图像.

% load image 
load clown;
img = ind2rgb(X,map);
%img = imread(...);   % or use any other image

% convert pixel coordinates from cartesian to polar
[h,w,~] = size(img);
[X,Y] = meshgrid(1:w,1:h);
[theta,rho] = cart2pol(X, Y);
Z = zeros(size(theta));

% show pixel locations (subsample to get less dense points)
XX = X(1:8:end,1:4:end);
YY = Y(1:8:end,1:4:end);
tt = theta(1:8:end,1:4:end);
rr = rho(1:8:end,1:4:end);
subplot(121), scatter(XX(:),YY(:),3,'filled'), axis ij image
subplot(122), scatter(tt(:),rr(:),3,'filled'), axis ij square tight

% show images
figure
subplot(121), imshow(img), axis on
subplot(122), warp(theta, rho, Z, img), view(2), axis square
Run Code Online (Sandbox Code Playgroud)

pixel_coords image_warped


编辑

正如我最初所说,问题不明确.您必须以明确定义的方式描述所需的映射...

首先,您需要在转换为极坐标之前考虑原点的位置.前面的例子假设原点是轴的基础(0,0).假设您想将图像的中心(w/2,h/2)作为原点,那么您可以这样做:

[X,Y] = meshgrid((1:w)-floor(w/2), (1:h)-floor(h/2));
Run Code Online (Sandbox Code Playgroud)

其余代码不变.为了更好地说明效果,请考虑使用笛卡尔坐标绘制的同心圆的源图像,并注意当使用圆心作为原点时它们如何映射到极坐标中的直线:

concentric_circles


编辑

这是另一个如何在评论中请求的极坐标中显示图像的示例.请注意,我们以相反的方向执行映射pol2cart:

[h,w,~] = size(img);
s = min(h,w)/2;
[rho,theta] = meshgrid(linspace(0,s-1,s), linspace(0,2*pi));
[x,y] = pol2cart(theta, rho);
z = zeros(size(x));
subplot(121), imshow(img)
subplot(122), warp(x, y, z, img), view(2), axis square tight off
Run Code Online (Sandbox Code Playgroud)

image_polar

如果你用直线输入一个输入图像,看看它们如何在极坐标中绘制(垂直线变成圆圈,水平线变成从原点发出的光线),效果会更好地显示:

直线

  • @hinatachan:它是一个非常简单的函数:替换`[theta rho] = cart2pol(X,Y);```theta = atan2(Y,X);`和`rho = sqrt(X. ^ 2 + Y. ^ 2);`就像你已经在你的问题中做过的那样(尽管我们使用的是矩阵而不是标量) (2认同)
  • @Masi:你尝试过吗?该示例按原样完成...“X”和“map”均来自 MATLAB 附带的“clown.mat”;它加载索引图像及其相应的颜色图。至于 360 旋转映射图像,我添加了另一个示例,请参阅编辑.. (2认同)
  • @Masi:这确实是 MATLAB 中的基本图像处理...我更新了示例,以便您可以使用您想要的任何图像。您可以在此处阅读有关不同图像类型的更多信息(索引、灰度、真彩色):https://www.mathworks.com/help/matlab/creating_plots/image-types.html (2认同)