Деформация изображения на основе линий с разными ориентациями - PullRequest
4 голосов
/ 30 мая 2011

Я хотел бы деформировать изображение на основе линий, заданных с различной ориентацией:

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

Я бы использовал interp2, поскольку у меня уже есть X, Y и Z, и я бы сделал Xi и Yi с координатами, полученными для каждой строки.Тем не менее, как бы вы:

  • не делали цикл for, индекс которого охватывает все количество строк?
  • убедитесь, что каждый столбец в выходном искаженном изображении одинаковразмер?
  • выборка входного изображения с радиальными линиями?
  • самый сложный вопрос, на мой взгляд, как бы вы сохранили структуру соседства, даже если бы я использовал разные ориентации: например, линии горизонта (ряды) левой части входного изображения и радиальные линии для правой части?

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

Вот код, который у меня есть (пока нет interp2, так как я не решил проблемы, описанные выше).

close all

%% Image
Z = imread('tire.tif');
% The corresponding mesh
sz = size(Z);
[X,Y] = meshgrid(1:sz(2), 1:sz(1));

%% Line
lineEquation = @(c, v) (v(1)*(X-c(2))+v(2)*(Y-c(1)))/norm(v);
getLine = @(c, v) abs(lineEquation(c, v))<1/2;
% Example
c = [93, 109];
v = [2, 1];
line = getLine(c, v);

%% Circle
circleEquation = @(c, r) ((X-c(2)).^2+(Y-c(1)).^2-r^2)/r^2;
getCircle = @(c, r) abs(circleEquation(c, r))<1/r;
% Example
r = 24;
circle = getCircle(c, r);

%% Plot a sequence of line
figure;
for delta = -1:0.1:1
        v = [0.1, delta];
        line_delta = getLine(c, v);
        Z_line = Z;
        Z_line(line_delta) = 255;
        imagesc(Z_line);
        colormap('gray');
        pause(0.05);
end

%% Plot examples
figure;

subplot(221);
imagesc(Z); 
title('Image');

subplot(222);
Z_line = Z;
Z_line(line) = 255;
imagesc(Z_line);
title('Line');

subplot(223);
Z_circle = Z;
Z_circle(circle) = 255;
imagesc(Z_circle);
title('Circle');

subplot(224);
% TODO
title('Warped image');

colormap('gray');

Вот различные выходные данные:

Examples

Lines

Circles


Вот искаженное изображение: Warped image

Вот кодиз ответа:

[ANG, RAD] = meshgrid(0:0.01:2*pi, 0:0.5:166);
XI = c(2) + cos(ANG).*RAD;
YI = c(1) + sin(ANG).*RAD;
WARPED = interp2(X, Y, double(Z), XI, YI);

WARPED(isnan(WARPED))= max(WARPED(:));
imagesc(WARPED);
title('Warped image');
colormap('gray');

Ответы [ 2 ]

3 голосов
/ 31 мая 2011

Ваша основная проблема (я думаю) - это построение матриц XI и YI, необходимых для interp2 .Вы создаете их, понимая, что в вашем новом изображении горизонтальная ось представляет угол линии, а вертикальная ось представляет расстояние от центра круга, чтобы построить их:

%% angle from 360 to 0, radius from 0 to 100 
%% resulting image will be 361 x 101 pixels
[ANG, RAD] = meshgrid(360:-1:0,0:100); 
%% I take the centre of the circle at (93, 109) Is this correct?
%% From there you can create XI and YI 
%% from the angle and radius you have at each point
XI = ones(size(ANG))*93 + cos(ANG/(2*PI)).*RAD;
YI = ones(size(ANG))*109 + sin(ANG/(2*PI)).*RAD;

WARPED = interp2(X,Y,Z, XI, YI)

Выход будетбыть сильно искаженным (конечно), потому что круг на каждом радиусе растянут до одинаковой длины.Вдоль линий искажения будут минимальными.Если все идет хорошо, и мое мат-фу не покинуло меня, это должно дать вам развернутое изображение шины, вырезанной по линии от центра вправо.

2 голосов
/ 31 мая 2011

Лучший способ: Используйте полиномиальное преобразование второго порядка, чтобы преобразовать все круги в линии, а затем просто обрежьте нужные вам линии. Используйте 2 команды Matlab cp2tform () с параметром 'polynomial' и imtransform () Установите внутри преобразования T значения 1 для x ^ 2 и y ^ 2, чтобы создать круг и сдвиг, чтобы определить центральный пиксель шины.

Извините, что я не предоставляю код, так как я отвечаю с iPhone. Постскриптум Проверьте справку Matlab о полиномиальном и конформном преобразовании Они делают именно то, что вам нужно.

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