015 OpenCV 霍夫变换(圆检测)

目录

一、环境

二、算法原理

三、完整代码


一、环境

本文使用环境为:

  • Windows10
  • Python 3.9.17
  • opencv-python 4.8.0.74

二、算法原理

霍夫圆检测(Hough Circle Detection)是计算机视觉中一种常用的图像处理技术,主要用于检测图像中的圆形物体。它是由Paul Hough于1962年提出的,因此得名。霍夫圆检测算法在很多领域都有广泛的应用,如工业自动化、机器人视觉、医学图像分析等。

霍夫圆检测算法的基本原理是:在一个图像中,如果一个点到某个固定半径为r的圆心的距离小于等于r,那么这个点就被认为是在圆上。通过统计图像中所有可能的圆心位置和半径,可以找到满足条件的圆。具体来说,霍夫圆检测算法可以分为以下几个步骤:

  1. 将图像转换为灰度图像。这是因为在灰度图像中,圆形物体的边缘信息更容易提取。

  2. 对灰度图像进行预处理。预处理的目的是消除噪声和提高边缘检测的准确性。常用的预处理方法有高斯滤波、中值滤波等。

  3. 使用边缘检测算法提取图像中的边缘信息。边缘检测算法有很多种,如Sobel算子、Canny算子等。边缘检测的目的是找到图像中亮度变化较大的像素点,这些像素点通常对应于物体的边缘。

  4. 对边缘图像进行霍夫变换。霍夫变换是一种用于寻找图像中特定形状的方法,它将图像从二维空间映射到一个参数空间(如圆心坐标和半径)。在这个参数空间中,每个可能的圆都对应着一条曲线。通过统计曲线的交点个数,可以估计原图像中圆的数量和位置。

  5. 对霍夫变换的结果进行后处理。后处理的目的是消除误检和减少计算量。常用的后处理方法有:设定一个阈值,只保留交点个数大于阈值的圆;对交点进行聚类,将距离较近的交点合并为一个圆等。

OpenCV中的HoughCircles函数的接口如下:

python 复制代码
cv2.HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]])

OpenCV中的HoughCircles函数的参数如下:

  • image:输入图像,必须是8位单通道灰度图像。
  • method:检测方法,目前主要支持cv2.HOUGH_GRADIENTcv2.HOUGH_GRADIENT_ALT两种方法,其中后者是前者的改进方法。
  • dp:此参数已在OpenCV的最新版本中弃用。
  • minDist:此参数代表两个圆之间的最小距离。
  • circles:调用HoughCircles函数后,此参数将存储检测到的圆的输出矢量,每个矢量由包含三个元素的浮点矢量(x,y,radius)表示。
  • param1param2:此参数已在OpenCV的最新版本中弃用。
  • minRadiusmaxRadius:这两个参数代表要检测的圆的最小半径和最大半径。

三、完整代码

python 复制代码
import sys
import cv2 as cv
import numpy as np


def main(argv):
    # 读取图片
    default_file = 'data/smarties.png'
    filename = argv[0] if len(argv) > 0 else default_file
    src = cv.imread(cv.samples.findFile(filename), cv.IMREAD_COLOR)

    if src is None:
        print ('Error opening image!')
        print ('Usage: hough_circle.py [image_name -- default ' + default_file + '] \n')
        return -1
    # 彩色图转灰度图
    gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
    # 中值滤波,用于降噪
    gray = cv.medianBlur(gray, 5)
    # 霍夫圆检测
    rows = gray.shape[0]
    circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, 1, rows / 8,
                               param1=100, param2=30,
                               minRadius=1, maxRadius=30)
    # 绘制圆
    if circles is not None:
        circles = np.uint16(np.around(circles))
        for i in circles[0, :]:
            center = (i[0], i[1]) #圆心
            # 绘制圆心
            cv.circle(src, center, 1, (0, 100, 100), 3)
            # 绘制圆轮廓
            radius = i[2]
            cv.circle(src, center, radius, (255, 0, 255), 3)
    cv.imshow("detected circles", src)
    cv.waitKey(0)
    return 0


if __name__ == "__main__":
    main(sys.argv[1:])
相关推荐
2501_942191773 分钟前
汽车脏污检测与识别 - YOLO11-C3k2-PSFSConv优化模型详解
python
冰西瓜6004 分钟前
从项目入手机器学习(七)—— 模型调优
人工智能·机器学习
LittroInno5 分钟前
TVMS视频管理平台 —— 目标识别跟踪
人工智能·计算机视觉·音视频
喵手6 分钟前
Python爬虫实战:构建“下载-去重-入库”的图片采集流水线(附SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·sqlite持久化存储·采集图片·采集图片存储入库
爱内卷的学霸一枚7 分钟前
Python并发编程与性能优化实战指南
开发语言·python·性能优化
pusheng20259 分钟前
燃料电池电化学传感器在硫化物固态电池安全监测中的技术优势解析
前端·人工智能·安全
小贺儿开发9 分钟前
Unity3D 智慧城市管理平台
数据库·人工智能·unity·智慧城市·数据可视化
Blurpath住宅代理10 分钟前
如何在Python爬虫中使用代理IP?从配置到轮换的完整指南
网络·爬虫·python·住宅ip·住宅代理·动态住宅代理
Niuguangshuo11 分钟前
DALL-E 3:如何通过重构“文本描述“革新图像生成
人工智能·深度学习·计算机视觉·stable diffusion·重构·transformer
DeniuHe12 分钟前
Pytorch中统计学相关的函数
pytorch·python·深度学习