# -*- 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()
高斯差分(DoG)边缘检测
猜你喜欢
转载自blog.csdn.net/u012785169/article/details/89253190
今日推荐
周排行