2011-09-28 9 views
1

J'essaie de convertir les pixels d'une image à partir d'une coordonnée x-y en coordonnées polaires et j'ai un problème avec elle, car je veux coder la fonction par moi-même. Voici le code que je l'ai fait jusqu'à présent:Comment changer une image du coordonnées cartésiennes en coordonnées Polaires à Matlab?

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); 
+3

Il est pas clair ce que vous êtes après. Pouvez-vous ajouter une description plus claire de ce que vous voulez. Par exemple: "pour chaque pixel (i, j) dans la nouvelle image, alors je veux ..." – Nzbuu

+0

ce que je veux est d'écrire la fonction cart2pol avec mon propre code comme la réponse ci-dessous pas utiliser celui de matlab –

Répondre

13

Il est pas tout à fait clair ce que vous essayez de faire, ce qui est la raison pour laquelle je fais mon exemple ...

donc donné une image, Je convertis les coordonnées pixel x/y de cartésiennes à polaires avec CART2POL.

Dans la première figure, je montre les emplacements des points, et dans la seconde, je trace à la fois l'image originale et celle avec des coordonnées polaires.

Notez que j'utilise la fonction WARP à partir de Image Processing Toolbox. Sous le capot, il utilise la fonction SURF/SURFACE pour afficher une image mappée en texture.

% 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


EDIT

Comme je l'ai dit à l'origine, la question est pas claire. Vous devez décrire la cartographie que vous voulez d'une manière bien définie ...

Pour un, vous devez penser à l'emplacement de l'origine avant de convertir en coordonnées polaires. L'exemple précédent suppose que l'origine est la base des axes à (0,0). Supposons que vous voulez prendre le centre de l'image (w/2,h/2) comme origine, alors vous feriez ceci:

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

avec le reste du code inchangé. Pour mieux illustrer l'effet, considérer une image source avec concentric circles tracée en coordonnées cartésiennes, et notez comment ils correspondent aux lignes droites en coordonnées polaires lors de l'utilisation du centre des cercles comme origine:

concentric_circles


EDIT

Voici un autre exemple d'affichage d'une image en coordonnées polaires comme demandé dans les commentaires. Notez que nous effectuons la mise en correspondance dans le sens inverse 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

Encore une fois l'effet est meilleur spectacle si vous nourrissez une image d'entrée avec des lignes droites, et voir comment ils carte en coordonnées polaires (lignes verticales deviennent des cercles et des lignes horizontales deviennent des rayons émanant de l'origine):

straight_lines

+0

je dois le convertir sans utiliser cart2pol –

+2

@hinatachan: c'est une fonction très simple: Remplacer' [theta rho] = cart2pol (X, Y); 'avec' theta = atan2 (Y, X); 'et' rho = sqrt (X.^2 + Y.^2); 'comme vous l'avez déjà fait dans votre question (bien que nous travaillent avec des matrices et non des scalaires) – Amro

+1

@Masi: l'avez-vous même essayé? L'exemple est complet tel quel ... ... '' '' et 'map' proviennent tous les deux de' clown.mat' qui est fourni avec MATLAB; Pour ce qui est de l'image mappée à 360 rotations, j'ai ajouté un autre exemple, voir l'édition .. – Amro

Questions connexes