在上一节中都是采用一阶差分(导数),进行的边缘提取。 也可以采用二阶差分进行边缘提取,如Laplacian算子,高斯拉普拉斯(LoG)边缘检测, 高斯差分(DoG)边缘检测,Marr-Hidreth边缘检测。这些边缘提取算法详细介绍如下:
1. Laplacian算子
Laplacian算子采用二阶导数,其计算公式如下:(分别对x方向和y方向求二阶导数,并求和)
其对应的Laplacian算子如下:
其推导过程如下:
opencv中提供Laplacian()函数计算拉普拉斯运算,其对应参数如下:
dst = cv2.Laplacian(src, ddepth, ksize, scale, delta, borderType)
src: 输入图像对象矩阵,单通道或多通道
ddepth:输出图片的数据深度,注意此处最好设置为cv.CV_32F或cv.CV_64F
ksize: Laplacian核的尺寸,默认为1,采用上面3*3的卷积核
scale: 放大比例系数
delta: 平移系数
borderType: 边界填充类型
下面为使用代码及其对应效果:
#coding:utf-8 import cv2 img_path= r"C:\Users\silence_cho\Desktop\Messi.jpg" img = cv2.imread(img_path) img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) dst_img = cv2.Laplacian(img, cv2.CV_32F) laplacian_edge = cv2.convertScaleAbs(dst_img) #取绝对值后,进行归一化 dst_img_gray = cv2.Laplacian(img_gray, cv2.CV_32F) laplacian_edge_gray = cv2.convertScaleAbs(dst_img_gray) #取绝对值后,进行归一化 cv2.imshow("img", img) cv2.imshow("laplacian_edge", laplacian_edge) cv2.imshow("img_gray", img_gray) cv2.imshow("laplacian_edge_gray ", laplacian_edge_gray) cv2.waitKey(0) cv2.destroyAllWindows()