欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

opencv图像处理之Canny边缘检测

程序员文章站 2024-01-28 09:04:46
...

1.Canny检测背后的原理

【1】高斯平滑:去除噪声
由于边缘检测很容易受到噪声影响,所以第一步是使用5x5 的高斯滤波器去除噪声。
【2】sobel梯度计算:求梯度大小和方向
对平滑后的图像使用Sobel 算子计算水平方向和竖直方向的一阶导数(图像梯度)(Gx 和Gy)。根据得到的这两幅梯度图(Gx 和Gy)找到边界的梯度和方向,公式如下:
opencv图像处理之Canny边缘检测
【3】非极大值抑制:
在获得梯度的方向和大小之后,应该对整幅图像做一个扫描,去除那些非边界上的点。对每一个像素进行检查,看这个点的梯度是不是周围具有相同梯度方向的点中最大的。
opencv图像处理之Canny边缘检测
【4】滞后阈值:
max梯度以上的确定为边界。min梯度以下的不算边界。max和min梯度之间的,和max以上梯度的像素相连的才算边界。
opencv图像处理之Canny边缘检测

2.代码和结果展示

  • cv2.Canny()
  • cv2.createTrackbar()
  • cv2.getTrackbarPos()

参数解释:

edges = cv2.Canny(test, min, max)
#参数1:输入图像,参数2:minValue,参数3:maxValue

cv2.createTrackbar('min','image',0,200,nothing)
#参数1:slider名字,参数2:显示窗口的名字,3:滑动条默认值,4:滑动条最大值,5:回调函数,默认参数为滑动条的位置x
max=cv2.getTrackbarPos('max','image')
#参数1:slider名字,2:显示窗口的名字。返回值:滑动条的位置。

以下代码实现了用滑动条控制min和max来改变边缘检测的效果:

def nothing(x):
    pass
    
def canny(self):
    test=cv2.imread('../images/test2.jpg',0)
    cv2.namedWindow('image')
    cv2.createTrackbar('min','image',0,200,nothing)
    cv2.createTrackbar('max','image',100,300,nothing)
    while(1):
        min=cv2.getTrackbarPos('min','image')
        max=cv2.getTrackbarPos('max','image')
        edges = cv2.Canny(test, min, max)
        cv2.imshow('image',edges)
        k=cv2.waitKey(1)&0xFF
        if k==27:
            break

opencv图像处理之Canny边缘检测

相关标签: 计算机视觉