【python】OpenCV—Hough Circle Transform

devtools/2025/3/13 16:41:58/

在这里插入图片描述

文章目录

  • 1、功能描述
  • 2、代码实现
  • 3、效果展示
  • 4、完整代码
  • 5、涉及到的库函数
  • 6、参考


更多有趣的代码示例,可参考【Programming】


1、功能描述

2、代码实现

载入必要的库

python">import sys
import cv2 as cv
import numpy as np

函数入口

python">if __name__ == "__main__":main(sys.argv[1:])

读取图片,判断图片读取是否成功

python">    default_file = '1.jpg'filename = argv[0] if len(argv) > 0 else default_file# Loads an imagesrc = cv.imread(cv.samples.findFile(filename), cv.IMREAD_COLOR)# Check if image is loaded fineif src is None:print('Error opening image!')print('Usage: hough_circle.py [image_name -- default ' + default_file + '] \n')return -1

在这里插入图片描述

输入图片转成灰度图

python">    gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)cv.imwrite("gray.jpg", gray)

在这里插入图片描述

灰度图片进行平滑滤波

python">    gray = cv.medianBlur(gray, 5)cv.imwrite("medianBlur.jpg", gray)

在这里插入图片描述

配置好算法需要的参数

python">    rows = gray.shape[0]print(rows)

output

python">202

调用圆形检测算法

python">    circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, dp=1, minDist=rows / 8,param1=100, param2=30,minRadius=30, maxRadius=100)

根据预测的结果绘制出来圆形,包含圆心和圆

python">    if circles is not None:circles = np.uint16(np.around(circles))for i in circles[0, :]:center = (i[0], i[1])# circle centercv.circle(src, center, 1, (0, 100, 100), 3)# circle outlineradius = i[2]cv.circle(src, center, radius, (255, 0, 255), 3)

在这里插入图片描述
保存结果,可视化结果,退出窗口,退出主函数

python">    cv.imwrite("circles.jpg", src)cv.imshow("detected circles", src)cv.waitKey(0)return 0

3、效果展示

python">    circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, dp=1, minDist=rows / 8,param1=150, param2=30,minRadius=70, maxRadius=200)

输入图片

在这里插入图片描述

平滑后

在这里插入图片描述
检测结果

在这里插入图片描述


python">    circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, dp=1, minDist=rows / 8,param1=150, param2=50,minRadius=25, maxRadius=100)

输入图片

在这里插入图片描述
平滑后

在这里插入图片描述

结果

在这里插入图片描述


python">    circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, dp=1, minDist=rows / 8,param1=70, param2=30,minRadius=20, maxRadius=100)

输入图片

在这里插入图片描述

灰度图平滑

在这里插入图片描述

检测结果

在这里插入图片描述


    circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, dp=1, minDist=rows / 8,param1=70, param2=45,minRadius=110, maxRadius=200)

输入图片

在这里插入图片描述

灰度平滑后

在这里插入图片描述

检测结果

在这里插入图片描述


python">    circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, dp=1, minDist=rows / 8,param1=70, param2=40,minRadius=20, maxRadius=100)

输入图片

在这里插入图片描述

灰度平滑后

在这里插入图片描述

检测结果

在这里插入图片描述


python">    circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, dp=1, minDist=rows / 8,param1=70, param2=40,minRadius=20, maxRadius=70)

输入图片

在这里插入图片描述

灰度平滑后

在这里插入图片描述

检测结果

在这里插入图片描述


python">    circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, dp=1, minDist=rows / 8,param1=100, param2=35,minRadius=20, maxRadius=70)

输入图片

在这里插入图片描述

灰度滤波后

在这里插入图片描述
检测结果

在这里插入图片描述

4、完整代码

python">import sys
import cv2 as cv
import numpy as npdef main(argv):default_file = '1.jpg'filename = argv[0] if len(argv) > 0 else default_file# Loads an imagesrc = cv.imread(cv.samples.findFile(filename), cv.IMREAD_COLOR)# Check if image is loaded fineif src is None:print('Error opening image!')print('Usage: hough_circle.py [image_name -- default ' + default_file + '] \n')return -1gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)cv.imwrite("gray.jpg", gray)gray = cv.medianBlur(gray, 5)cv.imwrite("medianBlur.jpg", gray)rows = gray.shape[0]print(rows)circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, dp=1, minDist=rows / 8,param1=100, param2=30,minRadius=30, maxRadius=100)if circles is not None:circles = np.uint16(np.around(circles))for i in circles[0, :]:center = (i[0], i[1])# circle centercv.circle(src, center, 1, (0, 100, 100), 3)# circle outlineradius = i[2]cv.circle(src, center, radius, (255, 0, 255), 3)cv.imwrite("circles.jpg", src)cv.imshow("detected circles", src)cv.waitKey(0)return 0if __name__ == "__main__":main(sys.argv[1:])

5、涉及到的库函数

cv2.HoughCircles 是 OpenCV 库中的一个函数,用于在图像中检测圆形的存在。它基于霍夫变换的圆检测算法,可以在给定的图像中检测并返回所有检测到的圆的信息,如圆的中心坐标和半径。

在这里插入图片描述

