OpenCV|Python+Opencv Canny边缘检测

Canny边缘检测流程:

去噪 --> 梯度 --> 非极大值抑制 --> 滞后阈值

  • 去噪
    • 边缘检测容易受到噪声的影响。因此,在进行边缘检测前,通常需要先进行去噪
    • 通常采用高斯滤波器去除噪声
      • 让临近的像素具有更高的重要性。对周围像素计算加权平均值,较近的像素具有较大的权重值。
  • 梯度/角度
    • 对平滑后的图像采用sobel算子计算梯度和方向
      • 梯度E d g e G r a d i e n t ( G ) = G x 2 + G y 2 Edge_{Gradient(G)}=\sqrt{G_x^2+G_y^2} EdgeGradient(G)?=Gx2?+Gy2? ?
      • 角度A n g l e ( θ ) = t a n ? 1 ( G x G y ) Angle(\theta)=tan^{-1}(\frac{G_x}{G_y}) Angle(θ)=tan?1(Gy?Gx??)
        • 梯度的方向一般总与边界垂直
        • 梯度方向被归为四类:垂直,水平,和两个对角线
  • 非极大值抑制
    • 在获取了梯度和方向后,遍历图像,去除所有不是边界的点
    • 实现方法: 逐个遍历像素点,判断当前像素点是否是周围像素点中具有相同方向梯度的最大值
  • 滞后阈值
    { 梯 度 值 > m a x V a l 边 界 m a x V a l > 梯 度 值 > m i n V a l 与 边 界 相 连 , 保 留 。 否 则 抛 弃 梯 度 值 < m i n V a l 抛 弃 \begin{cases} 梯度值> maxVal & 边界\\ maxVal> 梯度值> minVal & 与边界相连,保留。否则抛弃\\ 梯度值< minVal & 抛弃 \end{cases} ??????梯度值>maxValmaxVal>梯度值>minVal梯度值
Canny函数及使用
  • 函数Canny edges = cv2.Canny(image, threshold1, threashold2)
    • 参数
      • image : 原始图像
      • threshold1 : 阈值1 (minVal)
      • threshold2 : 阈值2 (maxVal)
    • 返回值
      • edges : 边缘图像
Canny实例
import cv2o = cv2.imread("/home/forrest/图片/lena彩图.jpg", cv2.IMREAD_GRAYSCALE) cv2.imshow("lena", o)r1 = cv2.Canny(o, 100, 200) cv2.imshow("result1", r1)r2 = cv2.Canny(o, 64, 128) cv2.imshow("result2", r2)cv2.waitKey() cv2.destroyAllWindows()

  • 原图
    OpenCV|Python+Opencv Canny边缘检测
    文章图片
  • 结果1
    OpenCV|Python+Opencv Canny边缘检测
    文章图片
  • 结果2
    OpenCV|Python+Opencv Canny边缘检测
    文章图片

    推荐阅读