利用高斯拉普拉斯算子(Laplacian of Gaussian, LOG)提取图像边缘是一种结合了高斯平滑和拉普拉斯边缘检测的方法。这种方法首先使用高斯滤波器对图像进行平滑处理,以减少噪声对边缘检测的影响,然后应用拉普拉斯算子来检测平滑后图像中的边缘。
以下是使用Python和OpenCV库来实现LOG边缘检测的步骤:
-
导入必要的库:
你需要导入OpenCV(cv2
)和NumPy(np
)库。 -
读取图像:
使用OpenCV的cv2.imread()
函数读取图像。 -
转换为灰度图像(如果图像不是灰度图像):
使用cv2.cvtColor()
函数将图像转换为灰度图像。 -
应用高斯平滑:
使用OpenCV的cv2.GaussianBlur()
函数对灰度图像进行高斯平滑处理。 -
应用拉普拉斯算子:
对平滑后的图像应用拉普拉斯算子,使用OpenCV的cv2.Laplacian()
函数。 -
寻找边缘(可选):
拉普拉斯算子的结果是一个图像,其中边缘区域会有较高的绝对值。你可以通过设置阈值来识别这些区域作为边缘。 -
显示结果:
使用OpenCV的cv2.imshow()
函数或Matplotlib库来显示边缘检测结果。 -
示例代码:
def laplacian(img, save, name):# 读入图像,转换为灰度图image = cv2.imread(img, cv2.IMREAD_GRAYSCALE) # 高斯滤波blurred = cv2.GaussianBlur(image, (5, 5), 0) # 拉普拉斯计算laplacian = cv2.Laplacian(blurred, cv2.CV_64F) # 计算结果取绝对值后归一化到0-255之间abs_laplacian = np.absolute(laplacian)laplacian_8u = np.uint8(cv2.normalize(abs_laplacian, None, 0, 255, cv2.NORM_MINMAX))# 根据阈值将结果二值化_, thresholded = cv2.threshold(laplacian_8u, 50, 255, cv2.THRESH_BINARY) # 找到二值化图像中的轮廓contours, _ = cv2.findContours(thresholded, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 将轮廓画在原图上contour_image = cv2.merge((image, image, image))cv2.drawContours(contour_image, contours, -1, (0, 0, 255), 1)cv2.imwrite(f'./{save}/{name}_laplaci.png', contour_image)cv2.imshow('contour', contour_image)cv2.waitKey()cv2.destroyAllWindows()