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

工具/原料
- 电脑
- python
- opencv模块
方法/步骤
- 1
先检测边界。
img0=cv2.imread('0.png')
img=cv2.Canny(img0,0,255)
- 2
构造一个计数器:
u,v=img.shape
acc=img*0
- 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
无论怎么样,先在原图中标注出检测到的"圆":
x,y=np.where(acc==np.max(acc))
cv2.circle(img0,(x[0],y[0]),r,(0,0,255),2)
确实检测无效,见下图。
- 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
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