exponenta event banner

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

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

Обзор

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

Изображение 1: Создание шахматной доски

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: Применить преобразование Pin Cushion к чековой доске

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

Вы можете начать с того же 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 изменяет масштаб отображаемых изображений.

См. также

Функции

Объекты

Связанные темы