OpenCV笔记(3)

一、Canny边缘检测

Canny边缘检测是一系列方法综合的结果。其中主要包含以下步骤:

1.使用高斯滤波器,平滑图像,滤除噪声。

2.计算图像中每个像素点的梯度强度和方向。

3.应用非极大值抑制(NMS:Non-Maximum Suppression),以消除边缘检测带来的杂散相应。

4.应用双阈值(Double-Threshold)检测来确定真实和潜在的边缘。

5.通过抑制孤立的弱边缘最终完成边缘检测。

1.高斯滤波器

平滑图像。

2.计算梯度和方向

使用X和Y方向的Sobel算子来分别计算XY方向梯度:

每个点的梯度强度有XY方向的梯度计算出来:

计算每个点梯度的方向:

3.使用NMS

有两种方法,第一种方法(插值法,比较复杂):

    通过计算出的梯度方向,找到与周边临近点的边的交点,然后使用权重计算交点的值,假设g1和g2之间的交点(左上的黑点)处于6/4的位置,那么他的值为M = g1*(1-0.6)+g2*(0.4)。

    当算出左上的黑点和右下的黑点值后,用这两个点与C的值进行比较,如果都小于C,则C归为边界。如果有一个比C大,则丢弃C,这就叫抑制。

第二种方法(指定8个方向,不用插值,简化版):

4.双阈值检测

在NMS的基础上,判断一个边界点的梯度强度:

  (1) 如果值大于maxVal,则处理为边界

  (2) 如果值minVal<梯度值<maxVal,再检查是否挨着其他边界点,如果旁边没有边界点,则丢弃,如果连着确定的边界点,则也认为其为边界点。

  (3) 梯度值<minVal,舍弃。

通过以上步骤,完成Canny边缘检测。调用Canny API如下:

# 使用Canny边界检测
def use_canny(image):
    # 后面两个参数代表双阈值检测的minVal和maxVal
    img1 = cv.Canny(image, 50, 100)
    cv.imshow('img1', img1)
    # 这里使用更大的minVal和maxVal,细节边界变少了
    img2 = cv.Canny(image, 170, 250)
    cv.imshow('img2', img2)

猜你喜欢

转载自www.cnblogs.com/leokale-zz/p/11349481.html