Part11. DoG 算子
DoG(Difference of Gaussians)高斯差分是计算机视觉中一种用于图像增强和角点检测的算子。它是将两个不同尺度的高斯模糊图像进行差分得到的。
高斯模糊可以平滑图像中的噪声和细节,而差分可以突出图像中的边缘和角点。DoG 算子利用这两个特性,在保留图像边缘和角点的同时,去除噪声和细节。
DoG 在图像处理领域有着广泛的应用,例如:
图像增强
角点检测
边缘检测
图像分割
Part22. DoG 算子的推导
二维高斯函数的公式:
可写成
对 求导,则
而在该系列的上一篇文章中,我们得到 LoG 算子的公式:
所以,
根据极限,又可得:
当 k 1 时,
因此可以用 DoG 算子来近似 LoG 算子,DoG 算子和 LoG 算子在理论上是等价的。

Marr 和 Hildreth 证明,如果两个高斯模糊图像的标准差比率为 1.6,那么 DoG 算子可以近似 LoG 算子。在实践中,DoG 算子通常比 LoG 算子更容易实现,而且计算速度更快。但是 LoG 算子的精确度更高,LoG 算子是使用一个特定的二维高斯函数来滤波图像,该函数可以准确地捕捉图像中的边缘和角点。
Part33. DoG 算子的实现
下面用高斯模糊和 absdiff() 函数变换来实现 DoG :
int main(int argc,char *argv[])
{
Mat src = imread(".../street.jpg");
imshow("src",src);
Mat gray;
cvtColor(src, gray, cv::COLOR_BGR2GRAY); // 灰度化
// 使用不同的 sigma ,实现不同尺度特征
Mat blurred1, blurred2;
double sigma1 = 1.6*2;
double sigma2 = 2;
GaussianBlur(gray, blurred1, Size(7,7), sigma1, sigma1);
GaussianBlur(gray, blurred2, Size(7,7), sigma2, sigma2);
// 通过差分计算 DoG 图像
Mat dst;
absdiff(blurred1, blurred2, dst);
normalize(dst, dst, 0, 255, NORM_MINMAX,&