在OpenCV里实现高斯拉普拉斯变换
程序员文章站
2024-01-22 21:44:40
...
前面学习了拉普拉斯变换,一般在使用它之前要使用高斯平滑,以去掉噪声。那么有没有办法把两次卷积计算合并到一起,这样既高效,又简单。因此拿二维的高斯函数来做拉普拉斯变换,这样就可以求出卷积核。
最后一条公式就是计算LoG的卷积核计算公式。下面就使用此公式来计算卷积核的代码:
#创建LoG核
def LoGKernel(sigma, size):
H,W = size
r,c = np.mgrid[0:H:1,0:W:1]
r -= (H-1)//2
c -= (W-1)//2
s2 = np.power(sigma, 2.0)
norm2 = np.power(r,2.0)+np.power(c,2.0)
LoG = (norm2/s2-2)*np.exp(-norm2/(2*s2))
return LoG
有了卷积核,就可以进行卷积运算,之后再进行以0为阈值进行分割,就可以得到图片的边缘,如下例子所示:
#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import cv2
import numpy as np
from scipy import signal
#创建LoG核
def LoGKernel(sigma, size):
H,W = size
r,c = np.mgrid[0:H:1,0:W:1]
r -= (H-1)//2
c -= (W-1)//2
s2 = np.power(sigma, 2.0)
norm2 = np.power(r,2.0)+np.power(c,2.0)
LoG = (norm2/s2-2)*np.exp(-norm2/(2*s2))
return LoG
#图片的路径
imgname = "edge1.png"
#读取图片
image = cv2.imread(imgname, cv2.IMREAD_GRAYSCALE)
#图片的高度和宽度
h,w = image.shape[:2]
print('imagesize={}-{}'.format(w,h))
#显示原图
cv2.imshow("Image",image)
#算子
LoGK = LoGKernel(2,(15,15))
LOG = signal.convolve2d(image, LoGK,boundary='symm')
LOG[LOG>0]=255
LOG[LOG<=0]=0
LOG = LOG.astype(np.uint8)
cv2.imshow("LOG",LOG)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果输出如下:
输入图片
输出图片
https://blog.csdn.net/caimouse/article/details/51749579
上一篇: 荐 Python垃圾回收机制
下一篇: linux下时间类型与时间函数总结