Я хотел бы деформировать изображение на основе линий, заданных с различной ориентацией:
- для каждой строки на входном изображении, я могу получить координаты пикселей на линии
- тогда я бы сопоставил эти пиксели с деформированным изображением, чтобы каждая строка теперь была столбцом.
Я бы использовал 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');
Вот различные выходные данные:
Вот искаженное изображение:
Вот кодиз ответа:
[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');