检测图像中圆圈的快速方法有哪些?
例如:我有一个大圆圈的图像,并在大圆圈内有6个小圆圈.
我需要在不使用Hough Circles(OpencV)的情况下找到一个大圆圈.
我有很多不同的图像,但是在所有圆圈中都是黑色(或几乎是黑色)并且尺寸相同(+/-几个像素).我相信每张图片中只有2943个圆圈.这些条件永远不变.我可能无法控制图像中圆圈的大小(半径通常在15-45像素之间 - 上面提供的示例图像的半径为20-21像素).
我需要能够尽可能准确和精确地检测这些圆的中心的确切位置(如果可能的话,半径也是如此).
我尝试使用该cv2.HoughCircles函数来执行此操作,但结果非常不一致且不可靠.这是我使用的代码:
from pylab import *
import sys, cv2
filename = sys.argv[1];
img = cv2.imread(filename,0);
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR);
circles = cv2.HoughCircles(img,cv2.cv.CV_HOUGH_GRADIENT,2,15,param1=100,param2=30,minRadius=15,maxRadius=25);
circles = np.uint16(np.around(circles));
for i in circles[0,:]:
cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),1);
cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3);
cv2.imwrite('1-%s'%(filename),cimg)
print "%d circles found."%(len(circles[0]));
Run Code Online (Sandbox Code Playgroud)
结果是这个图像和这个输出:2806 circles found.
有许多虚假圈子,许多真实的圈子被遗漏/忽略.
我开始相信,HoughCircle如果我的所有圆圈在单个图像中相同,则该方法不是最佳方法,并且可能有一些更好的物体检测方法可用.
如果我可以足够严密地控制圆圈的属性,你建议我用什么来精确准确地检测数千个图像中的每个圆圈?