【问题标题】:Calculating the first derivative of Gaussian (dx, dy) without using gradient() in Matlab在Matlab中不使用梯度()计算高斯(dx,dy)的一阶导数
【发布时间】:2017-10-11 05:04:38
【问题描述】:
我以fspecial('gaussian', 4, 1) 启动了我的高斯函数,我知道gradient() 是获得一阶导数的一种非常方便的方法。无论如何,我可以在不使用gradient() 的情况下计算一阶导数吗?我正在使用它来创建 Harris Corner 检测器,如教科书中的第一步所示:
- 通过将原始图像与高斯导数进行卷积来计算图像 Ix 和 Iy 的水平和垂直导数
【问题讨论】:
标签:
matlab
image-processing
computer-vision
gaussian
derivative
【解决方案1】:
如果您打算实现 Harris Corner Detector,那么您根本不应该使用 gradient。传统做法是使用派生内核并使用该内核过滤图像。您可以使用各种内核,但我在实践中看到的是使用居中差异,这样水平内核dx 是[-1 0 1],垂直内核dy 是这个或[-1;0;1] 的转置。因此,您使用这些内核过滤图像以获得响应 Ix 和 Iy,其中这些是图像的水平和垂直梯度,然后您对这些图像的平方版本执行高斯平滑:Ix.^2、@987654332 @,以及他们的产品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