Python OpenCV基于霍夫圈变换算法检测图像中的圆形

 更新时间:2021年12月20日 14:32:54   作者:挣扎的蓝藻  
这篇文章主要介绍了通过霍夫圈变换算法检测图像中的圆形,文中用到的函数为cv2.HoughCircles(),该函数可以很好地检测圆心。感兴趣的小伙伴可以了解一下

第一章:霍夫变换检测圆

① 实例演示1

这个是设定半径范围 0-50 后的效果。

② 实例演示2

这个是设定半径范围 50-70 后的效果,因为原图稍微大一点,半径也大了一些。

③ 霍夫变换函数解析

cv.HoughCircles() 方法

参数分别为:image、method、dp、minDist、param1、param2、minRadius、maxRadius

其中:

  • image 为灰度图像;
  • method 使用的方法为霍夫梯度法,目前已知的有 HOUGH_GRADIENT 和 HOUGH_GRADIENT_ALT 两种,后者的准确率会更高一点;
  • dp 为累加器分辨率与图片分辨率的反比。
  • minDist 为两个圆中心的最小距离;
  • param1 对于 CV_HOUGH_GRADIENT 表示传入 canny 边缘检测的阈值;
  • param2 对于 CV_HOUGH_GRADIENT 表示检测阶段圆心的累加阈值,值越小能检测出的圆越多,值越大的话就检测出来的少,但是检测出来的圆形相比于没检测出来的会更圆、更完美一些;
  • minRadius 为最小半径;
  • minRadius 为最大半径;

首先通过均值偏移滤波降噪来排除干扰的点,提高识别的准确率,然后进行灰度处理。

# 均值偏移滤波降噪处理
mean_filter_img = cv.pyrMeanShiftFiltering(image, 10, 100)
cv.imshow("mean_filter_img", mean_filter_img)

# 图像灰度处理
gray_img = cv.cvtColor(mean_filter_img, cv.COLOR_BGR2GRAY)

# 霍夫圈变换
# 参数分别为:image, method, dp, minDist, param1, param2, minRadius, maxRadius
# 其中:image为灰度图像,method使用的方法为霍夫梯度法,minDist两个圆中心的最小距离
circles = cv.HoughCircles(gray_img, cv.HOUGH_GRADIENT, 1, 30, param1=50, param2=30, minRadius=0, maxRadius=50)

第二章:Python + opencv 完整检测代码

① 源代码

# -*- coding:utf-8 -*-
# 2021-12-17
# 作者:小蓝枣
# opencv圆形检测

import cv2 as cv
import numpy as np

def detect_circle(image):
    '''
     作用:圆形检测
     参数:需要检测圆的图片
     返回:检测出圆形的信息
    '''
    # 均值偏移滤波降噪处理
    mean_filter_img = cv.pyrMeanShiftFiltering(image, 10, 100)
    cv.imshow("mean_filter_img", mean_filter_img)
    
    # 图像灰度处理
    gray_img = cv.cvtColor(mean_filter_img, cv.COLOR_BGR2GRAY)
    
    # 霍夫圈变换
    # 参数分别为:image, method, dp, minDist, param1, param2, minRadius, maxRadius
    # 其中:image为灰度图像,method使用的方法为霍夫梯度法,minDist两个圆中心的最小距离
    circles = cv.HoughCircles(gray_img, cv.HOUGH_GRADIENT, 1, 30, param1=50, param2=30, minRadius=0, maxRadius=50)
    
    # 对数据进行取整
    print("取整前信息:" + str(circles))
    circles = np.uint16(np.around(circles))
    print("取整后信息:" + str(circles))
    
    return circles
    
def draw_circle(img, circles):
    '''
     作用:根据圆形信息在图片中绘制圆
     参数1:原始图片信息
     参数2:圆形坐标信息
     返回:无
    '''
    for i in circles[0, :]:
        # 绘制圆外圈
        # 参数分别为:圆心、半径、颜色、线框宽度
        cv.circle(img, (i[0], i[1]), i[2], (0, 0, 255), 2)
        # 绘制圆心 
        cv.circle(img, (i[0], i[1]), 2, (255, 0, 0), 2)
    cv.imshow("draw_circle_img", img)

# 读取图片信息
img = cv.imread("./image/meixi.jpg")

# 设置窗口不可改变大小(参数包含:WINDOW_AUTOSIZE、WINDOW_NORMAL、WINDOW_OPENGL)
cv.namedWindow("original image", cv.WINDOW_AUTOSIZE)
cv.imshow("original image", img)

# 检测圆
circles = detect_circle(img)
#绘制圆
draw_circle(img, circles)

cv.waitKey(0)
cv.destroyAllWindows()

② 运行效果图

原始图片:

降噪后效果:

霍夫变换检测圆处理后效果:

取整后效果图:

到此这篇关于Python OpenCV基于霍夫圈变换算法检测图像中的圆形的文章就介绍到这了,更多相关OpenCV霍夫圈变换算法检测圆形内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 图像检索之基于vlfeat实现SIFT特征

    图像检索之基于vlfeat实现SIFT特征

    SIFT特征的讲解已经很多了,本文就借助vlfeat对SIFT特征的提取过程做一个总结。接下来通过本文给大家介绍图像检索之基于vlfeat实现SIFT,感兴趣的朋友跟随小编一起看看吧
    2021-12-12
  • Python构造函数属性示例魔法解析

    Python构造函数属性示例魔法解析

    Python构造函数和属性魔法是面向对象编程中的关键概念,它们允许在类定义中执行特定操作,以控制对象的初始化和属性访问,本文将深入学习Python中的构造函数和属性魔法,包括构造函数__init__、属性的@property和@attribute.setter等,以及它们的实际应用
    2023-12-12
  • Python 脚本的三种执行方式小结

    Python 脚本的三种执行方式小结

    今天小编就为大家分享一篇Python 脚本的三种执行方式小结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • Python利用Scrapy框架爬取豆瓣电影示例

    Python利用Scrapy框架爬取豆瓣电影示例

    这篇文章主要介绍了Python利用Scrapy框架爬取豆瓣电影,结合实例形式分析了Python使用Scrapy框架爬取豆瓣电影信息的具体操作步骤、实现技巧与相关注意事项,需要的朋友可以参考下
    2020-01-01
  • Python JMESPath库轻松操作JSON进行数据查询方法实例

    Python JMESPath库轻松操作JSON进行数据查询方法实例

    这篇文章主要为大家介绍了Python JMESPath库轻松操作JSON方法实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Python的三种主要模块介绍

    Python的三种主要模块介绍

    这篇文章介绍了Python的三类主要模块,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • 基于python实现新春烟花盛宴效果

    基于python实现新春烟花盛宴效果

    这篇文章给大家用Python绽放了一场新春烟花盛宴,这里提前祝大家新春快乐呀,文中通过代码示例给大家介绍的非常详细,感兴趣的小伙伴可以自己动手尝试一下
    2024-02-02
  • python将数据插入数据库的代码分享

    python将数据插入数据库的代码分享

    在本篇文章里小编给大家整理的是关于python将数据插入数据库的代码内容,有兴趣的朋友们可以参考下。
    2020-08-08
  • python传递参数方式小结

    python传递参数方式小结

    这篇文章主要介绍了python传递参数方式,实例总结了Python常用的参数传递方式,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • Python基类函数的重载与调用实例分析

    Python基类函数的重载与调用实例分析

    这篇文章主要介绍了Python基类函数的重载与调用方法,实例分析了Python中基类函数的重载及调用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01

最新评论