关闭

虹膜图像分割(一)内圆检测

标签: 虹膜分割虹膜检测虹膜识别Hough变换
4177人阅读 评论(2) 收藏 举报
分类:

        本文和下文介绍如何对一个虹膜图像进行分割提取出虹膜,在虹膜分割中,最重要的是检测两个圆,一个内圆,一个是外圆。下面是两个圆的示意图。


本文先讲解如何检测内圆,在我的方法中,内圆的检测可分为四步:

1.  用Canny边缘检测和Hough变换从经过高斯平滑处理后的图片中检测圆。在此步操作,我故意把Hough变换的阈值设得比较小,这样我们就可以检测出很多圆了。下图就是用cvHoughCircle检测出的圆。


可以看到,在此步中,我们检测到了圆,但是有很多圆,我们现在要想办法找到我们要的那个内圆。下面的步骤就是我找内圆的方法。

2.   把原图二值化,这个可以通过cvThreshold很容易实现,阈值设在五十左右就可以了。阈值化后的图像如下:


这个二值化后得到的图像是为了后面计算每个圆中包含的瞳孔点比率做准备的。

3.  计算第一步中得到的每个圆的一个比率,计算是根据第二步中二值图像进行。比率的定义如下

PupilInclusion Rate = Number of black points / Area of circle
即:用每一个circle中包含的黑点的个数除以圆的面积
4. 在计算出每一个圆的比率后,找到比率最大的那个,并把那个作为最后的内圆,这样就可以完美得检测出内圆了。

//caculate the ratio based on binary image
float CheckCirle(IplImage* img)
{
	CvPoint center;
	int width = img->width;
	int height = img->height;
	int r = width/2;
	int value; //pixel value
	int count = 0;
	float ratio = 0;
	center.x = cvRound(width/2);
	center.y = cvRound(height/2);
	for(int i=0;i<height;i++)
	{
		for(int j=0;j<width;j++)
		{
			if (sqrt(pow(float(center.x-j),2)+pow(float(center.y-i),2))< r)
			{
				value = cvGetReal2D(img,i,j);
				if(value == 0)
					count++;
			}
		}
	}
	ratio = float(count)/(3.14*r*r);
	return ratio;
}
//detect the inner circle
float* FindInnerCircle(IplImage* src)
{
	float result[3]; //r[0] r[2] are the coordinate, r[3] is radius

	float maxratio = 0;
	float ratio = 0;

	IplImage* dst = NULL;

	int threshold = FindThreshold(src);

	dst = cvCreateImage (cvGetSize(src), IPL_DEPTH_8U, 1);
	dst = cvCloneImage (src);
	
	cvSmooth (dst, dst, CV_GAUSSIAN, 5, 5);
	cvSmooth(dst,dst,CV_MEDIAN,3);


	CvMemStorage* storage = cvCreateMemStorage (0);
	//CvSeq* circles = cvHoughCircles (dst, storage, CV_HOUGH_GRADIENT, 2, dst->width / 30, 50, 80, 10, 70);
	//50 img04; 100 img009
	CvSeq* circles = cvHoughCircles (dst, storage, CV_HOUGH_GRADIENT, 2, dst->width / 30, 50, 70, 20, 90);

	//60 for 009; 60 img12;  100 img16,img19, img20
	cvThreshold(dst,dst,100,255,CV_THRESH_BINARY);
	cvNamedWindow("threshold",1);
	cvShowImage("threshold",dst);

	CvPoint center;
	int r;

	if (circles->total<0)
	{
		printf("No Circle Detected!!Please Check!!\n");
		system("pause");
	}
		
	for (int i = 0; i < circles->total; i++)
		//for (int i = 0; i < 35; i++)
	{
	 
		float* p = (float*)cvGetSeqElem (circles, i);
		CvPoint pt = cvPoint (cvRound(p[0]), cvRound(p[1]));
		center = pt;
		r = cvRound(p[2]);

		cvSetImageROI(dst,cvRect(center.x-r,center.y-r,2*r,2*r));
		IplImage* rect_img=NULL;
		rect_img = cvCreateImage(cvGetSize(dst),8,1);
		cvCopy(dst,rect_img);
		cvResetImageROI(dst);

		ratio = CheckCirle(rect_img);
		if (ratio >= maxratio)
		{
			result[0] = pt.x;
			result[1] = pt.y;
			result[2] = r;
			maxratio = ratio;
		}
		rect_img = NULL;
	}

	cvNamedWindow ("src", 1);
	cvShowImage ("src", src);

	printf("Inner circle have been found!!\n");
	cvReleaseMemStorage (&storage);
	return result;
}

