opencv图像处理之Canny边缘检测

1.Canny检测背后的原理

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

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

在这里插入图片描述

发布了132 篇原创文章 · 获赞 40 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq_36622009/article/details/104564028