Как изменить изображение с декартовой на полярные координаты в Matlab? - PullRequest
2 голосов
/ 28 сентября 2011

Я пытаюсь преобразовать пиксели изображения из координаты x-y в полярную координату, и у меня возникли проблемы с этим, так как я хочу кодировать функцию самостоятельно. Вот код, который я сделал до сих пор:

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

1 Ответ

15 голосов
/ 28 сентября 2011

Не совсем понятно, что вы пытаетесь сделать, поэтому я делаю собственный пример ...

Получив изображение, я преобразовываю координаты x / y пикселя из декартовой в полярную с помощью CART2POL .

На первом рисунке я показываю расположение точек, а на втором изображаю как исходное изображение, так и изображение с полярными координатами.

Обратите внимание, что я использую функцию 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


EDIT

Как я и говорил, вопрос неясен. Вы должны описать требуемое отображение в четко определенной манере ...

Для начала вам нужно подумать о том, где находится источник, прежде чем переходить к полярным координатам. В предыдущем примере предполагается, что источником является база осей в (0,0). Предположим, вы хотите взять центр изображения (w/2,h/2) в качестве исходного, тогда вместо этого вы сделаете следующее:

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

с остальной частью кода без изменений. Чтобы лучше проиллюстрировать эффект, рассмотрим исходное изображение с концентрическими окружностями , нарисованными в декартовых координатах, и обратите внимание на то, как они отображаются на прямые линии в полярных координатах при использовании центра окружностей в качестве источника:

concentric_circles


EDIT

Вот еще один пример того, как отображать изображение в полярных координатах в соответствии с запросом в комментариях. Обратите внимание, что мы выполняем сопоставление в обратном направлении 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...