Result:

完整的测试图片及代码下载:

http://download.csdn.net/detail/computerme/8158905

0
0
查看评论

Matlab处理虹膜程序解析

(1.)strcat()函数:合并字符串 >> InputPath='E:\Matlab\虹膜识别matlabProject\0023';strcat(InputPath,'*.bmp') ans =E:\Matlab\虹膜识别matlabProject...
  • cymy001
  • cymy001
  • 2017-09-18 13:34
  • 610

虹膜识别(五):虹膜分割与图像归一化

(一)进一步分割 上面已经得到了关于分割区域的虹膜部分如下图所示:   内外圆之间的部分认为是要进行识别的部分。 该图的大小为600*800,内外圆的参数前面计算过,这里在给一遍: mean_circle_in =[324 ; 332 ; ...
  • on2way
  • on2way
  • 2014-11-09 12:09
  • 5537

Opencv3.1的机器学习的再探:瞳孔/虹膜分类

opencv 分类器学习
  • u013351270
  • u013351270
  • 2016-12-07 16:42
  • 834

虹膜识别(四):hough变换检测外圆

前面利用hough变换检测圆的办法检测出虹膜内圆,现在用同样的方法来检测外圆,不过在检测时需要对图像进行预处理。 在进行Hough变换检测,我们说输入的图像需要是进行处理过的二值轮廓图像,并且轮廓点越少越好,而且这些点尽可能的落在你要检测的那个圆上才行,这样的检测图像才有利于提高hough变换的检...
  • on2way
  • on2way
  • 2014-11-06 17:29
  • 3369

虹膜识别(三):Hough变换检测内圆边缘

前面我们已经得到了hough变换的基础条件,那就是有一个很好的用于检测的二值边缘图像如下所示:   至此我们才能运用hough变换。 Hough变换是一类广泛用于检测各种规则图形用的,像直线、圆、椭圆等等,不同的就是检测的规律不同。Hough变换的原理网上多得是,我当初也是百度上查的...
  • on2way
  • on2way
  • 2014-11-04 19:39
  • 4054

虹膜识别matlab程序源代码

  • 2009-02-25 10:23
  • 8.20MB
  • 下载

虹膜识别概述

人的眼睛结构由巩膜、虹膜、瞳孔晶状体、视网膜等部分组成。虹膜是位于黑色瞳孔和白色巩膜之间的圆环状部分,其包含有很多相互交错的斑点、细丝、冠状、条纹、隐窝等的细节特征。虹膜在一定波长的红外光(一般在700-900纳米之间)照射下,总体上呈现一种由里到外的放射状结构。通常,我们将这些细微特征称为虹膜的纹...
  • cymy001
  • cymy001
  • 2017-09-27 16:45
  • 146

虹膜定位详尽的虹膜识别matlab源代码 基于MATLAB的虹膜识别系统研究

  • 2014-12-26 23:01
  • 19KB
  • 下载

用opencv检测人眼并定位瞳孔位置

最近的研究要定
  • computerme
  • computerme
  • 2014-07-26 12:07
  • 8765

程序员的机器学习入门笔记(十一):简单人脸识别系统实践

说明机器学习的一个主要应用范围就是对客观事物的识别,也成为模式识别。模式识别的主要研究目标就是赋予机器可以对生物的信息进行识别和处理。目前关于模式识别的应用已经得到了比较广泛的应用,例如 人脸识别,声音识别,瞳孔识别。在 前面两篇文章中(http://blog.csdn.net/eric_sunah...
  • sun7545526
  • sun7545526
  • 2017-03-06 13:03
  • 2937
    个人资料
    • 访问:197195次
    • 积分:2909
    • 等级:
    • 排名:第14404名
    • 原创:86篇
    • 转载:6篇
    • 译文:0篇
    • 评论:75条
    文章分类
    最新评论