【问题标题】:Find multiple circles with different sizes in image在图像中找到多个不同大小的圆圈
【发布时间】:2020-04-20 00:39:09
【问题描述】:

我需要在不同大小的图像上找到圆圈。我无法显示图像本身,但我确实尝试创建一个“虚拟图像”:

如您所见:有几个不同大小的圆圈。有些中间是透明的,有些不是。白色圆圈在这里很重要。真实的背景不如这里,因为那是一张图片,但这可能会很好地模拟它。

现在我的代码应该可以做两件事了:

  1. 找出圆心的位置。
  2. 能够证明这些确实是圆心的位置。

对于第一点: 我尝试使用 OpenCV templateMatch,它仅适用于一种尺寸,而不适用于不同尺寸。我还尝试使用几个不同大小的模板来循环代码,但这需要很多时间,因为应该有许多不同大小的模板。 然后我尝试使用 OpenCV Hough Circles,但似乎并没有找到每个圆圈:

然后我尝试使用OpenCV findContours,但是因为背景甚至不像图像,所以显示的轮廓太多了。

现在我不知道我的其他选择是什么。

有没有一种很好/好的方法可以找到这些圈子,包括每个找到的圈子的确定性分数?那么这些找到的点是正确的程序有多确定呢? OpenCV 是要使用的模块吗?还是我应该使用不同的东西(技术/模块/方法)?

【问题讨论】:

  • 稍微模糊图像以帮助平滑背景纹理。然后对图像进行阈值处理,以便在黑色背景上有白色圆圈。然后使用 findContour。然后获取质心。

标签: python-3.x image opencv


【解决方案1】:

这是在 Python/OpenCV 中执行此操作的一种方法。

  • 读取输入
  • 转换为灰色
  • 模糊(平滑背景)
  • 阈值
  • 应用形态关闭和打开平滑
  • 获取轮廓
  • 绘制轮廓和质心
  • 保存结果

输入:

import cv2
import numpy as np

# read image
img = cv2.imread('circles.png')

# convert to grayscale
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# apply gaussian blur
blur = cv2.GaussianBlur(gray, (9,9), 0)


# threshold
thresh = cv2.threshold(blur,128,255,cv2.THRESH_BINARY)[1]


# apply close and open morphology to smooth
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (9,9))
thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)

# draw contours and get centroids
circles = img.copy()
contours = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]
for cntr in contours:
    cv2.drawContours(circles, [cntr], -1, (0,0,255), 2)
    M = cv2.moments(cntr)
    cx = int(M["m10"] / M["m00"])
    cy = int(M["m01"] / M["m00"])
    x = round(cx)
    y = round(cy)
    circles[y-2:y+3,x-2:x+3] = (0,255,0)
    print(cx,",",cy)        


cv2.imshow("thresh", thresh)
cv2.imshow("circles", circles)

cv2.waitKey(0)
cv2.destroyAllWindows()

# save cropped image
cv2.imwrite('circles_thresh.png',thresh)
cv2.imwrite('circles_centroids.png',circles)


阈值图像:

显示圆形轮廓和质心的结果图像:

质心:

1395 , 937
492 , 891
1617 , 647
978 , 573
1286 , 295
304 , 227
737 , 140


【讨论】:

  • 感谢您的回复。我也试过这个,但这只有在背景和现在一样均匀的情况下才有效。有时,在拍照时,背景的某些部分比其他部分要亮。去一个门槛图像然后变得一团糟。有时图像中还有正方形或其他形状,但应该只找到圆形。
  • 最好看一张或多张这些图片,以便能够建议其他方法。
猜你喜欢
  • 1970-01-01
  • 2011-01-10
  • 2015-06-14
  • 2019-04-09
  • 2011-12-04
  • 1970-01-01
  • 2020-12-12
  • 2020-03-14
  • 2020-04-09
相关资源
最近更新 更多