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
.