Python OpenCV 从黑白蒙版检测圆形

1 投票
1 回答
5165 浏览
提问于 2025-04-20 03:01

我用各种OpenCV的滤镜创建了一个黑白的图像蒙版。图中有四个圆圈,非常明显 黑白蒙版

我想用HoughCircles来勾勒这些圆圈,但结果却出现了很多错误的检测,整体效果也不好:

circles = cv2.HoughCircles(combined, cv.CV_HOUGH_GRADIENT, 1, 300, np.array([]), 10, 30, 60, 300)

圆圈轮廓

我该如何正确地在这个黑白图像中检测出圆形呢?

这里有一段可以和黑白图像一起使用的代码:

import numpy as np
import cv2
import cv

image = cv2.imread("image.png")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

circles = cv2.HoughCircles(gray, cv.CV_HOUGH_GRADIENT, 1, 300, np.array([]), 10, 30, 60, 300)
if circles is not None:
  circles = np.uint16(np.around(circles))
  for i in circles[0,:]:
      cv2.circle(image, (i[0], i[1]), i[2], (0, 255, 0), 1)
      cv2.circle(image, (i[0], i[1]), 2, (0, 0, 255), 3)

cv2.imshow("thing", image)

cv2.waitKey(0)
cv2.destroyAllWindows()

1 个回答

1

首先,如果我没记错的话,霍夫变换用于检测圆形时,期待的是一个空心圆,而不是一个实心圆。这意味着在使用霍夫变换之前,你需要先提取出圆的边界。OpenCV中的findContoursarcLength函数可以帮助你找到这些边界。

其次,不幸的是,根据我的经验,霍夫变换对圆形的形状变化非常敏感,也就是说,如果你想检测的形状“差不多”是个圆,它可能就无法检测到。

我的建议是,你可以通过在二值图像上应用闭合形态操作来让你的物体“更圆”,使用一个圆盘形状的结构元素。然后提取图像中物体的边界,最后再应用霍夫变换。希望这样能得到不错的结果。


另外,你也可以尝试使用RANSAC算法来检测圆形。这里

其中(x,y)是点的坐标,(x0,y0)是圆心,r是半径,margin是你需要调整的参数。算法的其他部分是一样的。

祝你好运!

撰写回答