Una forma elegante de obtener la salida de `normxcorr2` de manera similar a 'conv2' - (eliminando los bordes no deseados)

Hay unelegant way en Matlab para obtener la salida denormxcorr2 recortado al tamaño de la imagen o recortado solo a la parte de la matriz que no utiliza bordes rellenados con cero en el cálculo?

ara entender lo que quiero decir, considere laconv2 comando. Hay un parámetro opcional llamadoshape que se puede establecer ensame ovalid.

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

Por ejemplo

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

Actualmente escribí mi propia función, que hace algo como esto:

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

¿Tienes una mejor idea? El criterio principal para una respuesta exitosa será laeleganci de la solución propuesta.

Editar (1) En primer lugar, gracias por todas sus respuestas. Todos ellos son buenos y votados por mí. Todavía no he decidido cuál es el mejor. Por cierto, estoy pensando recientemente en el caso en que la plantilla es grande en comparación con la imagen. En ese caso, tiene sentido acelerar el cálculo recortandoimage argumento antes de ejecutarnormxcorr2.

Respuestas a la pregunta(6)

Su respuesta a la pregunta