OpenCV中的Canny边缘检测器

3

你好,我有一张红球的图片,如果使用Canny边缘检测,可以找到漂亮的边缘,但是如果我使用碗的图片,它会找到很多错误的边缘。我已经尝试使用这段代码计算最佳阈值,但它并没有起作用。如何消除碗上的线条和球上的阴影?

 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]);

Ball Bowl


碗的梯度非常陡峭,特别是在高光处。您需要找到一种方法来消除或忽略镜面效果。 - JDong
我可以使用其他的边缘检测器吗? - Brunts
你可以尝试对图像进行预处理。减少镜面反射是一种方法。然而,这需要使用不同照明条件下的多张照片。 - JDong
2个回答

1

您的对象具有非常特定的颜色,因此在这种特定情况下使用颜色信息可能是正确的方法。

将您的图像转换为HSV颜色空间:

色调通道:

enter image description here

饱和度通道:

enter image description here

价值通道:

enter image description here

请注意,在这种情况下,色相通道无法帮助我们,因为阴影和球看起来一样。然而,我们可以使用饱和度通道来查找Canny边缘:
在饱和度通道上使用Canny边缘检测器:

enter image description here

最后,我们可以过滤获取到的轮廓,只接受面积最大或大于某个阈值的轮廓。这样我们就只得到了球:

enter image description here

我还没有测试你所发布的其他图片,但我认为类似的方法也能解决问题。
希望对你有所帮助!

0
问题在于镜面反射。如果您有更多不同光照的图像,可以尝试应用镜面反射减少。否则,您可能需要为此特定照片调整代码。
我不专攻CG,但是对您有一些其他想法。请注意,高光与灰色背景的白色颜色不同。您可以利用这一点,也许应用一些滤镜或平滑处理。此外,您可以尝试在最终边缘上进行噪声降低,以去除小边缘。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接