在上一节中都是采用一阶差分(导数),进行的边缘提取。 也可以采用二阶差分进行边缘提取,如Laplacian算子,高斯拉普拉斯(LoG)边缘检测, 高斯差分(DoG)边缘检测,Marr-Hidreth边缘检测。这些边缘提取算法详细介绍如下:

 

1. Laplacian算子

  Laplacian算子采用二阶导数,其计算公式如下:(分别对x方向和y方向求二阶导数,并求和)

(六)OpenCV-Python学习—边缘检测2

   其对应的Laplacian算子如下:

(六)OpenCV-Python学习—边缘检测2

   其推导过程如下:

(六)OpenCV-Python学习—边缘检测2

  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()
cv2.Laplacian()

相关文章: