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

В этом примере показано, как создать 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');

Мы выбираем оттенок оранжевого как наше значение заливки.

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

Шаг 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(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

Шаг 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''');

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

Шаг 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''');

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