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

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

Обзор

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

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

Смотрите также

Функции

Объекты

Похожие темы

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