不同核的拉普拉斯算子

1 投票
2 回答
5803 浏览
提问于 2025-04-17 23:02

我用Python代码找到了图像的拉普拉斯算子,使用的是一个简单的核(kernel),值为1(用的是cv2库)。现在我想用一个新的核array([0,-1,0][-1,5,-1][0,-1,0]),但不太确定如何在我已有的代码中实现这个新的核,或者该如何写新的代码来调用这个核。

ksize = 1
scale = 1
delta = 0
ddepth = cv2.CV_64F

img = cv2.imread('/Users//Desktop/Programming/image.tif')
img = cv2.GaussianBlur(img,(3,3),0)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

gray_lap = cv2.Laplacian(gray,ddepth,ksize = ksize,scale = scale,delta = delta)
dst = cv2.convertScaleAbs(gray_lap)

plt.imshow(dst, cmap = 'gray')

2 个回答

1

这段内容主要讲的是拉普拉斯算子在图像处理中的作用,特别是它是如何处理二阶导数的。简单来说,拉普拉斯算子可以帮助我们找到图像中的边缘。文中提到了一些常用的拉普拉斯核(也就是用来处理图像的数学工具),不过有一点要注意的是,这些核的总和通常应该是零。而你提到的那个核 array([0,-1,0][-1,5,-1][0,-1,0]) 的总和是1,这样就不符合这个规则。与之最相似的拉普拉斯核是 [[0,1,0],[1,-4,1],[0,1,0]],适用于处理二维图像。

另外,图像的二阶导数对噪声非常敏感,所以在处理之前,通常会先对图像进行高斯模糊,这样处理后的滤波器可以被视为高斯的拉普拉斯(LoG)。我自己也在学习这些知识,下面有一个不错的学习资源: https://docs.opencv.org/3.4/d5/db5/tutorial_laplace_operator.html

下面是一个代码示例:

gblur = cv2.GaussianBlur(image, (3,3), 0)

l_kernel = np.array([[0, 1, 0], [1, -4, 1], [0, 1, 0]])

temp = cv2.filter2D(gblur, -1, laplacian_kernel)
cv2.imshow('temp', temp)
5

我对Python的OpenCV库不太熟悉,不过如果你想用自定义的卷积核,可以使用filter2D这个功能。你需要自己构建一个3x3的数组作为卷积核。虽然这个教程是用C++写的,但看起来很有帮助。

撰写回答