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(θ)=tan1(GyGx)
        • 梯度的方向一般总与边界垂直
        • 梯度方向被归为四类:垂直,水平,和两个对角线
  • 非极大值抑制
    • 在获取了梯度和方向后,遍历图像,去除所有不是边界的点
    • 实现方法: 逐个遍历像素点,判断当前像素点是否是周围像素点中具有相同方向梯度的最大值
  • 滞后阈值
    { 梯 度 值 > 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<minVal

Canny函数及使用

  • 函数Canny edges = cv2.Canny(image, threshold1, threashold2)
    • 参数
      • image : 原始图像
      • threshold1 : 阈值1 (minVal)
      • threshold2 : 阈值2 (maxVal)
    • 返回值
      • edges : 边缘图像

Canny实例

import cv2

o = 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()
  • 原图
    Python+Opencv Canny边缘检测_第1张图片
  • 结果1
    Python+Opencv Canny边缘检测_第2张图片
  • 结果2
    Python+Opencv Canny边缘检测_第3张图片

你可能感兴趣的:(OpenCV,Python)