Дополнение и сдвиг изображения одновременно

В этом примере показано, как создать tform struct, который представляет простое преобразование сдвига и затем применяет его к изображению. Мы исследуем, как преобразование влияет на прямые линии и круги, и затем используйте его в качестве транспортного средства, чтобы исследовать различные варианты для изображения, дополняющего, который может использоваться с imtransform и tformarray.

Шаг 1: преобразуйте изображение Используя простой сдвиг

В двух измерениях простое преобразование сдвига, которое сопоставляет пару входа, координирует [u v] к паре выхода координирует [x y] имеет форму

x=u+a*v

y=v

где a константа.

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

[xy1]=[uv1]*[100a10001]

дает к значениям для 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');

Figure contains an axes object. The axes object with title Original Image contains an object of type 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');

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

Шаг 2: исследуйте преобразование

Преобразование сетки прямых линий или массива кругов с 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 contains an axes object. The axes object with title Original Image contains 12 objects of type image, line.

figure(h2);
hold on;
line(X, Y, 'Color',gray);
line(X',Y','Color',gray);

Figure contains an axes object. The axes object with title Sheared Image contains 12 objects of type image, line.

Можно сделать то же самое с массивом кругов.

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

Figure contains an axes object. The axes object with title Original Image contains 42 objects of type image, line.

Figure contains an axes object. The axes object with title Sheared Image contains 42 objects of type image, line.

Шаг 3: сравните 'заливку', 'реплицируйте', и 'связанные' методы клавиатуры

Когда мы применили преобразование сдвига, 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''');

Figure contains an axes object. The axes object with title Pad Method = 'fill' contains an object of type image.

Теперь попробуйте 'replicate' метод (никакая потребность задать значения заливки в этом случае).

R = makeresampler({'cubic','nearest'},'replicate');
Br = imtransform(A,T,R,'XData',[-49 500],'YData', [-49 400]);

figure, imshow(Br);
title('Pad Method = ''replicate''');

Figure contains an axes object. The axes object with title Pad Method = 'replicate' contains an object of type image.

И попробуйте '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''');

Figure contains an axes object. The axes object with title Pad Method = 'bound' contains an object of type image.

Результаты с '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''');

Figure contains 2 axes objects. Axes object 1 with title Pad Method = 'fill' contains an object of type image. Axes object 2 with title Pad Method = 'bound' contains an object of type image.

Шаг 4: осуществите 'круговые' и 'симметричные' методы клавиатуры

Остающимися двумя методами клавиатуры является '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''');

Figure contains an axes object. The axes object with title Pad Method = 'circular' contains an object of type image.

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

Figure contains an axes object. The axes object with title Pad Method = 'symmetric' contains an object of type image.