Java 如何在二值图像中检测圆

Java 如何在二值图像中检测圆,java,c++,opencv,image-processing,Java,C++,Opencv,Image Processing,这是原始图像: 和预处理后的图像 变灰 做精明的边缘 扩张 侵蚀 按位\u不 结果如下: MatOfPoint2f approxCurve = new MatOfPoint2f(); matOfPoint2f.fromList(contour.toList()); Imgproc.approxPolyDP(matOfPoint2f, approxCurve, Imgproc.arcLength(matOfPoint2f, true) * 0.02, true); long total =

这是原始图像:

和预处理后的图像

  • 变灰
  • 做精明的边缘
  • 扩张
  • 侵蚀
  • 按位\u不
结果如下:

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

现在我想检测上面图像中的所有填充圆,结果是 想要:

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

我试过这样的方法:

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
结果是这样的:这不是我想要的

更新:(包括更多示例图像)

更新:使用轮廓更新我的解决方案。你可以找到解决办法 在下面使用Hough圆圈


使用等高线法。 我今天又试着找到了管道的轮廓线。结果我得到了轮廓。我已经根据轮廓长度和面积过滤了结果。但您可以根据所拥有的图像应用更多约束。似乎我对这张图片的解决方案做得太过了,但这是我唯一能看到的图片。您还可以使用拉普拉斯/坎尼代替自适应阈值。希望这有帮助:)

这是我得到的结果

更新:使用轮廓更新我的解决方案。你可以找到解决办法 在下面使用Hough圆


使用等高线法。 我今天又试着找到了管道的轮廓线。结果我得到了轮廓。我已经根据轮廓长度和面积过滤了结果。但您可以根据所拥有的图像应用更多约束。似乎我对这张图片的解决方案做得太过了,但这是我唯一能看到的图片。您还可以使用拉普拉斯/坎尼代替自适应阈值。希望这有帮助:)

我得到的结果是



请记住,由于透视的原因,您实际上并不是在寻找圆。在您的“我想要什么”图像中,您标记了多个看起来不像圆的对象。而其他类似的形状没有被填充成红色。考虑使用适合你的目的的图像,更好的目的是检测和计算图像中有多少个管道?这就是问题中提到的我的解决方案,我只是看看是否有更好的解决方案可以克服我的解决方案存在的问题。你尝试过应用Hough圆变换吗?@TiagoCunha是的,我尝试过,结果甚至不是上面的图像。请记住,由于透视的原因,你实际上不是在寻找圆。在您的“我想要什么”图像中,您标记了多个看起来不像圆的对象。而其他类似的形状没有被填充成红色。考虑使用适合你的目的的图像,更好的目的是检测和计算图像中有多少个管道?这就是问题中提到的我的解决方案,我只是看看是否有更好的解决方案可以克服我的解决方案存在的问题。你尝试过应用Hough圆变换吗?@TiagoCunha是的,我尝试过,结果甚至不是上面的图像。谢谢先生的回答!在我收到你的回复之前,我还尝试了hough圆,它给出的结果与你的测试结果类似,但有两个问题。第一个问题非常缓慢,不利于实时,第二个问题与情况有关,例如:当我给出另一幅图像时,它将无法很好地工作,因此我寻找可用于检测自身轮廓中的椭圆或圆的算法,可能比hough圆快得多。无论如何,你的答案是好的。放弃投票!!欢迎使用,请尽量减小图像大小以提高速度。但这确实会导致一些信息丢失。好吧,找到的恐龙也会有帮助。祝你好运。我会看看我是否尝试findcontour并在稍后的文章中发布另一个答案day@BahramdunAdil有可能找到一种自动调整管道的方法,其中包含hough圆。您可能需要提供一些与您所提供的不同的样本,以便让人们考虑数据的可能变化。我已经用轮廓更新了解决方案。看一看。我没有考虑速度,我认为你有更好的位置来判断它。@ M3H0W + 1同意你。谢谢先生的答复!在我收到你的回复之前,我还尝试了hough圆,它给出的结果与你的测试结果类似,但有两个问题。第一个问题非常缓慢,不利于实时,第二个问题与情况有关,例如:当我给出另一幅图像时,它将无法很好地工作,因此我寻找可用于检测自身轮廓中的椭圆或圆的算法,可能比hough圆快得多。无论如何,你的答案是好的。放弃投票!!欢迎使用,请尽量减小图像大小以提高速度。但这确实会导致一些信息丢失。好吧,找到的恐龙也会有帮助。祝你好运。我会看看我是否尝试findcontour并在稍后的文章中发布另一个答案day@BahramdunAdil有可能找到一种自动调整管道的方法,其中包含hough圆。您可能需要提供一些与您所提供的不同的样本,以便让人们考虑数据的可能变化。我已经用轮廓更新了解决方案。看一看。我没有考虑速度,我认为你有更好的位置来判断它。@ M3H0W + 1同意你的观点。