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

Calculating the first derivative of Gaussian (dx, dy) without using gradient() in Matlab

我将我的高斯初始化为 fspecial('gaussian', 4, 1),我知道 gradient() 是获得一阶导数的一种非常方便的方法。无论如何,我可以在不使用 gradient() 的情况下计算一阶导数吗?我用它来创建哈里斯角检测器,如教科书第一步所示:

如果您打算实施 Harris 角检测器,那么您根本不应该使用 gradient。传统做法是使用派生内核并使用该内核过滤图像。您可以使用各种内核,但我在实践中看到的是使用居中差异,例如水平内核 dx[-1 0 1] 并且垂直内核 dy 是转置这或 [-1;0;1]。因此,您使用这些内核过滤图像以获得响应 IxIy,其中这些是图像的水平和垂直梯度,然后对这些图像的平方版本执行高斯平滑: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');

您将使用 IxIy 来最终计算哈里斯角响应。如果你有图像处理工具箱,我建议你使用imfilter instead. It's faster and it uses the Intel Integrated Performance Primitives (IIPP). If you'd like more information on how to compute it properly, check out my previous post here: