检测非常微弱的圆圈,不清晰的边缘。霍夫变换不起作用

Detect very faint circles, not clear edge. Hough Transform not working

我正在做输出是一个模糊的大圆圈的工作。

看到圆就在那里,通过实验知道是均匀的实心圆。 但是我在使用 python 识别它时遇到了问题。 我尝试使用霍夫变换,因为边缘不锐利,我得到了多个圆圈。我按照下面的教程 我尝试使用 Canny Edge 检测,但无论我使用什么 sigma 值,我都会得到非常嘈杂的结果

我也试过放大图像

https://docs.opencv.org/4.5.2/da/d53/tutorial_py_houghcircles.html

https://learnopencv.com/filling-holes-in-an-image-using-opencv-python-c/

我目前正在做的“破解”只是徒手 select 圈子,但希望能够使该过程自动化。 图片如下,如果有人能指出正确的方向,将不胜感激!

自适应阈值和 findContours 似乎有所帮助。模糊和阈值函数的参数需要根据您的数据进行调整,我敢肯定...

import cv2 as cv
from matplotlib import pyplot as plt

orig_img = cv.imread("image.png", cv.IMREAD_COLOR)

img = cv.cvtColor(orig_img, cv.COLOR_BGR2GRAY)
img = cv.normalize(img, None, 0, 255, norm_type=cv.NORM_MINMAX)
img = cv.medianBlur(img, 11)
img = cv.adaptiveThreshold(img, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 45, 1)
img = 255 - img
contours, hierarchy = cv.findContours(img, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
largest_contour = max(contours, key=cv.contourArea)
cv.drawContours(orig_img, [largest_contour], -1, (0, 255, 0), 2)
x, y, w, h = cv.boundingRect(largest_contour)
midx = int(x + w / 2)
midy = int(y + h / 2)
cv.circle(orig_img, (int(midx), int(midy)), max(w, h) // 2, (255, 0, 0), 2)

plt.subplot(2, 1, 1)
plt.imshow(img, cmap="gray")
plt.colorbar()


plt.subplot(2, 1, 2)
plt.imshow(orig_img)

plt.show()