高斯差分(DoG)边缘检测

本文介绍了一种基于高斯差分(Difference of Gaussians, DoG)的图像边缘检测算法实现。通过定义非归一化的高斯卷积核,分别对图像进行不同标准差的高斯卷积,然后计算两者的差分来突出图像中的边缘信息。文章详细展示了算法的Python代码实现过程,包括高斯卷积、高斯差分计算及后续的边缘二值化处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# -*- coding: utf-8 -*-
import sys
import cv2
import numpy as np
from scipy import signal
import math
#非归一化的高斯卷积
def gaussConv(I,size,sigma):
    #卷积核的高和宽
    H,W = size
    #构造水平方向上非归一化的高斯卷积核
    xr,xc = np.mgrid[0:1,0:W]
    xc -= np.int((W-1)/2)
    xk = np.exp(-np.power(xc,2.0)/(2.0*pow(sigma,2)))
    # I 与 xk 卷积
    I_xk = signal.convolve2d(I,xk,'same','symm')
    #构造垂直方向上的非归一化的高斯卷积核
    yr,yc = np.mgrid[0:H,0:1]
    yr -= np.int((H-1)/2)
    yk = np.exp(-np.power(yr,2.0)/(2.0*pow(sigma,2.0)))
    # I_xk 与 yk 卷积
    I_xk_yk = signal.convolve2d(I_xk,yk,'same','symm')
    I_xk_yk *= 1.0/(2*np.pi*pow(sigma,2.0))
    return I_xk_yk
    #
#高斯差分
def DoG(I,size,sigma,k=1.1):
    #标准差为 sigma 的非归一化的高斯卷积
    Is = gaussConv(I,size,sigma)
    #标准差为 k*sigma 的非归一化高斯卷积
    Isk = gaussConv(I,size,k*sigma)
    #两个高斯卷积的差分
    doG = Isk - Is
    doG /= (pow(sigma,2.0)*(k-1))
    return doG
#主函数
if __name__ =="__main__":
    # if len(sys.argv) > 1:
    #     image = cv2.imread(sys.argv[1],cv2.IMREAD_GRAYSCALE)
    # else:
    #     print "Usge:python DoG.py imageFile"
    image = cv2.imread('1.jpg', cv2.IMREAD_GRAYSCALE)

    #显示原图
    cv2.imshow("image",image)
    #高斯差分边缘检测
    sigma = 2
    k = 1.1
    size = (25,25)
    imageDoG = DoG(image,size,sigma,k)
    #二值化边缘,对 imageDoG 阈值处理
    edge = np.copy(imageDoG)
    edge[edge>0] = 255
    edge[edge<=0] = 0
    edge = edge.astype(np.uint8)
    cv2.imshow("edge",edge)
    cv2.imwrite("edge.jpg",edge)
    #图像边缘抽象化
    asbstraction = -np.copy(imageDoG)
    asbstraction = asbstraction.astype(np.float32)
    asbstraction[asbstraction>=0]=1.0
    asbstraction[asbstraction<0] = 1.0+ np.tanh(asbstraction[asbstraction<0])

    asbstraction = asbstraction*255
    asbstraction = asbstraction.astype(np.uint8)
    cv2.imwrite("asbstraction.jpg",asbstraction)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

 

### 高斯差分算子在边缘检测中的应用 高斯差分(Difference of Gaussians, DoG)是一种常用的边缘检测技术,广泛应用于计算机视觉领域。它通过计算两个不同尺度下的高斯模糊图像之间的差异来突出图像中的显著特征[^1]。 #### 基本原理 DoG 的核心思想在于利用多尺度空间滤波器捕捉图像的不同细节层次。具体来说,通过对同一幅图像施加两次不同的高斯平滑操作并取其差值,可以有效增强边缘和其他重要结构的信息[^2]。这种机制类似于人类视觉系统的响应特性,因此具有较强的理论基础和支持。 #### 实现步骤 以下是基于 OpenCV 和 MATLAB 平台下实现高斯差分算子的主要流程: 1. **加载原始图片** 使用 `imread` 函数读入待处理的灰度或彩色图像作为输入数据源。 2. **构建多个尺度的空间金字塔** 应用 GaussianBlur 或 imfilter 对原图依次卷积生成一系列低通版本副本;每层之间存在固定比例关系以便后续对比分析。 3. **执行减法运算获得最终结果** 将相邻两层对应位置像素逐点相减得到新的矩阵表示形式即为我们所需要的 DOG 表达式[^3]。 #### 效果展示 为了更直观理解上述过程的效果,下面给出了简单的 Python (借助 cv2库)以及 Matlab 脚本样例供参考: ```python import numpy as np import cv2 def dog(image,kernel_size,sigma): blur1=cv2.GaussianBlur(image,(kernel_size,kernel_size),sigmaX=sigma) blur2=cv2.GaussianBlur(blur1,(kernel_size*2+1,kernel_size*2+1),sigmaX=0) diff_of_gaussians=np.abs(blur1-blur2)*255 return diff_of_gaussians.astype('uint8') img_gray = cv2.imread('example.jpg',cv2.IMREAD_GRAYSCALE ) result_dog=dog(img_gray ,7,1 ) cv2.imshow("Original Image", img_gray ) cv2.waitKey(0);cv2.destroyAllWindows(); cv2.imwrite('./output/diff_of_gaus_example_py.png', result_dog); ``` For MATLAB users: ```matlab function outputImage = DifferenceOfGaussian(inputImage,varargin) %DIFFERENCEOFGAUSSIAN Applies the difference of gaussians filter to an image. % % OUTPUTIMAGE = DIFFERENCEOFGAUSSIAN(INPUTIMAGE,SIGMA1,SIGMA2,KERNELSIZE) % applies a difference-of-gaussian operation using two gaussian filters with standard deviations SIGMA1 and SIGMA2 respectively. if nargin<4 || isempty(varargin{end}) kernelSize=floor(max(size(inputImage))/16)+mod(floor(max(size(inputImage))/16),2)-1; else kernelSize=varargin{end}; end; h1=fspecial('gaussian',[kernelSize,kernelSize], varargin{1}); h2=fspecial('gaussian',[ceil(kernelSize/2)*2+1 ceil(kernelSize/2)*2+1 ], varargin{2}); filteredImg1=imfilter(double(inputImage), h1,'replicate'); filteredImg2=imfilter(double(filteredImg1), h2 ,'replicate'); outputImage=(abs(filteredImg1-filteredImg2)).^(1./max([size(h1)])); colormap(gray()); imagesc(outputImage); title(['DOG Result']); axis off ; colorbar ; saveas(gcf,'diff_of_gaus_matlb_examp','png') end ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

&小鹏鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值