在Matlab中不使用梯度()计算高斯(dx,dy)的一阶导数
Calculating the first derivative of Gaussian (dx, dy) without using gradient() in Matlab
我将我的高斯初始化为 fspecial('gaussian', 4, 1)
,我知道 gradient()
是获得一阶导数的一种非常方便的方法。无论如何,我可以在不使用 gradient()
的情况下计算一阶导数吗?我用它来创建哈里斯角检测器,如教科书第一步所示:
- 通过将原始图像与高斯导数进行卷积计算图像 Ix 和 Iy 的水平和垂直导数
如果您打算实施 Harris 角检测器,那么您根本不应该使用 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
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:
我将我的高斯初始化为 fspecial('gaussian', 4, 1)
,我知道 gradient()
是获得一阶导数的一种非常方便的方法。无论如何,我可以在不使用 gradient()
的情况下计算一阶导数吗?我用它来创建哈里斯角检测器,如教科书第一步所示:
- 通过将原始图像与高斯导数进行卷积计算图像 Ix 和 Iy 的水平和垂直导数
如果您打算实施 Harris 角检测器,那么您根本不应该使用 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
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: