Элегантный способ получить выходные данные `normxcorr2` способом, аналогичным 'conv2' - (удаляя нежелательные края)

Естьэлегантный путь в Matlab, чтобы получить выводnormxcorr2 обрезается по размеру изображения или обрезается только до той части матрицы, которая не использует ребра с нулевой подкладкой в вычислениях?

Чтобы понять, что я имею в виду, рассмотримconv2 команда. Существует необязательный параметр с именемshape это может быть установлено вsame или жеvalid.

C = conv2(A,B,'same');
C = conv2(A,B,'valid');

Например:

size( conv2( rand(50,50) , rand(6,6), 'valid') ) 

ANS =

45    45
size( conv2( rand(50,50) , rand(6,6), 'same') )

ANS =

50    50
size( conv2( rand(50,50) , rand(6,6)) )

ANS =

55    55

В настоящее время я написал свою собственную функцию, которая делает что-то вроде этого:

function I = normxcorr2e(template,im,shape)
    switch shape
        case 'same'
            I = normxcorr2(template,im);
            r = size(I,1)-size(im,1);
            c = size(I,2)-size(im,2);

            m1=floor(r/2);
            n1=floor(c/2);
            m2=ceil(r/2);
            n2=ceil(c/2);

            I(1:m2,:) = [];
            I(end-m1+1:end,:) = [];

            I(:,1:n2) = [];
            I(:,end-n1+1:end) = [];
        case 'full'
            %Do nothing
        case 'valid'
            %TODO - write this case...
        otherwise
            throw(Mexception('normxcorr2e:BadInput','shape %s is not recognized',shape));
    end

end

У тебя есть идея получше? Основным критерием успешного ответа будетэлегантность предлагаемого решения.

Edit (1) Прежде всего, спасибо за все ваши ответы. Все они хороши и одобрены мной. Я до сих пор не решил, какой из них лучший. Кстати, недавно я думал о случае, когда шаблон больше по сравнению с изображением. В этом случае имеет смысл ускорить вычисления, обрезаяimage аргумент перед запускомnormxcorr2.

Ответы на вопрос(2)

Ваш ответ на вопрос