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