本文,介绍的是基于Hough变换的圆形检测算法。

工具/原料

  • 电脑
  • python
  • opencv模块

方法/步骤

  1. 1

    先检测边界。

    img0=cv2.imread('0.png')

    img=cv2.Canny(img0,0,255)

  2. 2

    构造一个计数器:

    u,v=img.shape

    acc=img*0

  3. 3

    检测半径为100的圆:

    r=100

    for i in range(u):

        for j in range(v):

            if img[i,j]!=0:

                for m in range(360):

                    t=m*np.pi/180

                    x=int(i-r*np.cos(t))

                    y=int(j-r*np.sin(t))

                    if 0<x<u and 0<y<v:

                        acc[x,y]=acc[x,y]+1

    没有明显的极值点,就表示没有半径为100的圆。

  4. 4

    无论怎么样,先在原图中标注出检测到的"圆":

    x,y=np.where(acc==np.max(acc))

    cv2.circle(img0,(x[0],y[0]),r,(0,0,255),2)

    确实检测无效,见下图。

  5. 5

    用for循环检测不同半径的圆:

    for r in range(45,50):

        acc=img*0

        for i in range(u):

            for j in range(v):

                if img[i,j]!=0:

                    for m in range(360):

                        t=m*np.pi/180

                        x=int(i-r*np.cos(t))

                        y=int(j-r*np.sin(t))

                        if 0<x<u and 0<y<v:

                            acc[x,y]=acc[x,y]+1

        if np.max(acc)<300:

            pass

        else:

            cv2.imwrite('2.png',acc)

            x,y=np.where(acc==np.max(acc))

            cv2.circle(img0,(x[0],y[0]),r,(0,0,255),2)

    检测失败,而且很耗时。

  6. 6

    opencv内置检测方法,可以同时检测不同半径的圆,而且时间很短:

    img0=cv2.imread('0.png')

    img=cv2.Canny(img0,0,255)

    circles= cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,100,

                              param1=100,param2=30,

                              minRadius=45,maxRadius=100)

    for circle in circles[0]:

        x=int(circle[0])

        y=int(circle[1])

        r=int(circle[2])

        cv2.circle(img0,(x,y),r,(0,0,255),2)

    cv2.imwrite('3.png',img0)

    END
经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。