基于OpenCV的圆斑检测方法

从一副图像中检测出含有的圆形斑点(类似镂空),斑点内部均匀。检测条件是圆斑与背景有明显的对比度差异。
尝试了三种方法:
方法一:基于LoG算子的圆斑检测。
这是常用的斑点检测方法,可参考http://doc.okbase.net/ronny/archive/102540.html。
此方法的问题是,图像中不是圆形的斑点也会检测出来,还需要进一步的判断,这使得算法的效率不高。
【基于OpenCV的圆斑检测方法】方法二:使用opencv自带的SimpleBlobDetector类,同样可参考http://doc.okbase.net/ronny/archive/102540.html
这种方法可以设置多重筛选条件,能检测出圆斑。它的思路是,使用多个阈值分别对图像进行二值化、检测轮廓,继而根据设置的筛选条件检测出圆斑。这种方法的缺点是,执行效率低。而且检测出来的圆斑半径不准,不知道为什么。。
方法三:基于轮廓特征进行检测
针对方法二多层阈值迭代的缺陷,考虑实时性和当前项目只需要对一种尺寸的圆斑进行检测,所以采取了简化方法二的方法。方法思路是,使用otsu方法计算出阈值,对图像进行二值化。然后检测二值化图像的闭合轮廓,计算每个的弧长和包围面积,继而计算出该轮廓的圆形率,以此判定圆斑。
注:在调试中发现,二值化图像在使用findContours检测轮廓后,图像本身会发生变化。这个有点奇怪。。

    推荐阅读