Преобразование полярного изображения в декартово в MATLAB

У меня проблемы с преобразованием изображения в формате [R, theta] в [x, y]

Я пытаюсь использовать interp2.

[nZ,nX] = size(im);
theta = ((0:(nX-1)))*0.0071; %0.0071 is known angular separation of columns
rr = (0:(nZ-1))*0.0039; %0.0039 is resolution of rows

Затем я делаю:

%% Create grids and convert polar coordinates to rectangular
[THETA,RR] = meshgrid(theta,rr);
[XX,YY] = pol2cart(THETA,RR);

и наконец:

im_out=interp2(theta,rr,im,XX,YY,'linear');
im_out(isnan(im_out)) = 0;

но изображение неправильное!

Вот входное изображение (рис. 1) (с R, тета-геометрией):

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

Я хочу реконструировать это на декартовой сетке (используя interp2), чтобы это выглядело так (рис. 2):

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

Все данные в полярном изображении (рисунок 1) должны быть отображены в красный сектор декартова изображения (рисунок 2).


person 2one    schedule 14.01.2015    source источник
comment
Можете ли вы показать желаемое изображение и тот, который вы получаете?   -  person Cape Code    schedule 14.01.2015
comment
Вот исходное изображение (с тета-геометрией R): dropbox.com /s/g5vllc0puftqm9k/input.png?dl=0 Я хочу реконструировать это на декартовой сетке (используя interp2), чтобы это выглядело так: dropbox.com/s/yvmprufb5zc3e1a/required_output.png?dl=0   -  person 2one    schedule 15.01.2015
comment
Вы знаете, где находится центр полярной дискретизации на декартовой? Это явно не верхний левый угол.   -  person Cape Code    schedule 15.01.2015
comment
Все данные в полярном изображении (рисунок 1) должны быть отображены в красный сектор декартова изображения (рисунок 2). После использования interp2 NAN должен быть установлен на 0 (т. е. синяя область декартова изображения (игнорировать шум в красной области)). (0,0) на полярном изображении должно соответствовать верхнему левому углу красного сектора на декартовом изображении. Спасибо за помощь!   -  person 2one    schedule 15.01.2015
comment
(0,0) в полярном изображении отображается в (274,50) в декартовом изображении.   -  person 2one    schedule 15.01.2015


Ответы (1)


Мне удалось сделать это следующим образом:

Я добавил нули в верхнюю часть матрицы im, чтобы правильно определить радиус кривизны (в моем случае 1018 пикселей, т.е. ROC) и полярное начало:

im = IML';   % scan_lines (rotated for now)
sector=75;   % [degrees]
im_depth=16; % [cm] (depth + ROC)

ROC=3.98;
im_depth=16+ROC;

col_size=size(im,2);
zeros_row = zeros(1018, col_size);
im=[zeros_row; im];
scan_lines = im;

[nY, nX] = size(im);

min_ang=(sector/nX)*pi/180;% [rad.]
theta = -nX/2*min_ang:min_ang:nX/2*min_ang; % total angle/num. lines [radians]
theta = theta(2:end);

steering_angles=theta; % angles [radians]

num_samples=im_depth/nY;
rr = (0:(nY-1))*num_samples; % im. depth/num. samples
r = rr; 

image_size = [26.15,16+ROC]; % [cm]

x_resolution = 480; % image resolution [pix]
y_resolution = 640;

% assign the inputs
x = image_size(2);
y = image_size(1);

disp_rr=max(rr)/(im_depth-ROC);

%plot input image
%subplot(1,2,1); imagesc(theta*(180/pi), rr/disp_rr, fliplr(IML')); title('polar geometry'); colormap(gray)
%xlabel('theta [deg]')
%ylabel('r [cm]'); hold on;

% number of scan lines
Nt = length(scan_lines(1, :));

% create regular Cartesian grid to remap to
pos_vec_y_new = (0:1/(y_resolution-1):1).*y - y/2;
pos_vec_y_new = pos_vec_y_new';
pos_vec_x_new = (0:1/(x_resolution-1):1).*x;
[pos_mat_x_new, pos_mat_y_new] = ndgrid(pos_vec_x_new, pos_vec_y_new);

% convert new points to polar coordinates
[th_cart, r_cart] = cart2pol(pos_mat_x_new, pos_mat_y_new);

% interpolate using linear interpolation
op = interp2(steering_angles,r, scan_lines, th_cart, r_cart, 'linear').';

% set any values outside of the interpolation range to be 0
% op(isnan(op)) = max(b_mode(:));
op(isnan(op)) = 0;

%plot output image
subplot(2,2,4); 
imagesc(pos_vec_y_new, pos_vec_x_new-ROC, op'); title('Cartesian geometry'); colormap(gray); 
xlabel('lat [cm]')
ylabel('ax [cm]');
caxis([7.2,max(max(op))])
person 2one    schedule 16.01.2015
comment
Отличная работа. Я начал играть с твоим изображением, а потом мне пришлось отказаться от настоящей работы. - person Cape Code; 16.01.2015