Создайте галерею преобразованных изображений

В этом примере показаны многие свойства геометрических преобразований путем применения различных преобразований к шахматному изображению.

Обзор

Двумерное геометрическое преобразование является отображением, которое связывает каждую точку в евклидовой плоскости с другой точкой в евклидовой плоскости. В этих примерах геометрическое преобразование определяется правилом, которое сообщает, как сопоставить точку с Декартовыми координатами (x, y) в другую точку с Декартовыми координатами (u, v). Шахматный шаблон полезен в визуализации координатной сетки в плоскости входного изображения и типа искажения, введенного каждым преобразованием.

Изображение 1: Создайте Checkerboard

checkerboard создает изображение, которое имеет прямоугольные плитки и четыре уникальных угла, что облегчает просмотр искажения шахматного изображения геометрическими преобразованиями.

После того, как вы запустили этот пример один раз, попробуйте изменить изображение I к вашему любимому изображению.

sqsize = 60;
I = checkerboard(sqsize,4,4);
nrows = size(I,1);
ncols = size(I,2);
fill = 0.3;

imshow(I)
title('Original')

Figure contains an axes. The axes with title Original contains an object of type image.

Изображение 2: Применить нерефлекторное подобие к шахматной доске

Неотражающие преобразования подобия могут включать вращение, масштабирование и перемещение. Сохраняются формы и углы. Параллельные линии остаются параллельными. Прямые линии остаются прямыми.

Для нерефлективного подобия,

[uv]=[xy1]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')

Figure contains an axes. The axes with title Nonreflective Similarity contains an object of type image.

Если вы измените либо tx или ty к ненулевому значению, вы заметите, что это не влияет на выходное изображение. Если вы хотите увидеть координаты, которые соответствуют вашему преобразованию, включая преобразование, включают пространственную ссылочную информацию:

[I_nonreflective_similarity,RI] = imwarp(I,t_nonsim,'FillValues',fill);

imshow(I_nonreflective_similarity,RI)
axis on
title('Nonreflective Similarity (Spatially Referenced)')

Figure contains an axes. The axes with title Nonreflective Similarity (Spatially Referenced) contains an object of type image.

Заметьте, что прохождение выхода пространственного объекта привязки RI от imwarp раскрывает перевод. Чтобы указать, какую часть выходного изображения вы хотите увидеть, используйте пару "имя-значение" 'OutputView' в imwarp функция.

Изображение 3: Применить подобие к шахматной доске

При преобразовании подобия подобные треугольники отображаются на подобные треугольники. Нерефлективные преобразования подобия являются подмножеством преобразований подобия.

Для подобия уравнение такое же, как и для нерефлективного подобия:

[uv]=[xy1]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')

Figure contains an axes. The axes with title Similarity contains an object of type image.

Изображение 4: Применить аффинное преобразование к шахматной доске

При аффинном преобразовании размерности x и y могут быть масштабированы или срезаны независимо, и может быть перемещение, отражение и/или вращение. Параллельные линии остаются параллельными. Прямые линии остаются прямыми. Сходства являются подмножеством аффинных преобразований.

Для аффинного преобразования уравнение такое же, как и для подобия и нерефлективного подобия:

[uv]=[xy1]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')

Figure contains an axes. The axes with title Affine contains an object of type image.

Изображение 5: Применить проективное преобразование к шахматной доске

В проективном преобразовании квадрилатералы отображаются на квадрилатералы. Прямые линии остаются прямыми, но параллельные линии не обязательно остаются параллельными. Аффинные преобразования являются подмножеством проективных преобразований.

Для проективного преобразования:

[upvpwp]=[xyw]T

u=upwp

v=vpwp

T является матрицей 3 на 3, где все девять элементов могут быть различными.

T=[ADGBEHCFI]

Вышеприведенное матричное уравнение эквивалентно этим двум выражениям:

u=Ax+By+CGx+Hy+I

v=Dx+Ey+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')

Figure contains an axes. The axes with title Projective contains an object of type image.

Изображение 6: Применить кусочно-линейное преобразование к шахматной доске

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

Figure contains an axes. The axes with title Piecewise Linear contains an object of type image.

Изображение 7: Применить синусоидальное преобразование к шахматной доске

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

Figure contains an axes. The axes with title Sinusoid contains an object of type image.

Изображение 8: Применить преобразование ствола к шахматной доске

Искажение ствола возмущает изображение радиально наружу от его центра. Искажение более удалено от центра, что приводит к выпуклым сторонам.

Сначала задайте функцию, которая отображает индексы пикселей на расстояние от центра. Используйте 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')

Figure contains an axes. The axes with title Barrel contains an object of type image.

Изображение 9: Применить преобразование демпфера контакта к шахматной доске

Искажение пин-демпфирования является обратным искажением ствола, потому что кубический член имеет отрицательную амплитуду. Искажение все еще больше удалено от центра, но искажение выглядит как вогнутые стороны.

Начинать можно с тех же 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 contains an axes. The axes with title Pin Cushion contains an object of type image.

Сводные данные: отображение всех геометрических преобразований шахматной доски

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')

Figure contains 9 axes. Axes 1 with title Original contains an object of type image. Axes 2 with title Nonreflective Similarity contains an object of type image. Axes 3 with title Similarity contains an object of type image. Axes 4 with title Affine contains an object of type image. Axes 5 with title Projective contains an object of type image. Axes 6 with title Piecewise Linear contains an object of type image. Axes 7 with title Sinusoid contains an object of type image. Axes 8 with title Barrel contains an object of type image. Axes 9 with title Pin Cushion contains an object of type image.

Обратите внимание, что subplot изменяет шкалу отображаемых изображений.

См. также

Функции

Объекты

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте