В этом примере показано, как создать tform
struct, который представляет простое преобразование сдвига и затем применяет его к изображению. Мы исследуем, как преобразование влияет на прямые линии и круги, и затем используйте его в качестве транспортного средства, чтобы исследовать различные варианты для изображения, дополняющего, который может использоваться с imtransform
и tformarray
.
В двух измерениях простое преобразование сдвига, которое сопоставляет пару входа, координирует [u v]
к паре выхода координирует [x y]
имеет форму
где a
константа.
Любой простой сдвиг является особым случаем аффинного преобразования. Можно легко проверить это
дает к значениям для x
и y
то, что вы получили от первых двух уравнений.
Установка a
= 0.45, мы создаем аффинный tform
struct с помощью maketform
.
a = 0.45;
T = maketform('affine', [1 0 0; a 1 0; 0 0 1] );
Мы выбираем, читаем, и представление и изображение, чтобы преобразовать.
A = imread('football.jpg'); h1 = figure; imshow(A); title('Original Image');
Мы выбираем оттенок оранжевого как наше значение заливки.
orange = [255 127 0]';
Мы готовы использовать T
преобразовать A
. Мы могли вызвать imtransform
можно следующим образом:
B = imtransform(A,T,'cubic','FillValues',orange);
но это расточительно, поскольку мы применили бы кубичную интерполяцию и вдоль столбцов и вдоль строк. (С нашим чистым сдвигом преобразовывают, мы действительно только должны интерполировать вдоль каждой строки.) Вместо этого мы создаем и используем resampler, который применяет кубичную интерполяцию вдоль строк, но просто использует самую близкую соседнюю интерполяцию вдоль столбцов, затем вызовите imtransform
и отобразите результат.
R = makeresampler({'cubic','nearest'},'fill'); B = imtransform(A,T,R,'FillValues',orange); h2 = figure; imshow(B); title('Sheared Image');
Преобразование сетки прямых линий или массива кругов с tformfwd
хороший путь состоит в том, чтобы изучить преобразование (как долго, как он имеет и вперед и обратные функции).
Задайте сетку линий, покрывающих оригинальное изображение, и отобразитесь, оно по изображению Затем использует tformfwd
применить чистый сдвиг к каждой линии в сетке и отобразить результат по сдвинутому изображению.
[U,V] = meshgrid(0:64:320,0:64:256); [X,Y] = tformfwd(T,U,V); gray = 0.65 * [1 1 1]; figure(h1); hold on; line(U, V, 'Color',gray); line(U',V','Color',gray);
figure(h2); hold on; line(X, Y, 'Color',gray); line(X',Y','Color',gray);
Можно сделать то же самое с массивом кругов.
gray = 0.65 * [1 1 1]; for u = 0:64:320 for v = 0:64:256 theta = (0 : 32)' * (2 * pi / 32); uc = u + 20*cos(theta); vc = v + 20*sin(theta); [xc,yc] = tformfwd(T,uc,vc); figure(h1); line(uc,vc,'Color',gray); figure(h2); line(xc,yc,'Color',gray); end end
Когда мы применили преобразование сдвига, imtransform
заполненный оранжевые треугольники налево и право, где не было никаких данных. Поэтому мы задали метод клавиатуры 'fill'
при вызове makeresampler
. Существует в общей сложности пять различных вариантов метода клавиатуры ('fill'
, 'replicate'
, 'bound'
, 'circular'
, и 'symmetric'
). Здесь мы сравниваем первые три.
Во-первых, чтобы получить лучший взгляд, в как 'fill'
опция работала, используйте 'XData'
и 'YData'
опции в imtransform
обеспечивать некоторое дополнительное пространство вокруг выходного изображения.
R = makeresampler({'cubic','nearest'},'fill'); Bf = imtransform(A,T,R,'XData',[-49 500],'YData',[-49 400],... 'FillValues',orange); figure, imshow(Bf); title('Pad Method = ''fill''');
Теперь попробуйте 'replicate'
метод (никакая потребность задать значения заливки в этом случае).
R = makeresampler({'cubic','nearest'},'replicate'); Br = imtransform(A,T,R,'XData',[-49 500],'YData', [-49 400]); figure, imshow(Br); title('Pad Method = ''replicate''');
И попробуйте 'bound'
метод.
R = makeresampler({'cubic','nearest'}, 'bound'); Bb = imtransform(A,T,R,'XData',[-49 500],'YData',[-49 400],... 'FillValues',orange); figure, imshow(Bb); title('Pad Method = ''bound''');
Результаты с 'fill'
и 'bound'
выглядите очень похожими, но посмотрите тесно, и вы будете видеть, что ребра более сглаженны с 'fill'
. Поэтому входное изображение дополнено значениями заливки, затем кубичная интерполяция применяется через ребро, смешивая значения изображений и заливка. В отличие от этого 'bound'
распознает строгий контур между внутренней и внешней частью входного изображения. Идущие снаружи точки заполнены. Точки, падающие внутри, интерполированы, с помощью репликации, когда они около ребра. Завершение смотрит, помогает показать это более ясно. Мы выбираем XData
и YData
заключить в скобки точку около правого нижнего угла изображения, на пробеле выходного изображения, изменении размер с 'nearest'
сохранить внешний вид отдельных пикселей.
R = makeresampler({'cubic','nearest'},'fill'); Cf = imtransform(A,T,R,'XData',[423 439],'YData',[245 260],... 'FillValues',orange); R = makeresampler({'cubic','nearest'},'bound'); Cb = imtransform(A,T,R,'XData',[423 439],'YData',[245 260],... 'FillValues',orange); Cf = imresize(Cf,12,'nearest'); Cb = imresize(Cb,12,'nearest'); figure; subplot(1,2,1); imshow(Cf); title('Pad Method = ''fill'''); subplot(1,2,2); imshow(Cb); title('Pad Method = ''bound''');
Остающимися двумя методами клавиатуры является 'circular'
(круговое повторение в каждой размерности) и 'symmetric'
(круговое повторение изображения с добавленным зеркальным отображением). Чтобы показать больше шаблона, который появляется, мы переопределяем преобразование, чтобы сократить шкалу в половине.
Thalf = maketform('affine',[1 0; a 1; 0 0]/2); R = makeresampler({'cubic','nearest'},'circular'); Bc = imtransform(A,Thalf,R,'XData',[-49 500],'YData',[-49 400],... 'FillValues',orange); figure, imshow(Bc); title('Pad Method = ''circular''');
R = makeresampler({'cubic','nearest'},'symmetric'); Bs = imtransform(A,Thalf,R,'XData',[-49 500],'YData',[-49 400],... 'FillValues',orange); figure, imshow(Bs); title('Pad Method = ''symmetric''');