Python opencv进行圆形识别(圆检测)实例代码

 更新时间:2023年05月12日 11:06:02   作者:老李的森林  
最近工作的项目上需要检测图像中是否有圆形,下面这篇文章主要给大家介绍了关于Python opencv进行圆形识别(圆检测)的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

前言

圆形识别(圆检测)是图像识别中很常见的一种处理方式,最核心的是cv2.HoughCircles这个函数实现的圆形检测。当然还有一些其他的处理过程,以下详述:

1 读入图像

首先需要读取一个图像文件,将其作为一个变量

img = cv2.imread("save1.jpg", 0)     # 0或者cv2.IMREAD_GRAYSCALE  读取为灰度图像
img2 = cv2.imread("save1.jpg", 1)     # 1或者cv2.IMREAD_COLOR 读取为为彩色图像

img是一个ndarray,2维结构,包含的是灰度化后的图像信息

img2是一个ndarray,3维结构,包含的是RGB彩色图像信息,比img2多出一个色彩维度

如下图,img2是3个方括号“[”

2 图像预处理

可以对图像进行裁切,滤波等处理,当然不处理也可以直接用,以下展示一下:

裁切

size = 400
x1 = 560
y1 = 200
x2 = x1+size
y2 = y1+size
cut = img[y1:y2, x1:x2]

滤波加二值化

numpy_img = cv2.adaptiveThreshold(cut, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 15)   # 自动阈值二值化

显示中间处理过程

有时候我们需要直观的看到中间处理过程的图像样貌,可以随时显示

cv2.imshow("img", img)
cv2.imshow("cut", cut)
cv2.imshow("numpy_img", numpy_img)
cv2.waitKey(0)

注意imshow函数,第一个参数是要显示的窗口的标题,不得用中文和中文标点,必须全英文,否则会乱码,第2个参数是待显示的图像变量
最后一行可以没有,如果有的话,程序会在此等待,直到有按键动作,程序才继续往后运行。这对我们调试比较有用。

3 圆形识别

#                                                      圆心距 canny阈值    投票数      最小半径       最大半径
circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 170,   param1=100, param2=60,  minRadius=60, maxRadius=90)

大概讲一下重要的几个参数,参数与实际的图像尺寸相关,不是一个参数用所有的图

圆心距:170 圆心距小于此值的圆不检测,以减小计算量

canny阈值:图像二值化的参数,根据实际情况调整

投票数:一个圆需要至少包含多少个点,才认为这是一个圆

最小半径,最大半径:在此值之间的圆才是需要的圆,超过范围不检测,以减小计算量

检测完的结果保存在circles 中

可以自己调整参数以观察结果

4 显示检测结果

没啥好说的,代码很简单,就是对于每个结果画出圆和圆心

arr1 = np.zeros([0, 2], dtype=int)                      # 创建一个0行, 2列的空数组
if circles is not None:
    circles = np.uint16(np.around(circles))   # 4舍5入, 然后转为uint16
    for i in circles[0, :]:
        arr1 = np.append(arr1, (i[0], i[1]))            # arr1是圆心坐标的np数组
        # print(arr1)
        cv2.circle(img2, (i[0], i[1]), i[2], (0, 0, 255), 3)  # 轮廓
        cv2.circle(img2, (i[0], i[1]), 2, (0, 0, 0), 6)     # 圆心

5 完整代码和示例图像

可以在这里下载:示例代码下载

总结

到此这篇关于Python opencv进行圆形识别(圆检测)的文章就介绍到这了,更多相关opencv圆形识别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python数据分析绘图可视化

    python数据分析绘图可视化

    这篇文章主要介绍了python数据分析绘图可视化,数据可视化旨在直观展示信息的分析结果和构思,令某些抽象数据具象化,这些抽象数据包括数据测量单位的性质或数量
    2022-06-06
  • Python中八大图像特效算法的示例详解

    Python中八大图像特效算法的示例详解

    图像特效处理是基于图像像素数据特征,将原图像进行一定步骤的计算——例如像素作差、灰度变换、颜色通道融合等,从而达到期望的效果。本文将为大家介绍八种常用的图像特效算法,需要的可以参考一下
    2022-03-03
  • Python中返回字典键的值的values()方法使用

    Python中返回字典键的值的values()方法使用

    这篇文章主要介绍了Python中返回字典键的值的values()方法使用,是Python入门学习中的基础知识,需要的朋友可以参考下
    2015-05-05
  • python实现文件快照加密保护的方法

    python实现文件快照加密保护的方法

    这篇文章主要介绍了python实现文件快照加密保护的方法,涉及Python文件加密的技巧,可有效防止文件被篡改,需要的朋友可以参考下
    2015-06-06
  • django 修改server端口号的方法

    django 修改server端口号的方法

    今天小编就为大家分享一篇django 修改server端口号的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • Python Flask + Redis 程序练习

    Python Flask + Redis 程序练习

    这篇文章主要给大家分享Python Flask + Redis 程序的练习,准备一个Python文件,名字为 app.py 提供一个web服务,可以访问地址,返回一个Hello Container World!并且记录访问的次数,下面来看看有趣的练习过程吧
    2022-01-01
  • 浅析Python模块之间的相互引用问题

    浅析Python模块之间的相互引用问题

    这篇文章主要介绍了Python模块之间的相互引用问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • Python异步爬虫多线程与线程池示例详解

    Python异步爬虫多线程与线程池示例详解

    这篇文章主要为大家介绍了Python异步爬虫多线程与线程池示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-09-09
  • 利用python实现短信和电话提醒功能的例子

    利用python实现短信和电话提醒功能的例子

    今天小编就为大家分享一篇利用python实现短信和电话提醒功能的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • pytorch 加载(.pth)格式的模型实例

    pytorch 加载(.pth)格式的模型实例

    今天小编就为大家分享一篇pytorch 加载(.pth)格式的模型实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08

最新评论