当前位置: 首页 > 知识库问答 >
问题:

图像变换-笛卡尔坐标变换到极坐标,再变换回来(MATLAB)

秋兴思
2023-03-14

我一直在使用Peter Kovesi的MatLab函数进行机器视觉(如果你不知道的话,这些函数非常出色)
我一直在使用极坐标变换将图像转换为极坐标。Peter Kovesi的函数名为“PolarTrans”,可在此处找到-http://www.peterkovesi.com/matlabfns/#syntheticimages

该函数将图像漂亮地转换为极坐标。然而,我也希望发生相反的情况。Peter Kovesi使用interp2转换图像,但我似乎不知道如何反转此转换。interp2的一个要求是需要一个网格作为输入。

简而言之——你能帮我扭转这种转变吗:极性到笛卡尔。我希望它符合彼得的函数——即使用相同的参数来保持一致性。

亲爱的Swjm,我在这里发布我的回复,因为我在评论部分没有空间。
首先,非常感谢您的回复。您向我展示了如何反转interp2——这是我认为不可能的事情。这是向前迈出的一大步。然而,您的代码只映射了图像的一小部分。请参阅下面的演示代码以理解我的意思。

clc; clear all; close all;

gauss   = fspecial('gauss',64,15);
gauss   = uint8(mat2gray(gauss).*255);
[H,W]   = size(gauss);

pim = polartrans(gauss,64,360);

cim = carttrans(pim,64,64);

subplot(2,2,1);
imagesc(gauss); colormap(jet);
axis off;
title('Image to be Transformed');


subplot(2,2,2);
imagesc(pim); colormap(jet);
axis off;
title('Polar Representation');

subplot(2,2,3);
imagesc(cim);   colormap(jet);
axis off;
title('Back to Cartesian');

subplot(2,2,4);
diff = uint8(gauss) - uint8(cim);
imagesc(diff); colormap(jet);
axis off;
title('Difference Image');

共有1个答案

夏振国
2023-03-14

我已经看过了Kovesi的代码,这段代码应该执行反向转换。它假设您在polartrans中使用了“完整”形状和“线性”贴图参数。请注意,极轴变换通常在低径向值时会丢失分辨率(在高径向值时会获得分辨率),因此即使极轴图像的尺寸与原始图像的尺寸相同,也不会无损。

function im = carttrans(pim, nrows, ncols, cx, cy)

[rad, theta] = size(pim);      % Dimensions of polar image.

if nargin==3
    cx = ncols/2 + .5;         % Polar coordinate center, should match 
    cy = nrows/2 + .5;         % polartrans. Defaults to same.
end

[X,Y] = meshgrid(1:ncols, 1:nrows);

[TH,R] = cart2pol(X-cx,Y-cy);  % Polar coordinate arrays.
TH(TH<0) = TH(TH<0)+2*pi;      % Put angles in range [0, 2*pi].

rmax = max(R(:));              % Max radius.

xi = TH * (theta+1) / 2*pi;    % Query array for angles.
yi = R * rad / (rmax-1) + 1;   % Query array for radius.

pim = [pim pim(:,1)];          % Add first col to end of polar image.

[pX,pY] = meshgrid(1:theta+1, 1:rad);
im = interp2(pX, pY, pim, xi, yi);
 类似资料:
  • 我正在尝试将极坐标的图像转换为笛卡尔坐标。 将图像转换为极坐标的示例显式执行-想要一个光滑的矩阵方法 我原以为使用上述方法是小菜一碟,但事实并非如此!!如果有人发现我的代码有错误,请告诉我! 我发现非常奇怪的是,当我改变phi时,它会做出根本性的改变,而不是以我期望的方式! 干杯

  • 我想知道是否有人帮助我理解如何将顶部图像转换为底部图像。以下链接中提供了这些图像。顶部图像采用笛卡尔坐标。底部图像是极坐标中的转换图像

  • 我试图将图像从极坐标转换为笛卡尔坐标,但在应用公式后,我得到了浮点坐标(r和teta),我不知道如何使用x和y的浮点来表示空间中的点。可能有一种方法可以将它们转换为整数,并仍然保留分布,但我不知道如何。我知道OpenCV中有像warpPolar这样的函数,但我想自己实现它。任何想法都会有帮助:) 这是我的代码:

  • 我知道这个问题已经被回答了很多次,但是我不知道我做的是好是坏。 我得到了一个带有缺陷位置和图像ID的文件。图像大小为96*96。起源是(48,48) 由此计算R和T 然后,我为每个图像创建大小为96×96的空矩阵,对于图像1(例如),我在每个坐标(R,T)处赋值0 当我绘制矩阵时,我的结果很奇怪。。我错过了什么重要的事情吗?

  • 我无法将[R,theta]格式的图像转换为[x,y] 我正在尝试使用interp2。 然后我会: 最后: 但图像不正确! 以下是输入图像(图1)(带R,θ几何): 我想在笛卡尔网格上重建它(使用interp2),所以它看起来像这样(图2): 极坐标图像(图1)中的所有数据应映射到笛卡尔图像的红色部分(图2)。

  • 我正在尝试对图像执行对数极坐标变换,以便进行图像配准。换句话说,我正在努力实现这一点:输入图像- 我需要用Java从头开始编写代码,因为我将使用OpenCL Java绑定在GPU端完成这项工作,而不能使用库。这方面有多个线程,但没有一个能真正帮助我,主要是因为它们都使用内置的MATLAB函数,我无法复制。 为了让它发挥作用,我一直在尝试Polar Transform而不是Log-Polar Tra