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
もっと良いアイデアはありますか?成功する答えの主な基準は、提案されたソリューションの優雅さです。
編集(1)まず、すべての回答に感謝します。それらはすべて優れており、私は支持しています。どれが一番良いかはまだ決めていません。ところで、画像に対してテンプレートが大きい場合について最近考えています。image
その場合、を実行する前に引数をトリミングして計算を高速化することは理にかなっていnormxcorr2
ます。