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

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

Обзор

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

Отобразите 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')

Если вы измените или 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.

Отобразите 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')

Отобразите 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')

Отобразите 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')

Отобразите 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')

Отобразите 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')

Отобразите 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')

Отобразите 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
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 изменяет шкалу отображаемых изображений.

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

Функции

Объекты

Похожие темы

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