前面利用hough变换检测圆的办法检测出虹膜内圆,现在用同样的方法来检测外圆,不过在检测时需要对图像进行预处理。
在进行Hough变换检测,我们说输入的图像需要是进行处理过的二值轮廓图像,并且轮廓点越少越好,而且这些点尽可能的落在你要检测的那个圆上才行,这样的检测图像才有利于提高hough变换的检测效率以及准确度,也就是预处理的二值图像直接关系到检测出来的结果。
以以前检测的那副图像为例,如下:
那么对于这样一幅原始图像,要获得轮廓图像最简单的就是边缘检测方法获得边缘图像。Matlab的边缘检测方法有很多,Prewitt算子,Canny算子,Sobel算子,robert算子,Laplacian算子等等,
详见参考http://www.kongzhi.net/cases/caseview.php?id=2368
不同的算子使用的模板不同,适用的环境也不同,有的算子抗噪声能力强,有的差,有的对各个方向的边缘检测较好,有的较差。这里我们选用的是canny算子来检测边缘。在直接使用它之前最好再进行一下滤波处理,从图像中我们也可以看到,眼睑毛是可能引起边缘误检测的最可能的因素,如何去除或者降低它的影响对结果的检测至关重要。这里我们直接采用一个中值滤波方法来模糊这些眼睑毛的影响。对上图至今进行如下操作:
img = medfilt2(img,[5 5],'symmetric');
显示出来如下:
稍微比较一下还是有一点区别,特别尖锐的地方被模糊掉了。
即使这样,边缘分割其实还不是很明显,为了使看起来边缘的区别更明显些,在进行一些灰度处理,首先找到全局阈值,对低于一定范围和高于一定范围的像素点直接给予两个极端灰度值,处理如下:
%对原图像求取灰度的最佳全局阀值处理
T= graythresh(img);
%对img图中,大于阀值的置255(最大),内圆置灰色,假设为100
img(img>(T*255)) = 255;
img(img<50) = 100;
显示处理后的img图:
这样看起来是不是更明显点。对这个图再去边缘检测的到边缘二值图:
%参数调整==》此时产生的噪声的最小 数据位实验所得 不同的图像不同
edg_bw = edge(img,'canny',[0.05 0.3],13);
显示得到的图像如下:
对这个图像,运用上节说到的hough变换函数进行大圆的检测。这里需要确定此时hough变换的几个参数,首先就是半径的检测范围,确定这个范围可以直接去打开原图像的矩阵,另外这幅图的大小是600*800的,直观的看到,圆的直径至少有原图列长度的一半吧,也就是400,那么半径也至少有200吧,至于上至多少可以从边缘图的矩阵数组中去看看大致范围。这里经过检测把范围大致设为210到250吧,虽说这个范围越大越好,但是大到一定程度后,无论从空间上还是时间上来讲都耗费巨大,甚至有可能达到matlab预定的内存范围,这也是hough变换的最大缺点。
那么对上述图像进行hough变换如下:
mean_circle = hough_circle(edg_bw,1,0.0524,210,250,0.9);
得到外圆参数为:>> mean_circle
mean_circle_out =画在一个图中如下:
可以看到,检测的效果还算可以,把上节内圆参数同样画在一个图中如下: