如何解决检测非常微弱的圆圈,不清晰的边缘霍夫变换不起作用
我正在做的工作是输出一个微弱的大圆圈。
我可以看到圆在那里,我从实验中知道它是一个均匀的实心圆。 但是我在用 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/
我目前正在做的“黑客”只是徒手选择圆圈,但希望能够自动化该过程。 图片如下,如果有人能指出我正确的方向,将不胜感激!
解决方法
自适应阈值和 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,255,norm_type=cv.NORM_MINMAX)
img = cv.medianBlur(img,11)
img = cv.adaptiveThreshold(img,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,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,2)
plt.subplot(2,1,1)
plt.imshow(img,cmap="gray")
plt.colorbar()
plt.subplot(2,2)
plt.imshow(orig_img)
plt.show()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。