【问题标题】:An elegant way to get the output of `normxcorr2` in a manner similar to 'conv2' - (removing the unwanted edges)以类似于“conv2”的方式获取“normxcorr2”输出的一种优雅方式 - (删除不需要的边缘)
【发布时间】:2012-02-07 19:09:49
【问题描述】:

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

【问题讨论】:

  • 正确性也很重要吗? :)
  • @Jonas,是的 :) 优雅是主要标准,而不是唯一标准
  • 我试图找到一种方法,您可以使用相同的名称调用您的函数并隐藏工具箱版本,让它充当看不见的包装器。不幸的是,使用 BUILTIN 调用阴影函数仅适用于 非工具箱 内置函数,所以我无法让它工作。
  • @gnovice,这是一个好主意,但实际上它可能会在部署的代码中造成严重破坏:(我尝试覆盖 disp 一次,但行为非常奇怪。

标签: matlab convolution cross-correlation


【解决方案1】:

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

  • 它允许您省略形状参数(默认为'full')。
  • 仅当shape 是有效字符串时才调用normxcorr2
  • 它使用logical indexing 在一行中执行索引。引线填充和所需中心区域的大小用于创建真值和假值的索引向量。不需要指定尾随填充,因为比它索引的维度短的逻辑索引只会用错误值填充。

这是代码:

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

【讨论】:

    【解决方案2】:

    这样会更简洁。我希望它是您正在寻找的:

    function I = normxcorr2e(template,im,shape)
    
      args={'full','same','valid'};
      cropSize=(find(strcmp(shape,args))-1)*size(template);
      crop=@(x,r) x(1+floor(r(1)/2):end-ceil(r(1)/2),1+floor(r(2)/2):end-ceil(r(2)/2))
      I=crop(normxcorr2(template,im),cropSize);
    

    【讨论】:

    • 谢谢,你的版本和其他都很好。因此,他们得到了我的支持。我在这里做了一个艰难的选择。
    【解决方案3】:

    这里没有太多的优雅 - 你运行相关性,然后删除你不能使用的东西。但它有效。

    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
    

    【讨论】:

    • 谢谢,你的版本和其他都很好。因此,他们得到了我的支持。我在这里做了一个艰难的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多