Python 找到图像中的所有圆

Python 找到图像中的所有圆,python,opencv,Python,Opencv,我是python和图像处理新手。我正在做一个爱好项目,在这个项目中,我想找到图像中的所有圆圈,然后找出其中有十字('X')标记的圆圈。到目前为止,我已经将一些代码放在一起以查找圆圈(如下所示)。它在一个图像上工作,但无法识别另一个图像上的所有圆。请指导我如何提高find_circles算法的性能 测试图像: 结果图像: import cv2 import cv import numpy as np import operator from PIL import Image def find_

我是python和图像处理新手。我正在做一个爱好项目,在这个项目中,我想找到图像中的所有圆圈,然后找出其中有十字('X')标记的圆圈。到目前为止,我已经将一些代码放在一起以查找圆圈(如下所示)。它在一个图像上工作,但无法识别另一个图像上的所有圆。请指导我如何提高find_circles算法的性能

测试图像:

结果图像:

import cv2
import cv
import numpy as np
import operator
from PIL import Image

def find_circles(img):
    im_gray = cv2.imread(img, cv2.CV_LOAD_IMAGE_GRAYSCALE)
    (thresh, im_bw) = cv2.threshold(im_gray, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
    img_bw = cv2.threshold(im_gray, thresh, 255, cv2.THRESH_BINARY)[1]
    cv2.imwrite('img_bw.png',img_bw)
    rows, cols =img_bw.shape
    circles = cv2.HoughCircles(img_bw,cv.CV_HOUGH_GRADIENT,1,rows/32, param1=100,param2=40,minRadius=0,maxRadius=100)
    circles = np.uint16(np.around(circles))
    return circles

def draw_circles(img, circles):
    img = cv2.imread(img,0)
    cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
    for i in circles[0,:]:
    # draw the outer circle
        cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
        # draw the center of the circle
        cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)
        cv2.putText(cimg,str(i[0])+str(',')+str(i[1]), (i[0],i[1]), cv2.FONT_HERSHEY_SIMPLEX, 0.4, 255)
    return cimg 

def main():
    img = "query_circle9.png"
    circles = find_circles(img)
    img_circle = draw_circles(img,circles)
    cv2.imwrite('cricle.png',img_circle) 

if __name__=='__main__':
    main()

结果是:

cimg = detect_circles("circles.png")


还有一些剩余的错误检测。如果图像对齐,则可以根据y坐标过滤这些误报。我将把它留给您。

有问题图像的链接会很有帮助。您是否也会发布有问题图像的原始链接?未处理的图像会很好,是的;)谢谢你的帮助!不客气。我认为你们仍然面临着很多挑战。您会发现,该算法对平滑图像等参数非常敏感。即使它对该图像似乎正常工作,但对其他图像可能不起作用。根据您的背景,我建议考虑结合机器学习来验证圆,并使用启发式(单独或在优化框架中)如每行和每列的圆数来进一步细化圆。如果您有任何类似的问题,请随时ping我或smth。祝你好运:)。我收到一个错误:AttributeError:模块“cv2.cv2”没有属性“cv”。如何纠正?谢谢。@ahbon该代码是在2014年编写的,当时OpenCV的版本仍然是2.0+。似乎自OpenCV 3.0以来,
HOUGH_GRADIENT
常量已被移动到
cv2
名称空间,因此它现在是cv2.HOUGH_GRADIENT`(即,在
cv2
之后删除
cv
),为我节省了+1天的工作时间
cimg = detect_circles("circles.png")