zoukankan      html  css  js  c++  java
  • OpenCV-Python-边缘检测

    Canny边缘检测方法被誉为边缘检测的最优方法。

    import cv2
    import numpy as np
    img = cv2.imread('handwriting.jpg', 0)
    edges = cv2.Canny(img, 30, 70)    # canny边缘检测
    
    cv2.imshow('canny', np.hstack((img, edges)))
    cv2.waitKey(0)

    cv2.Canny()进行边缘检测,参数2、参数3表示最低和最高阈值。

    Canny边缘检测

    具体步骤如下:

    1. 使用5x5高斯滤波消除噪声:

    边缘检测本身属于锐化操作,对噪声比较敏感,所以需要进行平滑处理。高斯滤波的具体内容参考前篇:OpenCV-Python教程9-平滑图像

    2. 计算图像梯度的方向:

    首先使用Sobel算子计算两个方向上的梯度Gx和Gy,然后算出梯度的方向:

    保留这四个方向上的梯度:0°、45°、90°、135°

    3. 取局部最大值:

    在四个角度方向上取局部最大值

    4. 滞后阈值

    经过前面三步,剩下0和可能的边缘梯度值。通过设定两个阈值来筛选阈值:

    • 像素点的值大于最高阈值,那肯定是边缘(上图A)
    • 像素值小于最低阈值,那肯定不是边缘
    • 像素值介于两者之间,如果高于最高阈值的点连接,也算边缘。所以C算,B不算

    Canny推荐的高低阈值比在 2 : 1 到 3 : 1 之间

    先阈值分割后检测

    很多情况下,先阈值分割后再检测边缘,效果会更好:

    # 先阈值分割后检测
    _, thresh = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    
    edges = cv2.Canny(thresh, 30, 70)
    
    cv2.imshow('canny', np.hstack((img, thresh, edges)))
    cv2.waitKey(0)

    参考地址:http://ex2tron.wang/opencv-python-edge-detection/

  • 相关阅读:
    C#6.0新语法
    C#泛型详解
    C#下Hashtable和Dictionary之间的差别
    C#中HashTable的用法
    MySQL日志
    MySQL创建数据表并建立主外键关系
    MySQL函数的使用
    MySQL实现SQL Server排名函数
    Windows安装SVN服务器和客户端
    Oracle SQL Developer 免费的DB2客户端
  • 原文地址:https://www.cnblogs.com/gezhuangzhuang/p/10711201.html
Copyright © 2011-2022 走看看