我使用python代码找到一个只有一般内核= 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')
答案 0 :(得分:3)
我不熟悉Python的OpenCV绑定,但对于自定义卷积内核,您需要filter2D
。自己构建内核作为3x3阵列。 This tutorial在C ++中,但看起来很有帮助。
答案 1 :(得分:1)
https://dsp.stackexchange.com/questions/44928/what-does-derivative-means-in-image-processing/44930
提供关于拉普拉斯算子所做的一些背景,即将二阶导数归零。那里也列出了常用的Laplace内核,但我认为它必须求和为零,因为您提到的[[0,1,0],[1,-4,1],[0,1,0]]
内核不是而是求和为1。与Laplacian最相似的内核是{{1 }}以获得2D图像。同样,图像的二阶导数对噪声非常敏感,因此可以首先应用高斯模糊,在这种情况下,可以将生成的滤波器视为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)