欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

在OpenCV里实现高斯拉普拉斯变换

程序员文章站 2024-01-22 21:44:40
...

前面学习了拉普拉斯变换,一般在使用它之前要使用高斯平滑,以去掉噪声。那么有没有办法把两次卷积计算合并到一起,这样既高效,又简单。因此拿二维的高斯函数来做拉普拉斯变换,这样就可以求出卷积核。

在OpenCV里实现高斯拉普拉斯变换

在OpenCV里实现高斯拉普拉斯变换

最后一条公式就是计算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()

结果输出如下:

在OpenCV里实现高斯拉普拉斯变换

输入图片

在OpenCV里实现高斯拉普拉斯变换

输出图片

https://blog.csdn.net/caimouse/article/details/51749579