Opencv 如何改进Hough圆变换来检测由散乱点组成的圆

Opencv 如何改进Hough圆变换来检测由散乱点组成的圆,opencv,image-processing,feature-detection,hough-transform,Opencv,Image Processing,Feature Detection,Hough Transform,我有一个非常基本的代码,它使用openCV中的标准化HoughCircles命令来检测圆。但是,我的问题是,我的数据(图像)是使用一种算法生成的(用于数据模拟),该算法在r的+-15%(随机在此范围内)范围内绘制一个点(其中r是圆的半径,随机生成的圆在5到10之间(实数))用一个圆的方程来计算360度。(附上一张样本图片)。 现在使用Hough circle命令,我可以通过手动播放参数(通过设置轨迹栏,灵感来自于相同性质的github代码)来检测半径大致相同的圆,但我想自动化这个过程,因为我有1

我有一个非常基本的代码,它使用openCV中的标准化HoughCircles命令来检测圆。但是,我的问题是,我的数据(图像)是使用一种算法生成的(用于数据模拟),该算法在r的+-15%(随机在此范围内)范围内绘制一个点(其中r是圆的半径,随机生成的圆在5到10之间(实数))用一个圆的方程来计算360度。(附上一张样本图片)。 现在使用Hough circle命令,我可以通过手动播放参数(通过设置轨迹栏,灵感来自于相同性质的github代码)来检测半径大致相同的圆,但我想自动化这个过程,因为我有1000多个图像,我想一遍又一遍地这样做。有更好的方法吗?或者,如果有人有任何建议,我会非常感谢他们,因为我是图像处理领域的初学者,有物理背景,而不是计算机科学背景。 下面是我的代码的大致示例(不带轨迹栏等):

Mat img=imread(“C:\\Users\\walee\\Documents\\MATLAB\\plot\u 2.jpeg”,0);
Mat cimg,副本;
复制=img;
medianBlur(img,img,5);
GaussianBlur(img,img,大小(1,5),1.1,0);
CVT颜色(img、cimg、COLOR_GRY 2BGR);
矢量圆;
霍夫圆(img,圆,霍夫梯度,1,10,94,57,120,250);
对于(size_t i=0;i
如果所有图像具有相同的性质(黑色轴和点为圆),我建议执行以下操作:

1) 通过查找黑色元素删除axis并将其替换为背景

2) 将颜色反转为黑色背景

3) 执行形态闭合以填充圆并创建更多实心点

4) (可选)如果点的密度很高,可以尝试应用另一种形态学操作,即膨胀,以使数据圈变薄


5) 应用Hough循环

我将填充循环并尽快回复您,因为这样做很容易。(因为这是一个模拟,我可以控制我给程序的数据,所以在数据生成过程中,非填充圆只是我的懒惰)。至于反转颜色,我的印象是,对图像进行二值化使图像仅为黑白,我的假设是否错误?这是正确的-二值化使图像为黑白。我只想确保背景是黑色的,前景是白色的。我尝试了所有这些,虽然它确实改善了前几张图片的效果,但程序对更多的图片却失败了。我还想实现一种搜索算法,搜索累加器数组的完美值,以检测最佳的单个圆,但随后程序开始检测比我想要的圆小一点的圆。你能发布一些失败的示例图像吗?马克还找到了一个圆圈和一个你想得到的圆圈
Mat img = imread("C:\\Users\\walee\\Documents\\MATLAB\\plot_2 .jpeg", 0);
Mat cimg,copy;
copy = img;
medianBlur(img, img, 5);
GaussianBlur(img, img, Size(1, 5), 1.1, 0);

cvtColor(img, cimg, COLOR_GRAY2BGR);
vector<Vec3f> circles;
HoughCircles(img, circles, HOUGH_GRADIENT,1, 10, 94, 57, 120, 250);
for (size_t i = 0; i < circles.size(); i++)
{
    Vec3i c = circles[i];
    circle(cimg, Point(c[0], c[1]), c[2], Scalar(0, 0, 255), 1, LINE_AA);
    circle(cimg, Point(c[0], c[1]), 2, Scalar(0, 255, 0), 1, LINE_AA);
}
imshow("detected circles", cimg);
waitKey();
return 0;