在Matlab中不使用gradient()计算高斯(dx,dy)的一阶导数

时间:2017-10-05 01:57:14

标签: matlab image-processing computer-vision gaussian derivative

我发起了我的高斯作为fspecial('gaussian', 4, 1),我知道gradient()是获得一阶导数的一种非常方便的方法。反正我是否可以在不使用gradient()的情况下计算出一阶导数?我正在使用它来创建Harris Corner探测器,如教科书中的第一步所示:

  • 通过将原始图像与高斯衍生物进行卷积来计算图像Ix和Iy的水平和垂直导数

1 个答案:

答案 0 :(得分:1)

如果您打算实施Harris Corner Detector,那么您根本不应该使用gradient。传统上做的是使用衍生内核并使用此内核过滤图像。您可以使用各种内核,但我在实践中看到的是使用中心差异,使得水平内核dx[-1 0 1],垂直内核dy为转置此或[-1;0;1]。因此,您使用这些内核过滤图像以获得响应IxIy,其中这些是图像的水平和垂直渐变,然后您对这些图像的平方版本执行高斯平滑处理:{{ 1}},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来最终计算Harris Corner Response。如果您有图像处理工具箱,我建议您改用imfilter。它更快,它使用Intel Integrated Performance Primitives (IIPP)。如果您想了解有关如何正确计算的更多信息,请查看我之前的帖子:Trying to find/understand correct implementation of Harris Corners