在Matlab中不使用梯度()计算高斯(dx,dy)的一阶导数
问题描述:
我发起我的高斯为fspecial('gaussian', 4, 1)
,我知道gradient()
是获得一阶导数的非常方便的方法。有没有反正我可以计算一阶导数而不使用gradient()
?我使用它用于创建Harris角点检测器,如图所示如教科书中的第一个步骤:在Matlab中不使用梯度()计算高斯(dx,dy)的一阶导数
- 计算图像Ix和Iy的水平和垂直衍生物通过用高斯 的衍生物卷积的原始图像
答
如果您有意实施哈里斯角探测器,那么您根本不应该使用gradient
。传统上做的是你使用衍生内核,并用这个内核过滤图像。您可以使用各种内核,但我在实践中所看到的是使用居中差异,以使横向内核dx
为[-1 0 1]
,纵向内核dy
为此或[-1;0;1]
的转置。因此,您使用这些内核过滤图像以获得响应Ix
和Iy
,其中这些是图像的水平和垂直渐变,然后对这些图像的平方版本执行高斯平滑:Ix.^2
,Iy.^2
以及它们的产品Ix.*Iy
。然后形成相关矩阵,找到决定因素和轨迹并确定拐角响应。任何超过这个阈值的值都是潜在的角落。对衍生图像执行高斯平滑,如您的问题中最初所述,用高斯导数有效地过滤原始图像。
所以假设你的图像存储在im
,你只需要做:
im = double(im); % Cast to double precision to ensure accuracy
dx = [-1 0 1];
dy = dx.';
Ix = conv2(im, dx, 'same');
Iy = conv2(im, dy, 'same');
你会使用Ix
和Iy
最终计算哈里斯角点响应。如果您有图像处理工具箱,我建议您改用imfilter
。它更快,它使用Intel Integrated Performance Primitives (IIPP)。如果您想了解更多关于如何正确计算的信息,请查看我之前的帖子:Trying to find/understand correct implementation of Harris Corners