网站首页 > 技术文章 正文
基于python使用OpenCV实现在一张图片中检测出圆形,并且根据圆检测结果信息,绘制 标记出圆的边界和圆心。
1 HoughCircles 霍夫圆检测
在Opencv中使用HoughCircles函数实现圆的检测,具体函数参数如下:
- image: 输入图像,8位灰度单通道图像
- method: 检测圆的方法,目前OpenCV中有HOUGH_GRADIENT和HOUGH_GRADIENT_ALT两种方法。
- dp: 检测圆心的累加器图像的分辨率与输入图像之比的倒数,如果dp= 1时,累加器和输入图像具有相同的分辨率。如果dp=2,累加器输入图像便有输入图像一半那么大的宽度和高度。减少图像的分辨率(宽高变小)是为了减少计算量,一般默认为1就好,保持原有图像精度。
- minDist: 检测到的两个圆心之间的最小距离。如果参数太小,除了真实的一个圆圈之外,可能错误地检测到多个相邻的圆圈。如果太大,可能会遗漏一些圆圈。
- circles: 检测到的圆的信息输出向量(x,y,r),分别代表检测到圆的中心坐标和圆半径。
- param1: Canny 边缘检测的高阈值,低阈值被自动置为高阈值的一半,默认为 100。也就是说检测图像中像素点的值大于param1是会检测为边缘。
- param2: 表示在检测阶段圆心的累加器阈值。它越小的话,会误检测到更多根本不存在的小圆,而越大,能通过检测的圆就更加接近完美的圆形了。
- minRadius: 表示图像中能检测到最小圆的半径的值。
- maxRadius: 表示图像中检测到的圆的最大半径的值。
参数设置总结
- param2值的设置根据要检测图像中圆的大小进行设置,minRadius最小圆半径和maxRadius最大圆半径可以辅助我们更好选择圆,如果没有特殊需要就都默认为0。minDist可以帮助我们筛选掉检测相近的圆。
- 霍夫圆检测的原理:第一步通过Canny边缘检测算法检测边缘,发现可能的圆心,然后再计算边缘像素点到圆心的距离估计圆的半径。
2 HoughCircles 霍夫圆检测代码实现
实现霍夫圆检测的实现代码非常简单,首先使用cv2.cvtColor函数将要检测的图像转换为灰度图像,然后调用cv2.HoughCircles霍夫圆检测函数进行检测,检测返回所有圆的中心坐标和半径信息向量circles(x,y,r)。
注意: 霍夫圆检测对噪声比较敏感,所以进行霍夫圆检测的之前可以先进行中值滤波cv2.medianBlur。
def circle_detect(image):
# 灰度化
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 输出图像大小,方便根据图像大小调节minRadius和maxRadius
print(image.shape)
# 进行中值滤波
img = cv2.medianBlur(gray, 5)
# 霍夫变换圆检测
circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 50, param1=100, param2=30, minRadius=5, maxRadius=100)
for circle in circles[0]:
# 圆的基本信息
print(circle[2])
# 坐标行列-圆心坐标
x = int(circle[0])
y = int(circle[1])
# 半径
r = int(circle[2])
# 在原图用指定颜色标记出圆的边界
cv2.circle(image, (x, y), r, (0, 0, 255), 3)
# 画出圆的圆心
cv2.circle(image, (x, y),5, (0, 255, 0), -1)
cv2.imshow("image",image)
img = cv2.imread(r'D:\yolov5-5.0\data\images\1.jpg')
circle_detect(image=img)
cv2.waitKey(0)
最后再借助OpenCV中的画圆函数cv2.circle,cv2.Circle函数参数
- img: 要在其上绘制圆的输入图像
- center: 绘制圆的中心坐标(x,y),未设置shift参数时,默认为整数int类型。
- radius: 绘制圆的半径,未设置shift参数时,默认为整数int类型
- color: 绘制圆的边界线的颜色,OpenCV读取图像后,图像格式为BGR,即【0,255,255】表示用红色绘制圆的边缘。
- thickness:圆的边界线的粗细像素值。值为负(-1)时绘制实心圆。
- lineType:可选参数,线的类型:虚线、实线
- shift:可选参数,圆心坐标点和半径值的小数点位数。
3 检测效果
通过合理的控制minDist、minRadius、maxRadius、param2这四个参数的值,最终的检测效果如下图:
参考资料:
https://www.cnblogs.com/april0315/p/13657682.html
https://www.cnblogs.com/bjxqmy/p/12333022.ht
后台回复:项目实战,即可获取代码下载使用。
往期精彩:教你用OpenCV 和 Python给证件照换底色(蓝底 <->红底->白底) &&教你用OpenCV和Python实现手掌检测和手掌计数
猜你喜欢
- 2024-12-19 C++的23种设计模式(上篇-创建型模式)
- 2024-12-19 25000 字详解 23 种设计模式(多图 + 代码)
- 2024-12-19 开源的的二维绘图引擎,EChart在用的图形渲染器——ZRender
- 2024-12-19 手机拍大片诀窍记心间 掌上PS应用合集
- 2024-12-19 搞科研常用技能和绘图学习 科研绘图工具
- 2024-12-19 「服装小知识」服装各部位名称学习(中英对照)
- 2024-12-19 10分钟教你如何看懂GIA证书 怎么看gia证书的详细信息
- 2024-12-19 图片四个角怎么能做成圆弧角?这几种制作方法操作起来很简单!
- 2024-12-19 苹果梨篇:大庙香水梨 大香水梨品种介绍
- 2024-12-19 在理论里,一个粗糙的圆,是圆么?
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)