我一直在使用Peter Kovesi的MatLab功能来实现机器视觉(如果您不了解它们,这些功能非常出色)。
我一直在使用极坐标变换将图像转换为极坐标。 Peter Kovesi的功能名为'PolarTrans',可以在这里找到 -
http://www.peterkovesi.com/matlabfns/#syntheticimages
该功能可将图像精美地转换为极坐标。但是,我也希望反过来发生。 Peter Kovesi使用interp2来转换图像,但我似乎无法弄清楚如何逆转这种转换。 interp2的一个要求是它需要一个meshgrid作为输入。
简而言之 - 你能帮助我扭转变革:极地到笛卡尔。我希望它符合彼得的功能 - 即使用相同的参数来实现连贯性。
亲爱的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');
答案 0 :(得分:2)
我已经看过Kovesi的代码了,这段代码应该执行逆向转换。它假设您使用了“完整”的#39;形状和线性'在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);