标准霍夫圆检测

  • 1. 简介
  • 2. 标准霍夫圆检测
    • 2.1 情形一
    • 2.2 情形二
    • 2.3 情形三
  • 3. 程序演示
  • 4. 结尾
  • 参考资料

1. 简介

1972年,R. D. DudaP. E. Hart1提出了直线的检测方法,而且还推广到了霍夫圆的检测方法,通常称为标准的霍夫圆检测。

2. 标准霍夫圆检测

2.1 情形一

已知圆的圆心坐标为(a,b)(a, b)(a,b),半径为rrr,则圆在xoyxoyxoy平面内的方程可表示为:(x−a)2+(y−b)2=r2(x-a)^2+(y-b)^2=r^2(x−a)2+(y−b)2=r2。那么反过来考虑一个简单的问题:已知xoyxoyxoy平面内的点(x1,y1)、(x2,y2)、(x3,y3)、...(x_1, y_1)、(x_2, y_2)、(x_3, y_3)、...(x1​,y1​)、(x2​,y2​)、(x3​,y3​)、...,且已知这些点在一个半径为rrr的圆上,如何求这个圆的圆心?

下面通过一个简单的示例来理解上述问题的求解过程。如下图1所示,假设在xoyxoyxoy平面内有三个点(1,3)、(2,2)、(3,3)(1, 3)、(2, 2)、(3, 3)(1,3)、(2,2)、(3,3),且知道这三个点在一个半径为1的圆上,可以通过中学知识尺规作图法找到圆心,以每个点为圆心、1为半径分别画圆,则这三个圆的交点及即为圆心。

图1 3个圆的交点定圆心

现从另一个角度来理解尺规作图的过程。将(1,3)(1, 3)(1,3)代入圆方程得(1−a)2+(3−b)2=12(1-a)^2+(3-b)^2=1^2(1−a)2+(3−b)2=12,所以可以理解为一个点对应到aobaobaob平面内的一个圆;同理,通过其他两个点也可以得到两个圆,那么这三个圆在aobaobaob平面内共同的交点即为三个点共圆的圆心。

2.2 情形二

在上面问题的基础上,提出一个稍微复杂一点的问题:已知xoyxoyxoy平面内的点(x1,y1)、(x2,y2)、(x3,y3)、...(x_1, y_1)、(x_2, y_2)、(x_3, y_3)、...(x1​,y1​)、(x2​,y2​)、(x3​,y3​)、...,且已知这些点在多个圆上,这些圆的半径均为rrr,那么哪些点在同一个圆上,并计算出圆心的坐标。

例如已知在xoyxoyxoy平面内有5个点(1,3)、(2,2)、(3,3)、(3,1)、(4,3)(1, 3)、(2, 2)、(3, 3)、(3, 1)、(4, 3)(1,3)、(2,2)、(3,3)、(3,1)、(4,3),且知道这些点可能位于不同的圆上,这些圆的半径均为1,求出哪些点在同一个圆上。这里也用尺规作图法,首先分别以5个点为圆心、1为半径作出5个圆,圆的交点即为圆心,如下图2所示。

图2 确定哪些点在同一个圆上

2.3 情形三

