matlab – 以类似于’conv2’的方式获得`normxcorr2`输出的优雅方法 – (删除不需要的边)

在Matlab中是否有一种优雅的方法可以将normxcorr2的输出裁剪为图像的大小,或仅裁剪到矩阵的一部分,在计算中不使用零填充边缘?

要理解我的意思,请考虑conv2命令.有一个名为shape的可选参数,可以设置为相同或有效.

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)首先,感谢您的所有答案.所有这些都很好,并且由我赞成.我还没有决定哪个是最好的.顺便说一下,我最近想到的是模板与图像相比较大的情况.在这种情况下,通过在运行normxcorr2之前裁剪图像参数来加速计算是有意义的.

这是一个相对于其他答案有一些额外功能的变体:

>它允许您省略shape参数(默认为’full’).
>当shape是有效字符串时,它仅调用normxcorr2.
>它使用logical indexing在一行中执行索引.引导填充和所需中心区域的大小用于创建真值和假值的索引向量.不需要指定尾随填充,因为短于索引的维度的逻辑索引将仅使用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
https://stackoverflow.com/questions/9145107/an-elegant-way-to-get-the-output-of-normxcorr2-in-a-manner-similar-to-conv2

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:matlab – 以类似于’conv2’的方式获得`normxcorr2`输出的优雅方法 – (删除不需要的边)