图像变换-笛卡尔坐标变换到极坐标,再变换回来(MATLAB)
我一直在使用Peter Kovesi的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的函数名为“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,我很感激-谢谢。