以上碰到的两种情况均是在已知半径的情况下,现引入一个更复杂的问题:已知xoyxoyxoy平面内的点(x1,y1)、(x2,y2)、(x3,y3)、...(x_1, y_1)、(x_2, y_2)、(x_3, y_3)、...(x1​,y1​)、(x2​,y2​)、(x3​,y3​)、...,求出哪些点在同一个圆上且半径为多少,以及圆心的坐标。由于多了一个参数,所以需要第三维的坐标rrr,即需要在三维空间abrabrabr中讨论该问题。任意一个点(xi,yi)(x_i, y_i)(xi​,yi​)对应到abrabrabr空间中的锥面(xi−a)2+(yi−b)2=r2(x_i-a)^2+(y_i-b)^2=r^2(xi​−a)2+(yi​−b)2=r2,那么如果多个锥面相交于一点(a′,b′,r′)(a', b', r')(a′,b′,r′),则说明这些锥面对应的xoyxoyxoy平面内的点是共圆的且圆心为(a′,b′)(a', b')(a′,b′),半径为r′r'r′,如下图3所示。

图3 确定哪些点在同一个圆上,以及对应的半径和圆心

该过程相当于先固定rrr,然后转换为以上讨论的已知rrr的情况,即第二个问题是第三个问题的一种特殊情况。

3. 程序演示

与霍夫直线检测类似,图像的霍夫圆检测就是检测哪些前景或边缘像素点在同一个圆上,并给出对应圆的圆心坐标及圆的半径;而且仍然需要计数器来完成该过程,只是这里的计数器从二维变成了三维,下面利用Python来详细描述构造三维计数器的过程,并对下图进行霍夫圆检测。

# -*- coding: utf-8 -*-
import sys
import numpy as np
import cv2
import math# 标准霍夫圆检测
def HTCircle(I, minR, maxR, voteThresh=100):# 宽、高H, W = I.shape# 归为整数minr = round(minR) + 1maxr = round(maxR) + 1# 初始化三维的计数器r_num = int(maxr - minr + 1)a_num = int(W - 1 + maxr + maxr + 1)b_num = int(H - 1 + maxr + maxr + 1)accumulator = np.zeros((r_num, b_num, a_num), np.int32)# 投票计数for y in range(H):for x in range(W):if (I[y][x] == 255):  # 只对边缘点做霍夫变换for k in range(r_num):  # r 变化的步长为 1for theta in np.linspace(0, 360, 360):# 计算对应的 a 和 ba = x - (minr + k) * math.cos(theta / 180.0 * math.pi)b = y - (minr + k) * math.sin(theta / 180.0 * math.pi)# 取整a = int(round(a))b = int(round(b))# 投票accumulator[k, b, a] += 1# 筛选投票数 大于 voteThresh的圆circles = []for k in range(r_num):for b in range(b_num):for a in range(a_num):if (accumulator[k, b, a] > voteThresh):circles.append((k + minr, b, a))return circles# 主函数
if __name__ == "__main__":# if len(sys.argv) > 1:# 输入图像I = cv2.imread('../data/coins.jpg', 1)# print(I.shape)# canny 边缘检测edge = cv2.Canny(I, 50, 200)cv2.imshow("edge", edge)cv2.waitKey()# 霍夫圆检测circles = HTCircle(edge, 30, 60, 80)# 画圆for i in range(len(circles)):cv2.circle(I, (int(circles[i][2]), int(circles[i][1])), int(circles[i][0]), (0, 0, 255), 2)# 绘制圆心cv2.circle(I,  (int(circles[i][2]), int(circles[i][1])), 2, (0, 0, 255), 3)cv2.imshow("detected circles", I)cv2.waitKey(0)cv2.destroyAllWindows()

检测效果如下图所示:

上述代码单纯从原理出发进行描述构造三维计数器的过程,目的是加深对标准霍夫圆检测原理的理解。由于其计算量较大运行效率较低,下一讲基于梯度霍夫圆检测函数HoughCircles将会在这些方面有较大的改进。

4. 结尾

在这一讲中,我们对标准霍夫圆检测由浅入深地分三种情形进行了讨论,从检测原理的角度出发给出了程序演示代码,描述构造三维计数器的过程,在下一讲将讲解基于梯度的霍夫圆检测函数。

参考资料

  1. 《OpenCV算法精解:基于Python和C++》(张平 编著),电子工业出版社,2017
  2. Duda R O , Hart P E . Use of the Hough Transform to Detect Lines and Curves in Pictures. 1975.

如果文章对你有帮助,请记得点赞与关注,谢谢!


  1. Duda R O , Hart P E . Use of the Hough Transform to Detect Lines and Curves in Pictures. 1975. ↩︎

OpenCV基于Python霍夫圆检测—标准霍夫圆检测相关推荐

  1. OpenCV基于Python霍夫圆检测—基于梯度的霍夫圆检测

    基于梯度的霍夫圆检测 1. 回顾与目标 2. 基于梯度的霍夫圆检测 2.1 问题分析 2.2 基于梯度的霍夫圆检测步骤 3. 基于梯度的霍夫圆检测函数HoughCircles 3.1 函数HoughC ...

  2. 基于Python机器视觉的远程害虫种类识别和数量检测系统 报告+项目源码及数据

    摘 要 农业与民生和经济发展息息相关,对农业发展科学化的关注既是民生需求, 也是经济稳步发展的迫切需求.病虫害是影响农作物生长的重要因素,对农作物的产量和品质都能造成无法估计的损害. 针对目前广大农业 ...

  3. OpenCV——基于Python开发的OpenCV安装教程

    1 前言 今天在学习R2CNN~ 2 安装步骤 使用pip命令在Anaconda环境中进行安装:(不需要使用源码编译进行安装,网上的教程简直是醉了,一大堆源码编译的教程,把人都弄昏了) 使用命令: # ...

  4. 计算机硬件检测标准模板,计算机硬件性能检测相关实验模板.doc

    文档介绍: 计算机硬件性能检测相关实验<计算机硬件性能检测>实验指导书实验目的:1.熟练掌握通过测试软件在不拆机情况下了解计算机硬件参数信息及性能检测方法;2.掌握常用CPU.内存.显卡. ...

  5. OpenCV之imgproc 模块. 图像处理(3)霍夫线变换 霍夫圆变换 Remapping 重映射 仿射变换

    霍夫线变换 目标 在这个部分您将学习到: 使用OpenCV的以下函数 HoughLines 和 HoughLinesP 来检测图像中的直线. 原理 Note 以下原理的说明来自书籍 学习OpenCV  ...

  6. OpenCV3学习(6.2)——霍夫(Hough)变换:霍夫线变换HoughLine,霍夫圆变换HoughCircles

    霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法.主要用来从图像中分离出具有某种相同特征的几何形状(如,直线,圆等).最基本的霍夫变换是从黑白图像中检测直线(线段) ...

  7. 口罩检测标准有哪些?

    疫情期间,口罩的消耗量巨大.与此同时口罩检测不合格的事情屡有发生,那么口罩检测到底有哪些标准?华碧鉴定为大家整理了一份详尽的口罩检测标准,为大家说明不同类型口罩的检测标准有哪些,检测项目又包含了什么. ...

  8. OpenCV标准霍夫直线检测详解

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转载自:OpenCV学堂 霍夫直线检测 对于图像来说可以从笛卡 ...

  9. android openCV检测图像的基本特征,包括Canny边缘检测、Harris角点检测、霍夫直线检测-基于Android studio

    实现平台:windows下的Android studio1.4 依赖库:openCV3.1.0 程序安装平台:Android6.0 实现的功能:从手机中选择一张图片,检测图片的基本特征,通过menu菜 ...

最新文章

  1. telnet 退出命令
  2. 脚本检测CDN节点资源是否与源站资源一致
  3. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1092:求出e的值
  4. 番茄花园win11 32位官方原版镜像文件v2021.07
  5. 形参和实参是什么?? shim和polyfil是什么意思??
  6. 2021年中国便利店发展报告
  7. Q4_一个事物领导另一个
  8. python自动化办公要学多久-深圳用python进行办公自动化都需要学习什么知识呢,谁来说下...
  9. 死磕Spring AOP系列2:剖析Bean处理器之BeanNameAutoProxyCreator
  10. E - 娜娜梦游仙境系列——莫名其妙的插曲
  11. 坚果pro2刷机分享
  12. 用js判断空对象的几种方法
  13. 几句话就能让你明白:热备份路由选择协议(HSRP)
  14. 教你微软原版win7下载安装教程
  15. 计算机识别人脸原理,人脸识别:原理、方法与技术
  16. 速卖通API + 奇门 + 聚石塔 完整流程
  17. 饥荒控制台输入没用_饥荒控制台怎么开启 饥荒控制台怎么用
  18. 荣耀x10更新鸿蒙,华为手机不要乱买,这4款是最值得选择的,全都可升级到鸿蒙系统...
  19. 更换固态硬盘(不重装系统)(3)
  20. S3C6410 硬件加速功能

热门文章

  1. typeScript 技术胖 笔记 上
  2. 信息架构需要绿色整合
  3. 初探Swoft -- Swoft docker环境搭建
  4. “我没有说谎,我何必说谎”,AI可以判断歌曲表达的情绪
  5. django 后台开发常见问题
  6. 会议记录-格式与范文
  7. 淘宝app无法抓包问题
  8. Unite 2018 |未来影像,影向未来
  9. 安卓开发规范-必读版
  10. GreenPlum 安装