DoG 算子

背景简述

Difference of Gaussian(DOG)是高斯函数的差分。它是可以通过将图像与高斯函数进行卷积得到一幅图像的低通滤波结果,即去噪过程,这里的Gaussian和高斯低通滤波器的高斯一样,是一个函数,即为正态分布函数。同时,它对高斯拉普拉斯LoG(博文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.


### 使用 PyTorch 实现 Difference of Gaussians (DoG) 算子 Difference of Gaussians (DoG) 是一种常用的边缘检测方法,它通过对同一图像应用两个不同尺度的高斯模糊,然后计算两者的差值来突出图像中的边缘信息。以下是基于 PyTorch 的 DoG 算子实现: #### 高斯核生成函数 为了实现 DoG,首先需要定义一个用于生成高斯核的函数。 ```python import torch import torch.nn.functional as F from math import pi def gaussian_kernel(size, sigma): """ Generate a Gaussian kernel. Args: size (int): The size of the kernel (size x size). sigma (float): Standard deviation of the Gaussian distribution. Returns: Tensor: A normalized Gaussian kernel tensor. """ ax = torch.linspace(-(size // 2), size // 2, steps=size) xx, yy = torch.meshgrid(ax, ax, indexing='ij') kernel = torch.exp(-0.5 * (xx ** 2 + yy ** 2) / sigma ** 2) kernel /= kernel.sum() # Normalize the kernel return kernel.unsqueeze(0).unsqueeze(0) # Add batch and channel dimensions ``` #### 应用高斯模糊 接下来,我们编写一个函数用来对输入张量施加高斯模糊操作。 ```python def apply_gaussian_blur(input_tensor, kernel_size, sigma): """ Apply Gaussian blur to an input tensor using convolution with a Gaussian kernel. Args: input_tensor (Tensor): Input image tensor (BxCxHxW). kernel_size (int): Size of the Gaussian kernel. sigma (float): Sigma value for the Gaussian kernel. Returns: Tensor: Blurred image tensor. """ device = input_tensor.device channels = input_tensor.size(1) # Create Gaussian kernel kernel = gaussian_kernel(kernel_size, sigma).to(device=device) kernel = kernel.expand(channels, -1, -1, -1) # Expand for multiple channels # Pad the input tensor to preserve spatial dimensions after convolution padding = kernel_size // 2 blurred = F.conv2d(F.pad(input_tensor, pad=(padding, padding, padding, padding), mode='replicate'), weight=kernel, groups=channels) return blurred ``` #### 差分高斯算子 最后,我们将上述功能组合起来,完成 DoG 的实现。 ```python def difference_of_gaussians(input_tensor, kernel_size_1, sigma_1, kernel_size_2, sigma_2): """ Compute the Difference of Gaussians (DoG). Args: input_tensor (Tensor): Input image tensor (BxCxHxW). kernel_size_1 (int): Kernel size for the first Gaussian blur. sigma_1 (float): Sigma for the first Gaussian blur. kernel_size_2 (int): Kernel size for the second Gaussian blur. sigma_2 (float): Sigma for the second Gaussian blur. Returns: Tensor: Resulting DoG tensor. """ blurred_1 = apply_gaussian_blur(input_tensor, kernel_size_1, sigma_1) blurred_2 = apply_gaussian_blur(input_tensor, kernel_size_2, sigma_2) dog_result = blurred_1 - blurred_2 return dog_result ``` 以上代码实现了完整的 DoG 流程,其中 `difference_of_gaussians` 函数接受两张不同的高斯模糊参数,并返回它们之间的差值[^4]。 --- ### 示例调用 假设有一个随机生成的 RGB 图像张量 `(batch_size=1, channels=3, height=64, width=64)`,可以这样使用上面的函数: ```python input_image = torch.randn(1, 3, 64, 64) # Example input tensor dog_output = difference_of_gaussians( input_image, kernel_size_1=5, sigma_1=1.0, kernel_size_2=9, sigma_2=2.0 ) print(dog_output.shape) # Output shape should be same as input: [1, 3, 64, 64] ``` 此代码片段展示了如何利用自定义的高斯核大小和标准差来生成 DoG 结果[^5]。 --- ### 注意事项 - 输入张量应具有形状 `[BatchSize, Channels, Height, Width]`。 - 如果希望保持输出尺寸不变,则需适当调整卷积层的填充方式(如本例中使用的 `'replicate'` 填充模式)。 - 参数的选择会影响最终的结果质量;通常较大的 `sigma` 对应更平滑的效果,而较小的 `sigma` 则能更好地捕捉细小结构[^6]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值