小白学python(opencv边缘检测)

  • 边缘检测算子类别
  • Canny()
  • Sobel()
  • Scharr()


边缘检测就是将图像的边缘提取并检测出来,有以下几种方法:

边缘检测算子类别

边缘检测算子:

一阶导数: Roberts、Sobel、Prewitt
二阶导数: Laplacian、Log/Marr、(Kirsch、Nevitia)
非微分边缘检测算子: Canny

pytorch图像边缘检测 python边缘检测算法_pytorch图像边缘检测

(又是数学方面,还是靠百度)

Canny()

OpenCV-Python 中 Canny()已经封装好API,直接调用就已经很方便了,而且效果也是相当不错的。

步骤:
彩色图像转换为灰度图像(以灰度图或者单通道图读入)
对图像进行高斯模糊(去噪)
计算图像梯度,根据梯度计算图像边缘幅值与角度
沿梯度方向进行非极大值抑制(边缘细化)
双阈值边缘连接处理
二值化图像输出结果
"""
cv2.Canny(image,            # 输入原图(必须为单通道图)
          threshold1, 
          threshold2,       # 较大的阈值2用于检测图像中明显的边缘
          [, edges[, 
          apertureSize[,    # apertureSize:Sobel算子的大小
          L2gradient ]]])   # 参数(布尔值):
                              true: 使用更精确的L2范数进行计算(即两个方向的倒数的平方和再开放),
                              false:使用L1范数(直接将两个方向导数的绝对值相加)。
"""
(这里函数借鉴大佬的思路)

函数:

def edge_demo(image):  #边缘检测
    blurred = cv.GaussianBlur(image,(3,3),0)
    gray = cv.cvtColor(blurred,cv.COLOR_BGR2GRAY)
    # x
    xgrad = cv.Sobel(gray,cv.CV_16SC1,1,0)
    # y
    ygray = cv.Sobel(gray,cv.CV_16SC1,0,1)

    edge_out = cv.Canny(xgrad,ygray,50,150)
    cv.imshow("edge",edge_out)
    #输出彩色图片
    dst = cv.bitwise_and(image,image,mask= edge_out)
    cv.imshow("image",dst)

结果:

pytorch图像边缘检测 python边缘检测算法_pytorch图像边缘检测_02


其实这里canny参数中直接放原图(不处理)也可以,如:

def edge_demo2(image):  #边缘检测2

    edge_out = cv.Canny(image,50,150)
    cv.imshow("edge",edge_out)
    #输出彩色图片
    dst = cv.bitwise_and(image,image,mask= edge_out)
    cv.imshow("image",dst)

pytorch图像边缘检测 python边缘检测算法_子类_03


(啧啧啧可见函数的强大)

Sobel()

Sobel的是一阶微分算子,也就是图像的一阶导数,
根据导数的定义,变化越明显的地方,梯度也大,自然
也就对应了图像的边缘。
dst = cv2.Sobel(img, ddepth, dx, dy, [ksize])
img为原始灰度图像;
ddepth为图像深度,也就是图像的位数
dx表示x方向;dy表示y方向;两者一般配合使用
    如果是(1,0)表示求x方向梯度,如果是(0,1)表示y方向的梯度;
ksize表示核的大小,一般为默认参数
def Sobel_demo(image): #缘检测Sobel
    sobelx = cv.Sobel(image, cv.CV_64F, 1, 0)  #沿着x,y取阴影
    sobely = cv.Sobel(image, cv.CV_64F, 0, 1)
    sobelx = cv.convertScaleAbs(sobelx)  #将负值取绝对值
    sobely = cv.convertScaleAbs(sobely)
    sobelxy = cv.addWeighted(sobelx, 0.5, sobely, 0.5, 0) #,将两个方向的梯度带权重相加
    cv.imshow("sobel",sobelxy)

结果:

pytorch图像边缘检测 python边缘检测算法_pytorch图像边缘检测_04

Scharr()

和Sobel一样的,只是卷积核不一样,操作完全相同。

def scharr_demo(image): #缘检测scharr
    scharrx = cv.Scharr(image, cv.CV_64F, 1, 0)
    scharry = cv.Scharr(image, cv.CV_64F, 0, 1)
    scharrx = cv.convertScaleAbs(scharrx)
    scharry = cv.convertScaleAbs(scharry)
    scharrxy = cv.addWeighted(scharrx, 0.5, scharry, 0.5, 0)
    cv.imshow("scharr", scharrxy)

结果:

pytorch图像边缘检测 python边缘检测算法_边缘检测_05