图像转换 - 笛卡儿到极地,再回来(MATLAB)

时间:2017-01-19 12:39:12

标签: matlab image-processing transform polar-coordinates

我一直在使用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');

1 个答案:

答案 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);