【发布时间】:2012-02-07 19:09:49
【问题描述】:
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)首先,感谢您的所有回答。他们都很好,我赞成。我还没有决定哪个是最好的。顺便说一句,我最近在考虑模板与图像相比较大的情况。在这种情况下,通过在运行 normxcorr2 之前裁剪 image 参数来加速计算是有意义的。
【问题讨论】:
-
正确性也很重要吗? :)
-
@Jonas,是的 :) 优雅是主要标准,而不是唯一标准
-
我试图找到一种方法,您可以使用相同的名称调用您的函数并隐藏工具箱版本,让它充当看不见的包装器。不幸的是,使用 BUILTIN 调用阴影函数仅适用于 非工具箱 内置函数,所以我无法让它工作。
-
@gnovice,这是一个好主意,但实际上它可能会在部署的代码中造成严重破坏:(我尝试覆盖
disp一次,但行为非常奇怪。
标签: matlab convolution cross-correlation