2

Matlabで、画像のサイズに合わせてトリミングしたり、計算でゼロで埋められたエッジを使用しない行列の一部だけをトリミングしたりするエレガントな方法はありますか?normxcorr2

私の言いたいことを理解するために、conv2コマンドを考えてみましょう。またはshapeに設定できる と呼ばれるオプションのパラメータがあります。samevalid

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ます。

4

3 に答える 3

2

これは、他の回答に比べていくつかの追加機能を備えたバリアントです。

  • これにより、shape引数を省略できます(デフォルトは'full')。
  • が有効な文字列であるnormxcorr2場合にのみ呼び出します。shape
  • 論理インデックスを使用して、1行でインデックスを実行します。リードパディングと目的の中央領域のサイズは、真と偽の値のインデックスベクトルを作成するために使用されます。インデックスを付けるディメンションよりも短い論理インデックスは単にfalse値で埋められるため、末尾のパディングを指定する必要はありません。

そしてここにコードがあります:

function I = normxcorr2e(template, im, shape)

  if (nargin == 2) || strcmp(shape,'full')
      I = normxcorr2(template, im);
      return
  end

  switch shape
      case 'same'
          pad = floor(size(template)./2);
          center = size(im);
      case 'valid'
          pad = size(template) - 1;
          center = size(im) - pad;
      otherwise
          throw(Mexception('normxcorr2e:BadInput',...
              'SHAPE must be ''full'', ''same'', or ''valid''.'));
  end

  I = normxcorr2(template, im);
  I = I([false(1,pad(1)) true(1,center(1))], ...
        [false(1,pad(2)) true(1,center(2))]);

end
于 2012-02-05T19:13:37.933 に答える
1

ここにはあまり洗練されたものはありません。相関を実行してから、使用できないものを削除します。しかし、それは機能します。

function I = normxcorr2e(template,im,shape)

%# perform cross correlation with automated zero-padding
I = normxcorr2(template,im);

switch shape
    case 'same'

        %# if we were guaranteed to have odd-sized templates only
        %# we would only need padLow
        templateSize = size(template);
        padLow = floor(templateSize/2);
        padHigh = templateSize - padLow - 1;

        I = I( (1+padLow(1)):(end-padHigh(1)), (1+padLow(2)):(end-padHigh(2)) );

    case 'full'
        %Do nothing
    case 'valid'
        %# with even size, we need to remove the larger of the two pad sizes
        %# i.e. padLow, on all sides
        templateSize = size(template);
        padLow = templateSize/2;

        I = I( (2*padLow(1)):(end-2*padLow(1)+1), (2*padLow(2)):(end-2*padLow(2)+1) );
    otherwise
        throw(Mexception('normxcorr2e:BadInput','shape %s is not recognized',shape));
end
于 2012-02-05T05:10:45.640 に答える