python">circles = cv2.HoughCircles(image, method, dp, minDist, param1, param2, minRadius, maxRadius)
  • image:输入的单通道灰度图像。函数将在该图像中进行圆检测。

  • method:霍夫变换的检测方法。常用的有 cv2.HOUGH_GRADIENTcv2.HOUGH_GRADIENT_ALTcv2.HOUGH_GRADIENT_ALTcv2.HOUGH_GRADIENT 的改进方法。

  • dp:图像分辨率与累加器分辨率的比值。例如,dp=1时,累加器和输入图像有相同的分辨率;dp=2时,累加器是输入图像一半大的宽高。

  • minDist:检测到的圆的中心之间的最小距离。如果设置得太小,可能会检测到多个相邻的圆;如果设置得太大,可能会漏掉一些圆。

  • param1:Canny边缘检测的高阈值。对于 cv2.HOUGH_GRADIENTcv2.HOUGH_GRADIENT_ALT,这是 Canny 边缘检测的高阈值,低阈值是该参数的一半。

  • param2:累加器阈值。对于 cv2.HOUGH_GRADIENT,它表示检测阶段圆心的累加器阈值,值越小,检测出的圆越多;对于 cv2.HOUGH_GRADIENT_ALT,它表示圆形的“完美性”度量,值越接近1,算法选择的圆形形状越好。

  • minRadius:需要检测的最小圆半径。

  • maxRadius:需要检测的最大圆半径。如果设置为<=0,则使用最大图像尺寸;如果<0,且 method=cv2.HOUGH_GRADIENT时,用来查找圆心而忽略半径的查找,method=cv2.HOUGH_GRADIENT_ALT 不受影响,始终会去找半径。

返回值

  • circles:返回的圆形的点,是一个三维数组。对于 HOUGH_GRADIENTHOUGH_GRADIENT_ALT 两种方法,返回的圆形数组形式有差异。通常,返回的数组中包含了检测到的圆的中心坐标和半径。

注意事项

  • 输入图像的质量对函数的检测效果有很大的影响,通常需要进行适当的预处理,如平滑、边缘检测等。
  • 参数的选择对检测的结果有重要的影响,需要根据具体的应用场景进行调整和优化。
  • 函数返回的圆的信息需要进一步处理和分析,以满足实际应用的需求。

应用场景

  • cv2.HoughCircles 函数在很多领域都有重要的应用,如医学影像分析、工业机器视觉、自动驾驶等。例如,在医学影像分析中,常常需要检测和分析图像中的各种病变和器官,如肿瘤、血管等。使用 cv2.HoughCircles 函数,可以有效地在医学影像中检测出各种形状的病变,为医生的诊断和治疗提供重要的参考依据。

6、参考


更多有趣的代码示例,可参考【Programming】


http://www.ppmy.cn/devtools/166819.html

相关文章

Bash和Zsh在处理大文件时差异

在处理大文件时&#xff0c;Bash 和 Zsh 的差异主要体现在几个方面&#xff1a; 1. 脚本执行速度 Bash: 性能: Bash在执行脚本时通常表现良好&#xff0c;尤其是在处理大量数据或大文件时。Bash的脚本执行速度相对较快&#xff0c;适合大多数日常使用场景。优化: Bash在处理大…

【每日学点HarmonyOS Next知识】获取资源问题、软键盘弹起、swiper更新、C给图片设置位图、读取本地Json

1、HarmonyOS Resource获取value问题&#xff1f; 在resources-base-elements-string.json中创建了一个字符串常量&#xff0c;使用Text组件引用可以正常展示&#xff0c;但使用resourceManager.getSystemResourceManager().getStringValue()方法获取&#xff0c;提示9001001。…

Java EE 进阶:SpringBoot 配置⽂件

什么是配置文件 “配置文件”是一个用来保护程序或者系统设置信息的文件&#xff0c;它的作用是让程序在启动或者运行中&#xff0c;能够读取这些设置并按预期进行工作&#xff0c;而不需要手动的设置。 Spring Boot 配置文件 设置服务器端口、编码格式配置数据库连接控制日…

深入解析pnpm与npm:颠覆传统包管理的技术革命与应用实践

深入解析pnpm与npm&#xff1a;颠覆传统包管理的技术革命与应用实践 引言&#xff1a;被node_modules支配的恐惧 "你的node_modules有多大&#xff1f;"这个灵魂拷问总能引发开发者会心一笑。当项目规模达到500MB时&#xff0c;npm install需要喝三杯咖啡的时间&am…

每日OJ_牛客_过桥_贪心+BFS_C++_Java

目录 牛客_过桥_贪心BFS 题目解析 C代码 Java代码 牛客_过桥_贪心BFS 过桥 描述&#xff1a; dd被困在了一个迷幻森林&#xff0c;现在她面前有一条凶险的大河&#xff0c;河中央有n个神奇的浮块&#xff0c;浮块按1∼n1顺序标号&#xff0c;但两两并不相接&…

Spring Boot拦截器(Interceptor)详解

拦截器Interceptor 拦截器我们主要分为三个方面进行讲解&#xff1a; 介绍下什么是拦截器&#xff0c;并通过快速入门程序上手拦截器拦截器的使用细节通过拦截器Interceptor完成登录校验功能 1. 快速入门 什么是拦截器&#xff1f; 是一种动态拦截方法调用的机制&#xff…

Python Selenium库入门使用,图文详细。附网页爬虫、web自动化操作等实战操作。

文章目录 前言1 创建conda环境安装Selenium库2 浏览器驱动下载&#xff08;以Chrome和Edge为例&#xff09;3 基础使用&#xff08;以Chrome为例演示&#xff09;3.1 与浏览器相关的操作3.1.1 打开/关闭浏览器3.1.2 访问指定域名的网页3.1.3 控制浏览器的窗口大小3.1.4 前进/后…

【华为OD机考真题】- 星际篮球争霸赛(Java)

1. 题目描述 具体题目描述如下&#xff1a; 在星球争霸篮球赛对抗赛中&#xff0c;最大的宇宙战队希望每个人都能拿到 MVP&#xff0c;MVP 的条件是单场最高分得分获得者。 可以并列&#xff0c;所以宇宙战队决定在比赛中&#xff0c;尽可能让更多队员上场,并且让所有得分的选手…