В этом примере показано множество свойств геометрических преобразований путем применения различных преобразований к шахматному изображению.
Двумерное геометрическое преобразование - это отображение, которое связывает каждую точку евклидовой плоскости с другой точкой евклидовой плоскости. В этих примерах геометрическое преобразование определяется правилом, которое подсказывает, как сопоставить точку с декартовыми координатами (x, y) с другой точкой с декартовыми координатами (u, v). Шахматный шаблон помогает визуализировать координатную сетку в плоскости входного изображения и тип искажения, вносимого каждым преобразованием.
checkerboard создает изображение, которое имеет прямоугольные плитки и четыре уникальных угла, что позволяет легко увидеть, как шашечное изображение искажается геометрическими преобразованиями.
После выполнения этого примера попробуйте изменить изображение I к любимому изображению.
sqsize = 60;
I = checkerboard(sqsize,4,4);
nrows = size(I,1);
ncols = size(I,2);
fill = 0.3;
imshow(I)
title('Original')
Нерефлективные преобразования подобия могут включать вращение, масштабирование и перемещение. Формы и углы сохранены. Параллельные линии остаются параллельными. Прямые линии остаются прямыми.
Для неотражающего подобия,
] T
T - матрица 3 на 3, которая зависит от 4 параметров.
% Try varying these 4 parameters. scale = 1.2; % scale factor angle = 40*pi/180; % rotation angle tx = 0; % x translation ty = 0; % y translation sc = scale*cos(angle); ss = scale*sin(angle); T = [ sc -ss 0; ss sc 0; tx ty 1];
Поскольку нерефлексивное сходство является подмножеством аффинных преобразований, создайте affine2d объект с использованием:
t_nonsim = affine2d(T); I_nonreflective_similarity = imwarp(I,t_nonsim,'FillValues',fill); imshow(I_nonreflective_similarity); title('Nonreflective Similarity')

Если изменить либо tx или ty при ненулевом значении можно заметить, что оно не влияет на выходное изображение. Если вы хотите видеть координаты, которые соответствуют вашему преобразованию, включая перевод, включите пространственную ссылочную информацию:
[I_nonreflective_similarity,RI] = imwarp(I,t_nonsim,'FillValues',fill); imshow(I_nonreflective_similarity,RI) axis on title('Nonreflective Similarity (Spatially Referenced)')

Обратите внимание, что передача выходного объекта пространственной ссылки RI от imwarp раскрывает перевод. Чтобы указать, какую часть выходного изображения вы хотите увидеть, используйте пару имя-значение OutputView в imwarp функция.
При преобразовании подобия подобные треугольники отображаются на подобные треугольники. Нерефлективные преобразования подобия являются подмножеством преобразований подобия.
Для подобия уравнение такое же, как для неотражающего подобия:
] T
T является матрицей 3 на 3, которая зависит от 4 параметров плюс необязательное отражение.
% Try varying these parameters. scale = 1.5; % scale factor angle = 10*pi/180; % rotation angle tx = 0; % x translation ty = 0; % y translation a = -1; % -1 -> reflection, 1 -> no reflection sc = scale*cos(angle); ss = scale*sin(angle); T = [ sc -ss 0; a*ss a*sc 0; tx ty 1];
Поскольку сходства являются подмножеством аффинных преобразований, создайте affine2d объект с использованием:
t_sim = affine2d(T);
Как и в приведенном выше примере преобразования, извлеките выходной объект пространственной ссылки RI от imwarp функция и пройти RI кому imshow чтобы показать отражение.
[I_similarity,RI] = imwarp(I,t_sim,'FillValues',fill); imshow(I_similarity,RI) axis on title('Similarity')

При аффинном преобразовании размеры x и y могут быть масштабированы или срезаны независимо, и может быть перемещение, отражение и/или вращение. Параллельные линии остаются параллельными. Прямые линии остаются прямыми. Сходство - это подмножество аффинных преобразований.
Для аффинного преобразования уравнение такое же, как для подобия и нерефлективного подобия:
] T
T является матрицей 3 на 3, где все шесть элементов первого и второго столбцов могут быть разными. Третий столбец должен быть [0; 0; 1].
% Try varying the definition of T. T = [1 0.3 0; 1 1 0; 0 0 1]; t_aff = affine2d(T); I_affine = imwarp(I,t_aff,'FillValues',fill); imshow(I_affine) title('Affine')

В проективном преобразовании квадрилатерали отображаются в квадрилатерали. Прямые линии остаются прямыми, но параллельные линии не обязательно остаются параллельными. Аффинные преобразования являются подмножеством проективных преобразований.
Для проективного преобразования:
] T
upwp
vpwp
T - матрица 3 на 3, где все девять элементов могут быть разными.
ADGBEHCFI]
Приведенное выше матричное уравнение эквивалентно этим двум выражениям:
CGx + Hy + I
FGx + Hy + I
Попробуйте изменить любой из девяти элементов T.
T = [1 0 0.002;
1 1 0.0002;
0 0 1 ];
t_proj = projective2d(T);
I_projective = imwarp(I,t_proj,'FillValues',fill);
imshow(I_projective)
title('Projective')
При кусочно-линейном преобразовании аффинные преобразования применяются отдельно к областям изображения. В этом примере верхняя левая, верхняя правая и нижняя левая точки шахматной доски остаются неизменными, но треугольная область в нижней правой части изображения растягивается так, что правый нижний угол преобразованного изображения на 50% дальше вправо и на 20% ниже исходной координаты.
movingPoints = [0 0; 0 nrows; ncols 0; ncols nrows;]; fixedPoints = [0 0; 0 nrows; ncols 0; ncols*1.5 nrows*1.2]; t_piecewise_linear = fitgeotrans(movingPoints,fixedPoints,'pwl'); I_piecewise_linear = imwarp(I,t_piecewise_linear,'FillValues',fill); imshow(I_piecewise_linear) title('Piecewise Linear')

