Opencv 霍夫变换 霍夫圆检测
霍夫变换是一种特征提取术,在了解霍夫变换 霍夫检测之前 需要首先明白什么是霍夫空间:以圆形举例子,弄明白形状的原理,直线的变换与检测也就不难理解 霍夫空间,是一种三维空间,三个坐标分别为圆的横纵坐标,Z轴坐标为半径,所以霍夫圆变换的实质过程就是从二维空间的圆拓展到三维空间
霍夫圆检测:应用:识别红绿灯中信号灯(圆形)物体
在检测圆之前,需要做好边缘检测,这个步骤在Opencv的函数已经内置了,使用Canny算子进行边缘检测,参数需要自行调整
霍夫梯度法:
**检测原理简要概括:模向量 ,垂直于圆心,相交于一点,确定圆心
首先找到圆心 然后寻找半径
估计圆心步骤:
1.把原图做一次 Canny 边缘检测,得到边缘检测的二值图。
2.对原始图像执行一次 Sobel 算子,计算出所有像素的邻域梯度值。
3.初始化圆心空间 N(a,b),令所有的 N(a,b)=0。
4.遍历 Canny 边缘二值图中的所有非零像素点,沿着梯度方向 ( 切线的垂直方向 )画线,将线段经过的所有累加器中的点 (a,b) 的 N(a,b)+=1。 使用的累加器类似于C语言中的counter
5.每个点的counter大小和阈值做比较,如果大于该值,找到圆心,确定一个圆
确定圆心后,寻找半径:
估计半径(针对某一个圆心 (a,b))
1.计算 Canny 图中所有非 0 点距离圆心的距离。
2.距离从小到大排序,根据阈值,选取合适的可能半径(比如 3 和 3.5 都被划为半径值 3 中)。
3.初始化半径空间 r, N®=0。
4.遍历 Canny 图中的非 0 点,N( 距离 )+=1。
5.统计得到可能的半径值(N® 越大,说明这个距离值出现次数越多,越有可能是半径值)。
函数各个参数的意义:HoughCircle:
1:images 输入的图像
2:circles 输出的图像,圆的输出矢量
3.method,使用方法,默认为1,代表霍夫梯度下降
4.dp 分辨率,默认为1,两图分辨率相同
5.minDist 若两圆心距离小于该值 则认为两个圆属于同一个圆
6.para1,Canny算子的阈值
7.para2, 某点是否为圆心的判断阈值,直线相交阈值,大于该值,才能被认为筛选出来的一个圆
8.minradius 半径最小值 默认为0
9.maxradius 半径最大值 默认为0
代码实战:
原图:
调整代码之前:
调整参数以后:
准确率做到了一一对应,圆心的准确率一些图形吻合的比较好,一些还需要调参
开源代码:
// A code block
import cv2
import numpy as np
img = cv2.imread(r"C:\Users\WM202\Pictures\circle.jpg")
GrayImage=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
GrayImage= cv2.medianBlur(GrayImage,5)
ret,th1 = cv2.threshold(GrayImage,127,255,cv2.THRESH_BINARY)
th2 = cv2.adaptiveThreshold(GrayImage,255,cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY,3,5)
th3 = cv2.adaptiveThreshold(GrayImage,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY,3,5)kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(th2,kernel,iterations=1)
dilation = cv2.dilate(erosion,kernel,iterations=1)imgray=cv2.Canny(erosion,30,100)circles = cv2.HoughCircles(imgray,cv2.HOUGH_GRADIENT,1,40,param1=50,param2=10,minRadius=10,maxRadius=80)circles = np.uint16(np.around(circles))
for i in circles[0,:]:# draw the outer circlecv2.circle(img,(i[0],i[1]),i[2],(0,255,0),2)# draw the center of the circlecv2.circle(img,(i[0],i[1]),2,(0,0,255),3)
print(len(circles[0,:]))cv2.namedWindow("detected circles",cv2.WINDOW_NORMAL )
cv2.imshow('detected circles',img)cv2.waitKey(0)
cv2.destroyAllWindows()
如果你在学习这一部分的时候 或者在调试代码的时候有遇到任何的问题,欢迎留言评论!
Opencv 霍夫变换 霍夫圆检测相关推荐
- OpenCV中霍夫圆检测
OpenCV中霍夫圆检测 在直线检测中,变换后在r−θr-\thetar−θ空间内曲线交点,然后根据阈值来得到直线.在圆中需要有三个变量圆心坐标和半径,因此变换后的空间在三维空间,根据三维空间中的曲线 ...
- opencv c++ 霍夫圆检测
1.原理 a)对某点,以其为圆心的圆为无数(一圈圈的圆),将其从x-y平面坐标系上转换到r-θ极坐标系上后,则变成了以r.θ为自变量,为固定值,x.y为因变量的式子: b)其余点作同样操作,可以得到, ...
- OpenCV 霍夫圆检测
圆的表示式是: 其中aa和bb表示圆心坐标,rr表示圆半径,因此标准的霍夫圆检测就是在这三个参数组成的三维空间累加器上进行圆形检测,此时效率就会很低,所以OpenCV中使用霍夫梯度法进行圆形的检测. ...
- OpenCV_09 模版匹配和霍夫变换:霍夫线检测+霍夫圆检测
1 模板匹配 1.1 原理 所谓的模板匹配,就是在给定的图片中查找和模板最相似的区域,该算法的输入包括模板和图片,整个任务的思路就是按照滑窗的思路不断的移动模板图片,计算其与图像中对应区域的匹配度,最 ...
- OpenCV基于Python霍夫圆检测—基于梯度的霍夫圆检测
基于梯度的霍夫圆检测 1. 回顾与目标 2. 基于梯度的霍夫圆检测 2.1 问题分析 2.2 基于梯度的霍夫圆检测步骤 3. 基于梯度的霍夫圆检测函数HoughCircles 3.1 函数HoughC ...
- OpenCV基于Python霍夫圆检测—标准霍夫圆检测
标准霍夫圆检测 1. 简介 2. 标准霍夫圆检测 2.1 情形一 2.2 情形二 2.3 情形三 3. 程序演示 4. 结尾 参考资料 1. 简介 1972年,R. D. Duda和P. E. Har ...
- 霍夫圆检测(HoughCircles)
霍夫圆检测 1.霍夫圆检测 从平面坐标到极坐标需要转换三个参数,C(x0,y0,r)C(x_0,y_0,r)C(x0,y0,r),其中(x0,y0)(x_0,y_0)(x0,y0)为圆心. 假 ...
- OpenCV标准霍夫直线检测详解
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转载自:OpenCV学堂 霍夫直线检测 对于图像来说可以从笛卡 ...
- 使用Python测试霍夫圆检测
目录 1. 目的 2. 霍夫园检测的原理 3. 使用opencv测试 1. 目的 记录使用python学写霍夫圆检测的过程 2. 霍夫园检测的原理 略!别怪我,这个涉及到数学原理.有时间我再进行补充, ...
最新文章
- php 获取数组最小值,php 获取数组中最小的值与键名的方法
- [NPUCTF2020]Mersenne twister
- 天锐绿盾解密_天锐绿盾携手衡阳规划设计院 实现信息系统安全管理
- 如何获得一个集合的所有子集合?
- C# WPF MVVM开发框架Caliburn.Micro 名称Transformer⑩①
- STL源码剖析 queue队列概述
- 哈工大大数据实验_科研常用 | 实验大数据分析方法
- Effective_STL 学习笔记(四) 用 empty 来代替检查 size() 是否为0
- linux系统ftp优化,Linux vsftp 部署优化
- Android2D绘图二
- vue引入如何使用不同字体
- Vagrant常见问题汇总
- moss 搜索 属性过滤 值被移除了
- 首席翻译的英语学习方法
- leadbbs 上ID为Robin·H的东西,有空瞧瞧....
- python爬取淘宝数据魔方_淘宝数据魔方技术架构解析读后感
- 470Ω排阻阻值测量
- Glusterfs全局统一命名空间
- Ubuntu下mosquitto 的使用
- 公共WIFI短信认证功能的实现原理