3

画像のピクセルを xy 座標から極座標に変換しようとしていますが、関数を自分でコーディングしたいので問題があります。これまでに行ったコードは次のとおりです。

function [ newImage ] = PolarCartRot
% read and show the image
image= imread('1.jpg');
%%imshow(image);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%change to polar coordinate
[x y z]= size(image);
r = sqrt(x*x+y*y);
theta = atan2(y,x);
for i =0:r
    for j= 0:theta
newpixel = [i; j];
newImage(newpixel(1), newpixel(2),:) = image(i,j,:);
    end
end
figure;
imshow (newImage);
4

1 に答える 1

16

あなたが何をしようとしているのかははっきりしていません。それが私が自分の例を作っている理由です...

したがって、画像が与えられた場合、 CART2POLを使用してピクセルのx/y座標をデカルト座標から極座標に変換しています。

最初の図では、ポイントの位置を示しています。2番目の図では、元の画像と極座標の画像の両方をプロットしています。

ImageProcessingToolboxのWARP関数を使用していることに注意してください。内部では、SURF / SURFACE関数を使用して、テクスチャマッピングされた画像を表示します。

% load image 
load clown;
img = ind2rgb(X,map);
%img = imread(...);   % or use any other image

% convert pixel coordinates from cartesian to polar
[h,w,~] = size(img);
[X,Y] = meshgrid(1:w,1:h);
[theta,rho] = cart2pol(X, Y);
Z = zeros(size(theta));

% show pixel locations (subsample to get less dense points)
XX = X(1:8:end,1:4:end);
YY = Y(1:8:end,1:4:end);
tt = theta(1:8:end,1:4:end);
rr = rho(1:8:end,1:4:end);
subplot(121), scatter(XX(:),YY(:),3,'filled'), axis ij image
subplot(122), scatter(tt(:),rr(:),3,'filled'), axis ij square tight

% show images
figure
subplot(121), imshow(img), axis on
subplot(122), warp(theta, rho, Z, img), view(2), axis square

pixel_coords image_warped


編集

私が最初に述べたように、質問は明確ではありません。明確に定義された方法で必要なマッピングを記述する必要があります...

1つは、極座標に変換する前に、原点がどこにあるかを考える必要があります。前の例では、原点がの軸ベースであると想定してい(0,0)ます。画像の中心を(w/2,h/2)原点とし、代わりに次のようにします。

[X,Y] = meshgrid((1:w)-floor(w/2), (1:h)-floor(h/2));

残りのコードは変更されていません。効果をわかりやすく説明するために、デカルト座標で描かれた同心円のソースイメージを検討し、円の中心を原点として使用した場合に、それらが極座標の直線にどのようにマッピングされるかに注目してください。

concentric_circles


編集

コメントで要求された極座標で画像を表示する方法の別の例を次に示します。逆方向にマッピングを実行することに注意してくださいpol2cart

[h,w,~] = size(img);
s = min(h,w)/2;
[rho,theta] = meshgrid(linspace(0,s-1,s), linspace(0,2*pi));
[x,y] = pol2cart(theta, rho);
z = zeros(size(x));
subplot(121), imshow(img)
subplot(122), warp(x, y, z, img), view(2), axis square tight off

image_polar

ここでも、入力画像に直線をフィードして、極座標でどのようにマッピングされるかを確認すると、効果がよりよく示されます(垂直線は円になり、水平線は原点から放射される光線になります)。

Straight_lines

于 2011-09-28T16:44:47.733 に答える