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

图像变换-笛卡尔坐标变换到极坐标,再变换回来(MATLAB),matlab,image-processing,transform,polar-coordinates,Matlab,Image Processing,Transform,Polar Coordinates,我一直在使用Peter Kovesi的MatLab函数进行机器视觉(如果你不知道的话,这些函数非常出色)。 我一直在使用极坐标变换将图像转换为极坐标。Peter Kovesi的函数名为“PolarTrans”,可在此处找到- 该函数将图像漂亮地转换为极坐标。然而,我希望相反的情况也会发生。Peter Kovesi使用interp2转换图像,但我似乎不知道如何反转此转换。interp2的一个要求是需要一个网格作为输入 简言之,你能帮我扭转这种转变吗:从极坐标到笛卡尔坐标。我希望它与Peter的函

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

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

简言之,你能帮我扭转这种转变吗:从极坐标到笛卡尔坐标。我希望它与Peter的函数一致,即使用相同的参数进行一致性

亲爱的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');

我已经看过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);
函数im=carttrans(pim、nrows、ncols、cx、cy)
[rad,theta]=尺寸(pim);%极坐标图像的尺寸。
如果nargin==3
cx=ncols/2+.5;%极坐标中心,应匹配
cy=nrows/2+.5;%波兰特兰斯。默认为相同。
结束
[X,Y]=网格网格(1:ncols,1:nrows);
[TH,R]=cart2pol(X-cx,Y-cy);%极坐标阵列。

真实航向(TH有一个内置函数
pol2cart
谢谢你的评论-你能告诉我它是如何按照Peter Kovesi的函数工作的吗?基本上,给定一个转换后的图像,你能告诉我如何使用pol2cart和我上面链接的函数的输出。我熟悉pol2cart,但我需要一个反向转换。)尽可能保留图像的信息。此人似乎有类似的困难,pol2cart不合适。他的问题仍然没有解决-您是否在网上搜索了一些帮助?我在简短搜索后发现了此信息和其他信息:感谢您提供的链接。我实际上正在使用该实现,但它是我的太慢了!Peter Kovesi的函数运行在当时的一个阵营中。我还发现使用Im2Polar时图像有一些扭曲。感谢您的输入,但我想反转我最初链接的函数中使用的interp2函数。非常感谢您的回复swjm。您的映射似乎只映射了一小部分se但是,我已经编辑了上面的问题,因为我没有空间来粘贴代码。你知道为什么会发生这种情况吗?你已经告诉我如何反转interp2,我很感激-谢谢。