В этом примере показаны многие свойства геометрических преобразований путем применения различных преобразований к шахматному изображению.
Двумерное геометрическое преобразование является отображением, которое связывает каждую точку в евклидовой плоскости с другой точкой в евклидовой плоскости. В этих примерах геометрическое преобразование определяется правилом, которое сообщает, как сопоставить точку с Декартовыми координатами (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
является матрицей 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
является матрицей 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
является матрицей 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 является матрицей 3 на 3, где все девять элементов могут быть различными.
Вышеприведенное матричное уравнение эквивалентно этим двум выражениям:
Попробуйте изменить любой из девяти элементов 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