您好,我有一个红球的图像,如果我进行 Canny 边缘检测,它会找到很好的边缘,但如果我使用我的碗图像,它会发现很多坏边缘。我确实尝试使用此代码来计算最佳阈值,但 id 没有帮助。我怎样才能摆脱碗上的线条和球上的阴影?
MatOfDouble mu = new MatOfDouble();
MatOfDouble sigma = new MatOfDouble();
Core.meanStdDev(imageInMat, mu, sigma);
Mat canny = new Mat();
Imgproc.Canny(imageInMat, canny, mu.get(0,0)[0] - sigma.get(0,0)[0], mu.get(0,0)[0]+ sigma.get(0,0)[0]);
最佳答案
您的对象具有非常特定的颜色,因此在这种特定情况下使用颜色信息可能是正确的方法。
将图像转换为 HSV 颜色空间:
色相 channel :
饱和 channel :
值(value) channel :
请注意,在这种情况下,Hue channel 将无济于事,因为阴影和球看起来是一样的。然而,我们可以使用饱和度 channel 来寻找精巧的边缘:
饱和 channel 上的 Canny 边缘检测器:
最后,我们可以对得到的轮廓进行过滤,只接受面积最大或者面积大于某个阈值的轮廓。这样我们就可以拿到球了:
我没有测试您发布的其他图片,但我认为类似的方法可以解决问题。
希望对您有所帮助!
关于java - OpenCV 中的 Canny 边缘检测器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30426388/