高斯差分(DoG)边缘检测

# -*- 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()

 

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

&小鹏鹏

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

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

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

打赏作者

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

抵扣说明:

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

余额充值