примеры преобразования изображения в полярные координаты делают это явно - нужен гладкий матричный метод

Я пытаюсь преобразовать изображение из декартовых в полярные координаты.

Я знаю, как это сделать явно, используя циклы for, но я ищу что-то более компактное.

Я хочу сделать что-то вроде:

[x y] = size(CartImage);
minr = floor(min(x,y)/2);

r = linspace(0,minr,minr);
phi = linspace(0,2*pi,minr);

[r, phi] = ndgrid(r,phi);

PolarImage = CartImage(floor(r.*cos(phi)) + minr, floor(r.sin(phi)) + minr);

Но это явно не работает.

В основном я хочу иметь возможность индексировать CartImage в сетке.

Затем полярное изображение будет определено на сетке.


person user1751512    schedule 16.10.2012    source источник
comment
Попробуйте cart2pol   -  person chaohuang    schedule 17.10.2012


Ответы (2)


учитывая матрицу M (для этого примера просто 2d Gaussian) и известную исходную точку (X0,Y0), из которой происходит полярное преобразование, мы ожидаем, что круги изоинтенсивности преобразуются в линии изоинтенсивности:

 M=fspecial('gaussian',256,32); % generate fake image
 X0=size(M,1)/2; Y0=size(M,2)/2;
 [Y X z]=find(M);
 X=X-X0; Y=Y-Y0;
 theta = atan2(Y,X);
 rho = sqrt(X.^2+Y.^2);

 % Determine the minimum and the maximum x and y values:
 rmin = min(rho); tmin = min(theta);
 rmax = max(rho); tmax = max(theta);

 % Define the resolution of the grid:
 rres=128; % # of grid points for R coordinate. (change to needed binning)
 tres=128; % # of grid points for theta coordinate (change to needed binning)

 F = TriScatteredInterp(rho,theta,z,'natural');

 %Evaluate the interpolant at the locations (rhoi, thetai).
 %The corresponding value at these locations is Zinterp:

 [rhoi,thetai] = meshgrid(linspace(rmin,rmax,rres),linspace(tmin,tmax,tres));
 Zinterp = F(rhoi,thetai);

 subplot(1,2,1); imagesc(M) ; axis square
 subplot(1,2,2); imagesc(Zinterp) ; axis square

введите здесь описание изображения

получение неправильного (X0,Y0) будет отображаться как деформации в преобразовании, поэтому будьте осторожны и проверьте это.

person bla    schedule 17.10.2012
comment
Уважаемый Нейт! Спасибо за ваш ответ. Это именно то, что я искал... не могли бы вы сказать мне, почему верхний левый угол полярного изображения синий, а не красный? Спасибо. - person user1751512; 20.10.2012
comment
На самом деле это значение NaN (а не ноль) в углах. Причина в методе интерполяции, который я использовал при интерполяции с TriScatteredInterp. Вы можете изменить «естественный» на «ближайший», если это вас беспокоит. Это должно решить эту проблему. - person bla; 20.10.2012

Я замечаю, что ответ от bla - от полярных до декартовых координат. Однако вопрос в другом.

I=imread('output.png');   %read image
I1=flipud(I);
A=imresize(I1,[1024 1024]);
A1=double(A(:,:,1));
A2=double(A(:,:,2));
A3=double(A(:,:,3));  %rgb3 channel to double
[m n]=size(A1);
[t r]=meshgrid(linspace(-pi,pi,n),1:m); %Original coordinate

M=2*m;
N=2*n;
[NN MM]=meshgrid((1:N)-n-0.5,(1:M)-m-0.5);
T=atan2(NN,MM);
R=sqrt(MM.^2+NN.^2);                  

B1=interp2(t,r,A1,T,R,'linear',0);
B2=interp2(t,r,A2,T,R,'linear',0);
B3=interp2(t,r,A3,T,R,'linear',0); %rgb3 channel Interpolation
B=uint8(cat(3,B1,B2,B3));        

subplot(211),imshow(I);  %draw the Original Picture
subplot(212),imshow(B);  %draw the result
person Andln    schedule 05.05.2015