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