图像算法:Difference of Gaussian(DOG) 高斯函数差分

概念

Difference of Gaussian(DOG)是高斯函数的差分。

它是可以通过将图像与高斯函数进行卷积得到一幅图像的低通滤波结果,即去噪过程,

这里的Gaussian和高斯低通滤波器的高斯一样,是一个函数,即为正态分布函数。

同时,它对高斯拉普拉斯LoG的近似,在某一尺度上的特征检测可以通过对两个相邻高斯尺度空间的图像相减,得到DoG的响应值图像。

基本理论
首先,高斯函数表示定义为:

其次,两幅图像的高斯滤波表示为:

最后,将上面滤波得到的两幅图像g1和g2相减得到:

即:可以DOG表示为:

在具体图像处理中,就是将两幅图像在不同参数下的高斯滤波结果相减,得到DoG图。具体步骤如下所示:

第一步,计算不同参数下的DOG

在图1,图2,图3,三种图像给了不同参数下的高斯滤波输出的效果,如下图所示:

图1:一个高斯平滑参数为0.3,另一个高斯平滑参数为0.4

图2:一个高斯平滑参数为0.6,另一个高斯平滑参数为0.7

图3 :一个高斯平滑参数为0.7,另一个高斯平滑参数为0.8

第二步,根据DOG,求角点。

根据理论:三维图中的最大值和最小值点是角点,如图所示:

标记红色当前像素点,绿色的圈标记邻接像素点,用这个方式,最多检测相邻尺度的26个像素点。如果它是所有邻接像素点的最大值或最小值点,则标记红色被标记为特征点,如此依次进行,则可以完成图像的特征点提取。

因此在第一步后,我们可以计算出的图1,图2,图3三个DOG图中求图2中是极值的点,如下图所示:

图5:黑色为极小值,白色为极大值

因此,原始图像上以显示的DOG角点检测结果,如下图所示:

参考资料
[1] Difference of Gaussian(DOG) http://fourier.eng.hmc.edu/e161/lectures/gradient/node10.html.

[2] Difference of Gaussian From Wikipedia, the free encyclopedia.

[3] Rafael C.Gonzalez, Rechard E.Woods at. el , "Digital Image Processing Using MatLab (Second Editon)",Gatesamark Publishing.

参考文章

1. https://blog.csdn.net/songzitea/article/details/8831909

 

 

 


 

  • 17
    点赞
  • 107
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是Python实现计算原始图像高斯差分金字塔的代码: ```python import cv2 import numpy as np # 读取原始图像 img = cv2.imread('lena.jpg') # 定义高斯滤波器的尺寸和标准差 ksize = (5, 5) sigma = 1.0 # 定义金字塔的层数和下采样率 levels = 5 downsample_rate = 2 # 初始化高斯差分金字塔 pyramid = [] # 计算原始图像高斯差分金字塔 for i in range(levels): # 计算当前层的标准差 current_sigma = sigma * (downsample_rate ** i) # 计算高斯滤波器的尺寸 current_ksize = tuple([int(2 * np.ceil(2 * current_sigma)) + 1] * 2) # 对原始图像进行高斯滤波 smooth = cv2.GaussianBlur(img, current_ksize, current_sigma) # 对平滑图像进行下采样 downsampled = cv2.resize(smooth, None, fx=1/downsample_rate, fy=1/downsample_rate, interpolation=cv2.INTER_AREA) # 对下采样图像进行上采样 upsampled = cv2.resize(downsampled, img.shape[:2][::-1], interpolation=cv2.INTER_LINEAR) # 计算当前尺度的高斯差分图像 diff = cv2.subtract(img, upsampled) # 将高斯差分图像加入金字塔 pyramid.append(diff) # 更新原始图像 img = downsampled # 显示高斯差分金字塔 for i, level in enumerate(pyramid): cv2.imshow('Level ' + str(i+1), level) cv2.waitKey(0) cv2.destroyAllWindows() ``` 以上代码中,通过cv2.GaussianBlur()函数和cv2.resize()函数分别实现高斯滤波和下采样/上采样操作,通过cv2.subtract()函数实现相邻两层高斯图像差分,得到高斯差分图像。最后,通过cv2.imshow()函数显示金字塔中的每一层图像

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值