【图像处理】检测圆的Hough变换算法

2025-10-28 17:33:05

1、先检测边界。

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

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

【图像处理】检测圆的Hough变换算法

2、构造一个计数器:

u,v=img.shape

acc=img*0

【图像处理】检测圆的Hough变换算法

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的圆。

【图像处理】检测圆的Hough变换算法

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

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

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

确实检测无效,见下图。

【图像处理】检测圆的Hough变换算法

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)

检测失败,而且很耗时。

【图像处理】检测圆的Hough变换算法

【图像处理】检测圆的Hough变换算法

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)

【图像处理】检测圆的Hough变换算法

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