【数字图像处理】利用霍夫变换检测圆形

来源:互联网 发布:淘宝放单群 编辑:程序博客网 时间:2024/04/28 20:09

代码下载:http://download.csdn.net/detail/jsgaobiao/9503229

 

Ø  【作业要求】


Write your own imfindcircles() to simulatematlab function imfindcircles(). The attached images are for testing.

Submit your code, result and report.


Ø  【文件说明】


main.m:

读取3张测试图片并且进行转灰度图、用Sobel算子边缘检测、二值化、调用findcircle函数并将找到的圆绘制在原图上。

findcircle.m:

利用霍夫变换的方法找到图片中的圆,并返回圆的坐标和半径。


Ø  【作业思路】


本次作业找圆主要是使用了霍夫变换的方法。

先介绍一下霍夫变换的思想:


霍夫变换是图像处理中用于识别几何图形的一种常用方法。最简单的应用是检测黑白图像上的一条直线。我们用y=kx+b表示一条直线,其中k和b是参数,分别是斜率和截距。如果将k和b视为变量,考虑参数平面k-b,那么x-y平面上的一个点对应到k-b参数平面上就是一条直线。

假设在x-y平面上有若干待拟合的散点,那么他们可以对应到参数平面上的若干条直线。如果x-y平面上的散点都在一条直线上,那么他们对应在参数平面上的若干条直线必然交与(k0,b0)这一点,其中k0,b0是x-y平面上那条直线的参数。如果参数平面上的直线产生了多个交点,那么我们就选取经过直线最多的交点。可以理解为若干直线对于坐标点(k,b)的投票,票数最多的参数(k,b)我们认为就是最好的一组参数。


处理圆的情况更容易理解,因为我们可以取和图像平面一样的参数平面,以图像上的每一个非零点(因为该算法处理的是二值化后的图片,即对原图进行边缘提取后的结果)为圆心,以已知的半径在参数平面上画圆(对圆覆盖的坐标点进行投票),最后找出参数平面上的峰值,就对应于原图中的圆心。

但是这个做法存在一个问题——我们并不知道圆的半径。一个解决方案是把参数平面拓展为三维的空间x-y-r,对应圆心坐标和半径。这样做需要增加相当大的时间、空间复杂度。为了提高算法的效率,我将圆的半径范围作为参数输入findcircle函数中,对于不同的图像采用不同的参数进行处理,可以有效的减少运行的时间。

 

另外,作为参数输入findcircle函数的还有二值化后的图像BW,枚举半径的范围[minR,maxR]和步长stepR和在参数平面画圆投票的弧度步长stepAngle。

最终的检测效果如下图所示:

1 1
原创粉丝点击