gpt4 book ai didi

java - 如何检测二值图像中的圆圈

转载 作者:太空宇宙 更新时间:2023-11-03 22:00:05 25 4
gpt4 key购买 nike

是原图: enter image description here

以及预处理后的图像

  • 变灰
  • 做精明的边缘
  • 膨胀
  • 侵 eclipse
  • 按位不

结果如下:

enter image description here

现在我要检测上图中所有的实心圆圈,我得到的结果想要:

enter image description here

我试过这样的事情:

MatOfPoint2f approxCurve = new MatOfPoint2f();
matOfPoint2f.fromList(contour.toList());
Imgproc.approxPolyDP(matOfPoint2f, approxCurve, Imgproc.arcLength(matOfPoint2f, true) * 0.02, true);
long total = approxCurve.total();
// now check the total if it was greater than 6, then it can be a circle

结果是这样的:这不是我想要的

enter image description here

更新:(包含更多示例图片)

enter image description here enter image description here enter image description here

最佳答案

UPDATE: updating my solution using contours. you can find the solution using Hough circles below this.


使用轮廓方法。

我今天再次尝试寻找轮廓来标记管道。我用轮廓得到的结果。我已经根据轮廓长度和面积过滤了结果。但是您可以根据您拥有的图像应用更多约束。看起来我已经过度拟合了这张图像的解决方案,但这是我唯一可以访问的图像。您还可以使用 laplacian/canny 代替自适应阈值。希望这会有所帮助:)

Pipes using contour

import cv2 as cv2

img_color = cv2.imread('yNxlz.jpg')
img_gray = cv2.cvtColor(img_color, cv2.COLOR_BGR2GRAY)

image = cv2.GaussianBlur(img_gray, (5, 5), 0)

thresh = cv2.adaptiveThreshold(image,255,cv2.ADAPTIVE_THRESH_MEAN_C,\
cv2.THRESH_BINARY_INV,11,2)

contours,hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnt = contours

contour_list = []
for contour in contours:
approx = cv2.approxPolyDP(contour,0.01*cv2.arcLength(contour,True),True)
area = cv2.contourArea(contour)
# Filter based on length and area
if (7 < len(approx) < 18) & (900 >area > 200):
# print area
contour_list.append(contour)

cv2.drawContours(img_color, contour_list, -1, (255,0,0), 2)
cv2.imshow('Objects Detected',img_color)
cv2.waitKey(5000)

霍夫圆法

我尝试拍摄您的图像并应用 hough circles(opencv)。我没有安装 Java,因此我使用了 python。这是我得到的代码和相应的结果。

在此之前,有一些技巧可以对此进行微调。

  • 重要的是预处理,一个简单的高斯模糊让我得到了很好的改进,所以尝试使用高斯滤波器大小。
  • 由于您已经知道管道的半径/直径,因此可以利用该信息。也就是说,在 Houghcircles 中使用 minradius 和 maxradius 参数。
  • 如果您知道管道之间的最小距离,您还可以使用 mindist 参数。
  • 如果您知道可能存在管道的区域,则可以忽略在该区域以外的区域中检测到的误报管道。

希望这有帮助:)

我使用的代码

import cv2 as cv2

img_color = cv2.imread('yNxlz.jpg')
img_gray = cv2.cvtColor(img_color, cv2.COLOR_BGR2GRAY)

img_gray = cv2.GaussianBlur(img_gray, (7, 7), 0)

#Hough circle
circles = cv2.HoughCircles(img_gray, cv2.cv.CV_HOUGH_GRADIENT, 1, minDist=15,
param1=50, param2=18, minRadius=12, maxRadius=22)

if circles is not None:
for i in circles[0, :]:
# draw the outer circle
cv2.circle(img_color, (i[0], i[1]), i[2], (0, 255, 0), 2)
# draw the center of the circle
cv2.circle(img_color, (i[0], i[1]), 2, (0, 0, 255), 3)

cv2.imwrite('with_circles.png', img_color)

cv2.imshow('circles', img_color)
cv2.waitKey(5000)

这是我得到的结果。

Results with Hough circles

关于java - 如何检测二值图像中的圆圈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43841210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com