Harris角点检测的快速瞳孔定位方法
- 格式:pdf
- 大小:331.20 KB
- 文档页数:4
计算视觉——Harris⾓点检测⽬录⼀、Harris ⾓点检测1.1 Harris ⾓点检测原理1.2⾓点检测算法⼆、基于Harris⾓点检测对不同类型图像做出的对⽐实验2.1 平坦图像的Harris⾓点检测实验结果2.2 边缘丰富图像的Harris⾓点检测实验结果2.3⾓点丰富图像的Harris⾓点检测实验结果三、结论与总结⼀.、Harris ⾓点检测1.1 Harris ⾓点检测原理Harris⾓点检测算法是最简单的⾓点检测⽅法之⼀。
它的基本思想是使⽤⼀个固定窗⼝在图像上进⾏任意⽅向上的滑动,⽐较滑动前与滑动后两种情况,窗⼝中的像素灰度变化程度,如果存在任意⽅向上的滑动,都有着较⼤灰度变化,那么我们可以认为该窗⼝中存在⾓点。
⽤数学⽅法来刻画⾓点特征:公式解释:>[u,v]是窗⼝的偏移量>(x,y)是窗⼝内所对应的像素坐标位置,窗⼝有多⼤,就有多少个位置>w(x,y)是窗⼝函数,最简单情形就是窗⼝内的所有像素所对应的w权重系数均为1。
但有时候,我们会将w(x,y)函数设定为以窗⼝中⼼为原点的⼆元正态分布。
如果窗⼝中⼼点是⾓点时,移动前与移动后,该点的灰度变化应该最为剧烈,所以该点权重系数可以设定⼤些,表⽰窗⼝移动时,该点在灰度变化贡献较⼤;⽽离窗⼝中⼼(⾓点)较远的点,这些点的灰度变化⼏近平缓,这些点的权重系数,可以设定⼩点,以⽰该点对灰度变化贡献较⼩,那么我们⾃然想到使⽤⼆元⾼斯函数来表⽰窗⼝函数,这⾥仅是个⼈理解,⼤家可以参考下。
所以通常窗⼝函数有如下两种形式:根据上述表达式,当窗⼝处在平坦区域上滑动,可以想象的到,灰度不会发⽣变化,那么E(u,v) = 0;如果窗⼝处在⽐纹理⽐较丰富的区域上滑动,那么灰度变化会很⼤。
算法最终思想就是计算灰度发⽣较⼤变化时所对应的位置,当然这个较⼤是指针任意⽅向上的滑动,并⾮单指某个⽅向。
1.2⾓点检测算法⾓点检测算法可归纳为3类:基于灰度图像的⾓点检测、基于⼆值图像的⾓点检测、基于轮廓曲线的⾓点检测。
Harris,Shi-Tomasi⾓点检测与亚像素⾓点检测笔记⾓点检测1. ⾓点可以是两个边缘的⾓点;2. ⾓点是邻域内具有两个主⽅向的特征点;⽬录基本思想在各个⽅向上移动窗⼝,若灰度均发⽣了较⼤的变化,那么就认为在窗⼝内遇到了⾓点。
(图3)如果窗⼝在图像各个⽅向上移动时,窗⼝内图像的灰度没有发⽣变化,那么窗⼝内就不存在⾓点。
(图1)如果窗⼝在某⼀个⽅向移动时,窗⼝内图像的灰度发⽣了较⼤的变化,⽽在另⼀些⽅向上没有发⽣变化,那么,窗⼝内的图像可能就是⼀条直线的线段。
(图2)Harris数学模型上⾯的⾃相关函数\(c(x,y;\Delta x,\Delta y)\)表⽰窗⼝W平移\((\Delta x,\Delta y)\)后产⽣的灰度变化。
若对于任何\((\Delta x,\Delta y)\),⾃相关函数c的值均较⼤,则说明该窗⼝内存在⾓点。
上⾯的M矩阵为x,y⽅向的梯度变化。
注意:此时还不能说M为梯度变化协⽅差矩阵,A,B,C不是⽅差和协⽅差。
因此需要进⾏均值化处理:将各维随机变量(这⾥为\ (I_x,I_y\)两维)减去其均值,使处理后的随机变量的均值为0。
接下来就可以进⾏主成分分析。
假设下⾯的\((I_x,I_y)\)已经进⾏过均值化处理,则此时M即为梯度分布协⽅差矩阵。
针对平坦区域,边缘区域以及⾓点区域三种情形的梯度分布\((I_x,I_y)\)进⾏分析:显然:平坦区域的\((I_x,I_y)\)分布在原点附近,相应的其⾃相关函数c在\((\Delta x,\Delta y)\)相同时较⼩。
边缘区域的\((I_x,I_y)\)在某⼀个⽅向上较为分散,按照PCA来理解应该只有⼀个主⽅向。
⾓点区域的\((I_x,I_y)\)在x,y两个⽅向上分布均较为分散。
对协⽅差矩阵M进⾏对⾓化,则特征值即为主⽅向上的⽅差,对应的特征向量即为主⽅向(详见PCA原理)。
得出结论:特征值都⽐较⼤时,即窗⼝中含有⾓点特征值⼀个较⼤,⼀个较⼩,窗⼝中含有边缘特征值都⽐较⼩,窗⼝处在平坦区域在实际判断⾓点时,⽆需计算矩阵M的特征值,使⽤下式近似计算⾓点响应值:\[R=detM - \alpha (traceM)^2 \\ detM = \lambda_1\lambda_2 = AB-C^2 \\ traceM = \lambda_1 + \lambda_2 = A+B \] \(\alpha\)为⼀常数,通常取0.04~0.06.使⽤matlab绘制响应值函数图像如下:则可以发现,该函数图像刚好满⾜协⽅差矩阵M特征值与⾓点的关系:MATLAB代码如下:x = linspace(0,10);y = linspace(0,10);[X,Y] = meshgrid(x,y);Z = X.*Y - 0.05*(X+Y).^2;contour(X,Y,Z,'ShowText','on');xlabel("\lambda_1");ylabel("\lambda_2");算法实现性质1. 参数α对⾓点检测的影响:增⼤α的值,将减⼩⾓点响应值R,减少被检测⾓点的数量;减⼩α的值,将增⼤⾓点响应值R,增加被检测⾓点的数量。
harris角点检测原理步骤说明一、Harris角点检测基本理论1.1 简略表达:角点:最直观的印象就是在水平、竖直两个方向上变化均较大的点,即Ix、Iy 都较大边缘:仅在水平、或者仅在竖直方向有较大的变化量,即Ix和Iy只有其一较大平坦地区:在水平、竖直方向的变化量均较小,即Ix、Iy都较小角点响应R=det(M)-k*(trace(M)^2) (附录资料给出k=0.04~0.06,opencv指出是0.05-0.5,浮动较大)det(M)=λ1*λ2 trace(M)=λ1+λ2R取决于M的特征值,对于角点|R|很大,平坦的区域|R|很小,边缘的R为负值。
1.2 详细描述:见附录里的ppt1.3 算法步骤其中,局部极大值可用先膨胀后与原图比较的方法求得,具体见二中源码。
二、opencv代码实现harris类[cpp] view plaincopyprint?1. #ifndef HARRIS_H2. #define HARRIS_H3. #include "opencv2/opencv.hpp"4.5. class harris6. {7. private:8. cv::Mat cornerStrength; //opencv harris函数检测结果,也就是每个像素的角点响应函数值9. cv::Mat cornerTh; //cornerStrength阈值化的结果10. cv::Mat localMax; //局部最大值结果11. int neighbourhood; //邻域窗口大小12. int aperture;//sobel边缘检测窗口大小(sobel获取各像素点x,y方向的灰度导数)13. double k;14. double maxStrength;//角点响应函数最大值15. double threshold;//阈值除去响应小的值16. int nonMaxSize;//这里采用默认的3,就是最大值抑制的邻域窗口大小17. cv::Mat kernel;//最大值抑制的核,这里也就是膨胀用到的核 18. public:19.harris():neighbourhood(3),aperture(3),k(0.01),maxStrength(0.0),threshold (0.01),nonMaxSize(3){20.21. };22.23. void setLocalMaxWindowsize(int nonMaxSize){ 24. this->nonMaxSize= nonMaxSize; 25. };26.27. //计算角点响应函数以及非最大值抑制28. void detect(const cv::Mat &image){ 29. //opencv自带的角点响应函数计算函数30. cv::cornerHarris (image,cornerStrength,neighbourhood,aperture,k);31. double minStrength;32. //计算最大最小响应值33. cv::minMaxLoc (cornerStrength,&minStrength,&maxStrength);34.35. cv::Mat dilated;36. //默认3*3核膨胀,膨胀之后,除了局部最大值点和原来相同,其它非局部最大值点被37. //3*3邻域内的最大值点取代38. cv::dilate (cornerStrength,dilated,cv::Mat()); 39. //与原图相比,只剩下和原图值相同的点,这些点都是局部最大值点,保存到localMax40. cv::compare(cornerStrength,dilated,localMax,cv::CMP_EQ);41. }42.43. //获取角点图44. cv::Mat getCornerMap(double qualityLevel) {45. cv::Mat cornerMap;46. // 根据角点响应最大值计算阈值47. threshold= qualityLevel*maxStrength; 48.cv::threshold(cornerStrength,cornerTh, 49.threshold,255,cv::THRESH_BINARY); 50. // 转为8-bit图51. cornerTh.convertTo(cornerMap,CV_8U); 52. // 和局部最大值图与,剩下角点局部最大值图,即:完成非最大值抑制53. cv::bitwise_and(cornerMap,localMax,cornerMap); 54. return cornerMap;55. }56.57. void getCorners(std::vector<cv::Point> &points, 58. double qualityLevel) {59. //获取角点图60. cv::Mat cornerMap= getCornerMap(qualityLevel); 61. // 获取角点62. getCorners(points, cornerMap); 63. }64.65. // 遍历全图,获得角点66. void getCorners(std::vector<cv::Point> &points, 67. const cv::Mat& cornerMap) {68.69. for( int y = 0; y < cornerMap.rows; y++ ) {70. const uchar* rowPtr = cornerMap.ptr<uchar>(y);71. for( int x = 0; x < cornerMap.cols; x++ ) { 72. // 非零点就是角点73. if (rowPtr[x]) { 74. points.push_back(cv::Point(x,y));75. }76. }77. }78. }79.80. //用圈圈标记角点81. void drawOnImage(cv::Mat &image,82. const std::vector<cv::Point> &points, 83. cv::Scalar color= cv::Scalar(255,255,255), 84. int radius=3, int thickness=2) {85. std::vector<cv::Point>::const_iterator it=points.begin();86. while (it!=points.end()) { 87. // 角点处画圈88. cv::circle(image,*it,radius,color,thickness);89. ++it;90. }91. }92.93. };94.95. #endif // HARRIS_H相关测试代码:[cpp] view plaincopyprint?1. cv::Mat image, image1 = cv::imread ("test.jpg");2. //灰度变换3. cv::cvtColor (image1,image,CV_BGR2GRAY);4.5.6. // 经典的harris角点方法7. harris Harris;8. // 计算角点9. Harris.detect(image);10. //获得角点11. std::vector<cv::Point> pts; 12. Harris.getCorners(pts,0.01); 13. // 标记角点14. Harris.drawOnImage(image,pts); 15.16. cv::namedWindow ("harris"); 17. cv::imshow ("harris",image); 18. cv::waitKey (0);19. return 0;相关测试结果:三、改进的Harris角点检测从经典的Harris角点检测方法不难看出,该算法的稳定性和k有关,而k是个经验值,不好把握,浮动也有可能较大。
一、介绍在机器视觉处理算法中,特征点匹配是一个重要的环节,它是指在两幅图像中找到相对应的特征点的过程。
特征点匹配的准确度会直接影响到后续的物体识别、目标跟踪、三维重建等任务的效果。
特征点匹配的算法选择和设计是至关重要的。
本文将针对机器视觉处理算法中特征点匹配常用方法进行全面评估,并提供个人观点和理解。
二、常用的特征点匹配方法1. Harris角点检测Harris角点检测是一种常用的特征点提取方法,通过计算图像的灰度变化来检测角点。
通过非极大值抑制和角点响应函数来筛选出最具代表性的角点。
2. SIFT特征匹配SIFT是一种基于局部特征的描述符,它通过在不同尺度空间和不同方向上寻找局部极值来检测图像的关键点,然后使用特征描述符进行匹配。
3. SURF特征匹配SURF是对SIFT算法的改进,它使用了快速Hessian矩阵检测关键点,并使用加速的Haar小波特征描述符进行匹配。
4. ORB特征匹配ORB是一种同时具备SIFT和SURF的优点的算法,它结合了FAST角点检测和BRIEF描述符,具有更快的速度和更好的性能。
5. 其他方法除了上述常用的特征点匹配方法,还有基于深度学习的方法、基于颜色直方图的方法、基于形状上下文的方法等,这些方法根据具体任务和应用场景选择的灵活性更强。
三、个人观点和理解在特征点匹配的方法中,不同的算法适用于不同的场景和要求。
对于实时性要求较高的场景,可以选择ORB特征匹配算法;对于精度要求较高的场景,可以选择SIFT或SURF特征匹配算法。
结合深度学习的方法可以在特定数据集上取得更好的效果。
在实际应用中,需要根据具体情况进行选择和组合使用。
四、总结回顾特征点匹配在机器视觉处理算法中起着至关重要的作用,不同的方法都有各自的优势和局限性。
通过本文的介绍,可以看出特征点匹配算法的发展已经非常成熟,并且在不断地向着更加快速、精确以及适用于更多场景的方向发展。
对于我个人而言,特征点匹配算法的研究不仅是对图像处理技术的挑战,更是对计算机视觉领域的探索。
特征匹配-Harris⾓点检测⼀、harris算法简介1.⾓点概述⾓点是图像很重要的特征,对图像图形的理解和分析有很重要的作⽤。
⾓点在保留图像图形重要特征的同时,可以有效地减少信息的数据量,使其信息的含量很⾼,有效地提⾼了计算的速度,有利于图像的可靠匹配,使得实时处理成为可能。
从图像分析的⾓度来定义⾓点可以有以下两种定义:⾓点可以是两个边缘的⾓点;⾓点是邻域内具有两个主⽅向的特征点;前者往往需要对图像边缘进⾏编码,这在很⼤程度上依赖于图像的分割与边缘提取,具有相当⼤的难度和计算量,且⼀旦待检测⽬标局部发⽣变化,很可能导致操作的失败。
基于图像灰度的⽅法通过计算点的曲率及梯度来检测⾓点,避免了第⼀类⽅法存在的缺陷,此类⽅法主要有Moravec算⼦、Forstner算⼦、Harris算⼦、SUSAN算⼦等。
本⽂主要介绍的Harris⾓点检测的算法原理。
2.Harris⾓点检测基本原理⼈眼对⾓点的识别通常是在⼀个局部的⼩区域或⼩窗⼝完成的。
如果在各个⽅向上移动这个特征的⼩窗⼝,窗⼝内区域的灰度发⽣了较⼤的变化,那么就认为在窗⼝内遇到了⾓点。
如果这个特定的窗⼝在图像各个⽅向上移动时,窗⼝内图像的灰度没有发⽣变化,那么窗⼝内就不存在⾓点;如果窗⼝在某⼀个⽅向移动时,窗⼝内图像的灰度发⽣了较⼤的变化,⽽在另⼀些⽅向上没有发⽣变化,那么,窗⼝内的图像可能就是⼀条直线的线段。
如下图:3、特征匹配流程3.1、根据准则,提取图像中的特征点3.2、提取特征点周围的图像块,构造特征描述符3.3、通过特征描述符对⽐,实现特征匹配⼆、Harris⾓点检测声明:为了更好地对 Harris⾓点检测算法进⾏分析,本次实验⼀共收集了纹理平坦、垂直边缘多、垂直边缘多的三个不同的场景,每个场景各收集了五幅的图⽚。
然后通过每个场景中正⾯、侧⾯、旋转、远近、光照五个不同的⽅⾯进⾏对⽐试验。
2.1、纹理平坦的场景(以书本为例)2.1.1、正⾯图及检测结果2.1.2、侧⾯图及检测结果2.1.3、旋转图及检测结果2.1.4 、远距离图及检测结果2.1.5 、光照图及检测结果实验结果分析与总结:Harris⾓点检测算⼦具有旋转不变性。
基于灰度信息和Harris角点检测的眼睛特征提取作者:田建华来源:《新课程·教育学术》2011年第04期摘要:笔者在此提出了一种基于灰度信息和Harris角点检测的眼睛特征提取算法,首先利用眼睛区域的灰度信息,提取出瞳孔的位置和大小,然后利用Harris角点检测算法找到眼角点,最后利用曲线拟合算法拟合出眼睛的轮廓。
结果表明Harris角点检测能够有效地提取眼睛特征。
关键词:灰度信息;Harris角点检测;特征提取Abstract: Eye feature extraction algorithm based on gray information and Harris corner detection is presented. This method locates the eye areas roughly in the facial sub-image firstly,then locates the pupil areas accurately in the eye areas fixed on the previous step by gray statistical information,and finds out the eye corners through Harris corner detection. Finally,the outline of eye is fitted by using B-spline curves through the detected key points. Experiment shows that eye feature can be extracted effectively based on Harris corner detection.Key words: gray information;Harris corner detection;feature extraction中图法分类号:TP391 文献标志码:A脸部特征的准确提取在图像编码、人脸识别、表情识别、人脸三维建模与识别等领域中具有重要作用。
Harris⾓点检测⽬录OpenCV可以检测图像的主要特征,然后提取这些特征、使其成为图像描述符,这类似于⼈的眼睛和⼤脑。
这些图像特征可作为图像搜索的数据库。
此外,⼈们可以利⽤这些关键点将图像拼接起来,组成⼀个更⼤的图像,⽐如将许多图像放在⼀块,然后形成⼀个360度全景图像。
这⾥我们将学习使⽤OpenCV来检测图像特征,并利⽤这些特征进⾏图像匹配和搜索。
我们会选取⼀些图像,并通过单应性,检测这些图像是否在另⼀张图像中。
⼀特征检测算法有许多⽤于特征检测和提取的算法,我们将会对其中⼤部分进⾏介绍。
OpenCV最常使⽤的特征检测和提取算法有:Harris:该算法⽤于检测⾓点;SIFT:该算法⽤于检测斑点;SURF:该算法⽤于检测⾓点;FAST:该算法⽤于检测⾓点;BRIEF:该算法⽤于检测斑点;ORB:该算法代表带⽅向的FAST算法与具有旋转不变性的BRIEF算法;通过以下⽅法进⾏特征匹配:暴⼒(Brute-Force)匹配法;基于FLANN匹配法;可以采⽤单应性进⾏空间验证。
⼆特征定义那么,究竟什么是特征呢?为什么⼀副图像的某个特定区域可以作为⼀个特征,⽽其他区域不能呢?粗略的讲,特征就是有意义的图像区域,该区域具有独特特征和易于识别性。
因此⾓点及⾼密度区域都是很好的特征,⽽⼤量重复的模式或低密度区域(例如图像中的蓝⾊天空)则不是很好的特征。
边缘可以将图像分为两个区域,因此也可以看做好的特征。
斑点是与周围有很⼤差别的像素区域,也是有意义的特征。
⼤多数特征检测算法都会涉及图像的⾓点、边和斑点的识别,也有⼀些涉及脊向的概念,可以认为脊向是细长物体的对称轴,例如识别图像中的⼀条路。
⾓点和边都好理解,那什么是斑点呢?斑点通常是指与周围有着颜⾊和灰度差别的区域。
在实际地图中,往往存在着⼤量这样的斑点,如⼀颗树是⼀个斑点,⼀块草地是⼀个斑点,⼀栋房⼦也可以是⼀个斑点。
由于斑点代表的是⼀个区域,相⽐单纯的⾓点,它的稳定性要好,抗噪声能⼒要强,所以它在图像配准上扮演了很重要的⾓⾊。
Harris 角点检测算法编程步骤及示例演示也不说那么多废话了,要介绍啥背景意义之类的,角点检测,顾名思义,就是检测角点,最简单的就是两条线的交点了,还有比如下国际象棋的棋盘格子的交点之类的,反正就是检测这些点。
简单将Harris 角点检测算法的思想说下,就是拿一个小窗在图像中移动,通过考察这个小窗口内图像灰度的平均变换值来确定角点。
1)如果窗口内区域图像的灰度值恒定,那么所有不同方向的偏移几乎不发生变化;2)如果窗口跨越一条边,那么沿着这条边的偏移几乎不发生变化,但是与边垂直的偏移会发生很大的变化;3)如果窗口包含一个孤立的点或者角点,那么所有不同方向的偏移会发生很大的变化。
面给出具体数学推导:设图像窗口平移量为( u,v) ,产生的灰度变化为E(u,v),有E(u,v)二sum[w(x,y)[l(x+u,y+v)-l(x,y)F2棋中w(x,y)为窗口函数, l(x+u,y+v为平移后的灰度值,l(x,y)为平移前的灰度值。
有泰勒公式展开可得:l(x+u,y+v)=l(x,y)+lx*u+ly*v+0(uA2,v八2);lx,ly分别为偏微分,在图像中为图像的方向导数因此E(u,v)=sum[w(x,y) [lx*u+ly*v+O(u八2,v八2)]八2],可以近似得到E(u,v)=sum[w(x,y) [lx*u+ly*v]^2],即E(u,v)二[u,v][lx八2,lx*ly;lx*ly,ly八2][u,v]T令M=[lx八2,lx*ly;lx*ly,ly八2],因此最后对角点的检测成了对矩阵M的特征值的分析了,令M 其特征值为x1,x2;当x1>>x2或者x2>>x1,则检测到的是边缘部分;当x1,x2都很小,图像窗口在所有移动的方向上移动灰度级都无明显变化.当X1,X2都很大时且相当,检测到的是角点。
编程时用x1,x2不方便,因此定义角点响应函数;R二det(M)-k(trace(M))八2;其中det(M)为矩阵M的行列式,trace(M)为矩阵M的迹。