Этот пример и следующие два примера показывают, как можно создать явное отображение, чтобы связать каждую точку в обычной сетке (xi, yi) с другой точкой (ui, vi). Это сопоставление хранится в geometricTranform2d объект, который используется imwarp для преобразования изображения.
При этом синусоидальном преобразовании координата x каждого пикселя остается неизменной. Координата y каждого ряда пикселей сдвигается вверх или вниз, следуя синусоидальному рисунку.
a = ncols/12; % Try varying the amplitude of the sinusoid ifcn = @(xy) [xy(:,1), xy(:,2) + a*sin(2*pi*xy(:,1)/nrows)]; tform = geometricTransform2d(ifcn); I_sinusoid = imwarp(I,tform,'FillValues',fill); imshow(I_sinusoid); title('Sinusoid')

Искажение ствола возмущает изображение радиально наружу от его центра. Искажение больше дальше от центра, что приводит к выпуклым сторонам.
Сначала определите функцию, отображающую индексы пикселей на расстояние от центра. Используйте meshgrid для создания массивов координат x и y каждого пикселя с началом координат в левом верхнем углу изображения.
[xi,yi] = meshgrid(1:ncols,1:nrows);
Переместите начало координат в центр изображения. Затем преобразуйте декартовы координаты x и y в цилиндрический угол (theta) и радиус (r) координат с использованием cart2pol функция. r изменяется линейно по мере увеличения расстояния от центрального пикселя.
xt = xi - ncols/2; yt = yi - nrows/2; [theta,r] = cart2pol(xt,yt);
Определите амплитуду, a, кубического термина. Этот параметр является регулируемым. Затем добавьте кубический термин к r чтобы r изменяется нелинейно с расстоянием от центрального пикселя.
a = 1; % Try varying the amplitude of the cubic term.
rmax = max(r(:));
s1 = r + r.^3*(a/rmax.^2);Преобразовать обратно в декартову систему координат. Переместите начало координат назад в правый верхний угол изображения.
[ut,vt] = pol2cart(theta,s1); ui = ut + ncols/2; vi = vt + nrows/2;
Сохранить сопоставление между (xi,yi) и (ui,vi) в geometricTranform2d объект. Использовать imwarp преобразование изображения в соответствии с отображением пикселей.
ifcn = @(c) [ui(:) vi(:)]; tform = geometricTransform2d(ifcn); I_barrel = imwarp(I,tform,'FillValues',fill); imshow(I_barrel) title('Barrel')

Искажение штырьковой подушки является обратным искажению ствола, поскольку кубический член имеет отрицательную амплитуду. Искажение все еще больше дальше от центра, но искажение проявляется как вогнутые стороны.
Вы можете начать с того же theta и r значения для преобразования ствола. Определите другую амплитуду b кубического члена. Этот параметр является регулируемым. Затем вычесть кубический член в r чтобы r изменяется нелинейно с расстоянием от центрального пикселя.
b = 0.4; % Try varying the amplitude of the cubic term.
s = r - r.^3*(b/rmax.^2);Преобразовать обратно в декартову систему координат. Переместите начало координат назад в правый верхний угол изображения.
[ut,vt] = pol2cart(theta,s); ui = ut + ncols/2; vi = vt + nrows/2;
Сохранить сопоставление между (xi,yi) и (ui,vi) в geometricTranform2d объект. Использовать imwarp преобразование изображения в соответствии с отображением пикселей.
ifcn = @(c) [ui(:) vi(:)]; tform = geometricTransform2d(ifcn); I_pin = imwarp(I,tform,'FillValues',fill); imshow(I_pin) title('Pin Cushion')

figure subplot(3,3,1),imshow(I),title('Original') subplot(3,3,2),imshow(I_nonreflective_similarity),title('Nonreflective Similarity') subplot(3,3,3),imshow(I_similarity),title('Similarity') subplot(3,3,4),imshow(I_affine),title('Affine') subplot(3,3,5),imshow(I_projective),title('Projective') subplot(3,3,6),imshow(I_piecewise_linear),title('Piecewise Linear') subplot(3,3,7),imshow(I_sinusoid),title('Sinusoid') subplot(3,3,8),imshow(I_barrel),title('Barrel') subplot(3,3,9),imshow(I_pin),title('Pin Cushion')

Обратите внимание, что subplot изменяет масштаб отображаемых изображений.
affine2d | LocalWeightedMeanTransformation2D | PiecewiseLinearTransformation2D | PolynomialTransformation2D | projective2d