opencv-python实现虹膜瞳孔内外圆检测
一、霍夫变换
本文主要介绍霍夫变换检测直线和圆的原理。
霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法。主要用来从图像中分离出具有某种相同特征的集合图像(如,直线,圆等)。最基本的霍夫变换是从黑白图像中检测直线(线段)。
1、直线检测
1.1 直线的表示方式
对于平面中的一条直线,在笛卡尔坐标系中,常见的有两点式,点斜式表示方式。然而在Hough变换中,考虑的是另外一种表示方式:使用(r,θr,\thetar,θ)来表示一条直线。其中,r为该直线到原点的距离,来表示一条直线。其中,r为该直线到原点的距离,来表示一条直线。其中,r为该直线到原点的距离,\theta$为该直线的垂线与x轴的夹角。如图下所示:
$
也就是霍夫变换中表示一条直线的参数变成了(r,θ\thetaθ)。
2.如何判断多个点是否在同一直线上
当我们的对象变成点时,我们知道一个点可以发射出无数条直线,根据霍夫变换的直线表达形式,假设这个点为i,则通过这个点的直线我们用(ri,θir_i,\theta_iri,θi)表示。再假设一个点为j,则通过点j的一系列直线我们用(rj,θjr_j,\theta_jrj,θj)表示。我们知道两点决定一条直线,所以这两个点的直线必定有ri=rj,θi=θjr_i=r_j,\theta_i= \theta_jri=rj,θi=θj的时候。
那如果是三个点呢,假设第三个点是k,则通过k点的一系列直线为(rk,θkr_k,\theta_krk,θk),如果三点在一条直线上,那必定有某个ri=rj=rk=r,θi=θj=θk=θr_i=r_j=r_k = r,\theta_i = \theta_j= \theta_k = \thetari=rj=rk=r,θi=θj=θk=θ。
在霍夫变换检测直线时我们需要找到这样一样直线,如何找到这条直线呢?
3.如何检测出直线
使用hough变换来检测直线的思想就是:为每一个点假设n个方向的直线,通常n=180,此时检测的直线的角度精度为1°,分别计算这n条直线的(r,θ)(r,\theta)(r,θ)坐标,得到n个坐标点。如果要判断的点共有N个,最终得到的(r,θ)(r,\theta)(r,θ)坐标有N * n个。有关这N * n个(r,theta)坐标,其中θ\thetaθ是离散的角度,共有180个取值。
最重要的地方来了,如果多个点在一条直线上,那么必有这多个点在theta=某个值theta_i时,这多个点的r近似相等于rir_iri。也就是说这多个点都在直线(ri,θi)(r_i,\theta_i)(ri,θi)上。
下面拿个例子说明:
如果空间中有3个点,如何判断这三个点在不在一个直线上,如果在,这条直线的位置为:
这个例子中,对于每个点均求过该点的6条直线的(r,θ\thetaθ)坐标,共求了3 * 6个(r,θ\thetaθ)坐标。可以发现在θ\thetaθ=60时,三个点的r都近似为80.7,由此可判定这三个点都在直线(80.7,60)上。
通过 r0θr0\thetar0θ 坐标系可以更直观表示这种关系,如下图:图中三个点的(r,θ)(r,\theta)(r,θ)曲线汇集在一起,该交点就是同时经过这三个点的直线。
通过 r * θ\thetaθ 坐标系可以更直观表示这种关系,如下图:图中三个点的(r,θ\thetaθ)曲线汇集在一起,该交点就是同时经过这三个点的直线:
2.Hough圆检测
继使用hough变换检测出直线之后,顺着坐标变换的思路,提出了一种检测圆的方法。
2.1如何表示一个圆?
与使用(r,θ\thetaθ)来表示一条直线相似,使用(a,b,r)来确定一个圆心为(a,b)半径为r的圆。
某个圆过点(x1,y1)(x_1,y_1)(x1,y1),则有:$(x_1-a_1)^2 + (y_1-b_1)^2 = r_1^2 。那么过点。 那么过点。那么过点(x_1,y_1)的所有圆可以表示为的所有圆可以表示为的所有圆可以表示为(a_1(i),b_1(i),r_1(i)),其中,其中,其中r_1∈(0,无穷),每一个i值都对应一个不同的圆,∈(0,无穷),每一个 i 值都对应一个不同的圆,∈(0,无穷),每一个i值都对应一个不同的圆,(a_1(i),b_1(i),r_1(i))表示了无穷多个过点表示了无穷多个过点表示了无穷多个过点(x_1,y_1)$的圆。
2.2 如何确定多个点在同一个圆上?
如上说明,过点(x1,y1)的所有圆可以表示为(a1(i),b1(i),r1(i))(a_1(i),b_1(i),r_1(i))(a1(i),b1(i),r1(i)),过点(x2,y2)(x_2,y_2)(x2,y2)的所有圆可以表示为(a2(i),b2(i),r2(i))(a_2(i),b_2(i),r_2(i))(a2(i),b2(i),r2(i)),过点(x3,y3)(x_3,y_3)(x3,y3)的所有圆可以表示为(a3(i),b3(i),r3(i))(a_3(i),b_3(i),r_3(i))(a3(i),b3(i),r3(i)),如果这三个点在同一个圆上,那么存在一个值(a0,b0,r0)(a_0,b_0,r_0)(a0,b0,r0),使得$ a_0 = a_1(k)=a_2(k)=a_3(k) 且b_0 = b_1(k) = b_2(k) = b_3(k) 且r_0=r_1(k)=r_2(k)=r_3(k),即这三个点同时在圆,即这三个点同时在圆,即这三个点同时在圆(a_0,b_0,r_0)上。$
从下图可以形象的看出:
首先,分析过点(x1,y1)(x_1,y_1)(x1,y1)的所有圆(a1(i),b1(i),r1(i))(a_1(i),b_1(i),r_1(i))(a1(i),b1(i),r1(i)),当确定r1(4i)r_1(4i)r1(4i)时 ,(a1(i),b1(i))(a_1(i),b_1(i))(a1(i),b1(i))的轨迹是一个以(x1,y1,r1(i))(x_1,y_1,r_1(i))(x1,y1,r1(i))为中心半径为r1(i)r_1(i)r1(i)的圆。那么,所有圆(a1(i),b1(i),r1(i))(a_1(i),b_1(i),r_1(i))(a1(i),b1(i),r1(i))的组成了一个以(x1,y1,0)为顶点,锥角为90度的圆锥面。
三个圆锥面的交点A 既是同时过这三个点的圆。
opencv-python实现虹膜瞳孔边缘检测
cv2.HoughCircles函数说明:
用函数 cv2.HoughCircles(image, method, dp, minDist, circles, param1, param2, minRadius, maxRadius) , 其参数解释如下:
(1)image: 输入图像,需要灰度图
(2)method: 检测方法,常用CV_HOUGH_GRADIENT
(3)dp: 为检测内侧圆心的累加器图像的分辨率于输入图像之比的倒数,如dp=1,累加器和输入图像具有相同的分辨率,如果dp=2,累计器便有输入图像一半那么大的宽度和高度
(4)minDist: 表示两个圆之间圆心的最小距离
(5)circles: 找到的圆的输出向量,一般不设置
(6)param1: 默认值100,它是method设置的检测方法的对应的参数,对当前唯一的方法霍夫梯度法cv2.HOUGH_GRADIENT,它表示传递给canny边缘检测算子的高阈值,而低阈值为高阈值的一半
(7)param2:默认值100,它是method设置的检测方法的对应的参数,对当前唯一的方法霍夫梯度法cv2.HOUGH_GRADIENT,它表示在检测阶段圆心的累加器阈值,它越小,就越可以检测到更多根本不存在的圆,而它越大的话,能通过检测的圆就更加接近完美的圆
(8)minRadius:默认值0,圆半径的最小值
(9)maxRadius:默认值0,圆半径的最大值
代码:
import cv2
import numpy as np
import matplotlib.pyplot as pltimg = cv2.imread("E:\matlab_file\hongmoshibie\pic2.png")
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #灰度图像plt.subplot(121),plt.imshow(gray,'gray')
plt.xticks([]),plt.yticks([])
#使用HoughCircles对灰度图像进行霍夫变换
circles1 = cv2.HoughCircles(gray,cv2.HOUGH_GRADIENT,1,
100,param1=100,param2=30,minRadius=50,maxRadius=100)
circles = circles1[0,:,:] #提取为二维
circles = np.uint16(np.around(circles)) #四舍五入,取整
for i in circles[:]:cv2.circle(img,(i[0],i[1]),i[2],(255,0,0),5) #画圆cv2.circle(img,(i[0],i[1]),2,(255,0,255),10) #画圆心plt.subplot(122),plt.imshow(img)
plt.xticks([]),plt.yticks([]);
瞳孔外圆检测:
调整minRadius、maxRadius参数(将其分别设置为:minRadius=200,maxRadius=290,代码基本不变),即可检测出瞳孔的外圆。
Tips:
1.在霍夫圆检测之前进行高斯滤波,减少噪声
2.以前利用霍夫圆检测经常出现检测不到圆,或错误检测的情况,实则是因为参数没有设置到位。应该小心调节的参数有:
minDist:根据实际情况调节,越小检测的圆越多,错误率越大
param2:这个参数以前没有注意过,针对于虹膜检测,目标圆是较小的,所以这个值理应设置的小一点。
minRadius,maxRadius:圆半径范围
opencv-python实现虹膜瞳孔内外圆检测相关推荐
- Python+OpenCV图像处理(十五)—— 圆检测
简介: 1.霍夫圆变换的基本原理和霍夫线变换原理类似,只是点对应的二维极径.极角空间被三维的圆心和半径空间取代.在标准霍夫圆变换中,原图像的边缘图像的任意点对应的经过这个点的所有可能圆在三维空间用圆心 ...
- python cv2.HoughCircles 霍夫圆检测
HoughCircles使用与说明 1. HoughCircles说明 2. 代码 3.结果 cv2提供了一种圆检测的方法:HoughCircles.该函数的返回结果与参数设置有很大的关系. 检测的图 ...
- 使用Python测试霍夫圆检测
目录 1. 目的 2. 霍夫园检测的原理 3. 使用opencv测试 1. 目的 记录使用python学写霍夫圆检测的过程 2. 霍夫园检测的原理 略!别怪我,这个涉及到数学原理.有时间我再进行补充, ...
- 理解霍夫变换及圆检测
近日在做小球动力特性识别过程中,用到了opencv中的霍夫变换圆检测来识别图像中的小球,从而确定小球的位置.但是在调节参数的过程中不能明确各参数的真正含义,无法达到最优的识别效果. 所以想深入理解霍夫 ...
- 使用Python,OpenCV和Hough圆检测图像中的圆
使用Python,OpenCV和Hough圆检测图像中的圆 1. 效果图 2. cv2.HoughCircles(image, method, dp, minDist) 3. 源码 参考 前几篇博客中 ...
- Python+OpenCV:Hough圆检测(Hough Circle Transform)
Python+OpenCV:Hough圆检测(Hough Circle Transform) ##################################################### ...
- 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 ...
- OpenCV+python:圆检测
1,圆检测基本原理 对霍夫变换有了这样一种理解-----实际上就是坐标变换,是一种数学上的变换,然后再转换到参数坐标系进行讨论,最终确定待检测圆(或者其他形状)的数学方程.在极坐标系下,圆的数学表达式 ...
最新文章
- java 文件下载 【学习记录】
- TCP释放连接的四次挥手过程
- [RQNOJ313]波浪数
- 计算机视觉,图像处理,图像分析,机器人视觉和机器视觉是彼此紧密关联的学科
- linux 交叉编译 nginx,交叉编译nginx,luajit
- android系统内置HttpClient库(WebView+ Http(s)URLConnection(ok-http)+ HttpClient(apache-http))
- 使用MFC里的类的方法
- Chuck Cobb谈敏捷组织中PMO的角色
- “四不像”病毒冒充多款知名软件 窃取电脑隐私
- Java发送Post请求,参数JSON,接收JSON
- 用SQL中的isnull函数注意了
- python之地基(一)
- 在计算机系统软件中核心软件,在计算机系统软件中的核心软件是()
- 3D视觉关键技术与核心问题包括哪些?
- 51 nod 最长公共子序列问题(打印路径)
- CCF CSP历年题解(python)
- chm格式怎么打开?
- 软件测试面试题:请详细介绍一下各种测试类型的含义?
- PAT/C++甲级题解——图
- java fxml教程_openjfx(javaFX)完整学习指南(教程)