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

前面利用hough变换检测圆的办法检测出虹膜内圆,现在用同样的方法来检测外圆,不过在检测时需要对图像进行预处理。

在进行Hough变换检测,我们说输入的图像需要是进行处理过的二值轮廓图像,并且轮廓点越少越好,而且这些点尽可能的落在你要检测的那个圆上才行,这样的检测图像才有利于提高hough变换的检测效率以及准确度,也就是预处理的二值图像直接关系到检测出来的结果。

以以前检测的那副图像为例,如下:

 虹膜识别(四):hough变换检测外圆_第1张图片

那么对于这样一幅原始图像,要获得轮廓图像最简单的就是边缘检测方法获得边缘图像。Matlab的边缘检测方法有很多,Prewitt算子,Canny算子,Sobel算子,robert算子,Laplacian算子等等,

详见参考http://www.kongzhi.NET/cases/caseview.PHP?id=2368

不同的算子使用的模板不同,适用的环境也不同,有的算子抗噪声能力强,有的差,有的对各个方向的边缘检测较好,有的较差。这里我们选用的是canny算子来检测边缘。在直接使用它之前最好再进行一下滤波处理,从图像中我们也可以看到,眼睑毛是可能引起边缘误检测的最可能的因素,如何去除或者降低它的影响对结果的检测至关重要。这里我们直接采用一个中值滤波方法来模糊这些眼睑毛的影响。对上图至今进行如下操作:

img = medfilt2(img,[5 5],'symmetric');

显示出来如下:

 虹膜识别(四):hough变换检测外圆_第2张图片

稍微比较一下还是有一点区别,特别尖锐的地方被模糊掉了。

即使这样,边缘分割其实还不是很明显,为了使看起来边缘的区别更明显些,在进行一些灰度处理,首先找到全局阈值,对低于一定范围和高于一定范围的像素点直接给予两个极端灰度值,处理如下:

%对原图像求取灰度的最佳全局阀值处理

T= graythresh(img);

%对img图中,大于阀值的置255(最大),内圆置灰色,假设为100

img(img>(T*255)) = 255;

img(img<50) = 100;

显示处理后的img图:

 虹膜识别(四):hough变换检测外圆_第3张图片

这样看起来是不是更明显点。对这个图再去边缘检测的到边缘二值图:

%参数调整==》此时产生的噪声的最小  数据位实验所得  不同的图像不同  

edg_bw = edge(img,'canny',[0.05 0.3],13);

显示得到的图像如下:

 虹膜识别(四):hough变换检测外圆_第4张图片

对这个图像,运用上节说到的hough变换函数进行大圆的检测。这里需要确定此时hough变换的几个参数,首先就是半径的检测范围,确定这个范围可以直接去打开原图像的矩阵,另外这幅图的大小是600*800的,直观的看到,圆的直径至少有原图列长度的一半吧,也就是400,那么半径也至少有200吧,至于上至多少可以从边缘图的矩阵数组中去看看大致范围。这里经过检测把范围大致设为210250吧,虽说这个范围越大越好,但是大到一定程度后,无论从空间上还是时间上来讲都耗费巨大,甚至有可能达到matlab预定的内存范围,这也是hough变换的最大缺点。

     那么对上述图像进行hough变换如下:

 mean_circle = hough_circle(edg_bw,1,0.0524,210,250,0.9);

得到外圆参数为:>> mean_circle

mean_circle_out =


   336
   340
   233

画在一个图中如下:

 虹膜识别(四):hough变换检测外圆_第5张图片

可以看到,检测的效果还算可以,把上节内圆参数同样画在一个图中如下:

 虹膜识别(四):hough变换检测外圆_第6张图片

你可能感兴趣的:(虹膜识别)