能用一个参数方程表示的对象,都适合霍夫变换来检测。本节介绍如何检测圆环。

在霍夫圆变换中,需要考虑圆半径和圆心(x坐标,y坐标)三个参数,在OpenCV中,策略是经过两轮筛选:

  • 第一轮筛选找出可能存在的圆的位置(圆心)

  • 第二轮筛选再根据第一轮的结果筛选出半径大小

与改良的直线检查一样,霍夫圆也有几个用于决定是否接受圆的参数:圆心间的最小距离、圆的最小直径、圆的最大半径

语法:

circles = cv2.HoughCircles(
img,
method,
dp,
minDist,
param1,
param2,
minRadius,
maxRadius
)
  • image: 输入图像,类型为8位的单通道灰度图像。
  • method:检测方法。现在HOUGH_GRADIENT是唯一可用的参数值。
  • dp:累计器分辨率,它是一个分割比例,用来指定图像分辨率与圆心累加器分辨率的比例。例如,如果dp=1,则输入图像和累加器具有相同的分辨率
  • minDist:圆心间的最小距离。该值被当做阈值使用,如果存在圆心间距小于该值的多个圆,则仅有一个会被检测出来。因此,如果该值太小,则会有多个临近的圆被检测出来;如果该值太大,则可能会在检测时漏掉一些圆
  • param1:该参数是缺省的,在缺省时默认值为100。它对应的是Canny边缘检测器的高阈值。(低阈值是高阈值的二分之一)
  • param2:圆心位置必须收到的投票数。只有在第一轮筛选中,投票数超过该值的圆,才有资格进入第二轮的筛选。因此,该值越大,检测到的圆越少;该值越小,检测到的圆越多。这个参数是缺省的,在缺省时具有默认值100
  • minRadius:圆半径的最小值,小于该值的圆不会被检测出来。该参数是缺省的,在缺省时具有默认值0,此时该参数不起作用
  • maxRadius:圆半径的最大值,大于该值的圆不会被检测出来。该参数是缺省的,在缺省时具有默认值0,此时该参数不起作用
  • circles:返回值,由圆心坐标和半径构成的numpy.ndarray。

需要特别注意的是,在调用cv2.HoughLinesCircles()之前,要对源图像进行平滑操作。以减少图像中的操作,避免发生误判。

例:使用cv2.HoughLinesCircles()对一幅图像进行霍夫圆变换,并检测观察效果。

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('xiangqi.png',0)
imgo = cv2.imread('xiangqi.png',-1)

o = cv2.cvtColor(imgo, cv2.COLOR_BGR2RGB)
oshow = o.copy()
img = cv2.medianBlur(img,5)
circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,150,param1=50,param2=30,minRadius=40,maxRadius=90)
circles = np.uint16(np.around(circles))

for i in circles[0,:]:
    cv2.circle(o,(i[0],i[1]),i[2],(255,0,0),12)
    cv2.circle(o,(i[0],i[1]),2,(255,0,0),12)

plt.subplot(121)
plt.imshow(oshow)
plt.axis('off')
plt.subplot(122)
plt.imshow(o)
plt.axis('off')

plt.show()

参数合适

在实际的使用中,往往需要各种参数调整,例如:

不同参数下的效果


xiangqi.png



博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/OpenCV52.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 05 月 26 日
如果觉得我的文章对你有用,请随意赞赏