OpenCV中的Canny边缘检测器

时间:2015-05-24 17:37:43

标签: java opencv image-processing

嗨我有一个红色球的图像,如果我做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]);

Ball Bowl

2 个答案:

答案 0 :(得分:1)

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

将图像转换为HSV色彩空间:

Hue频道:

enter image description here

饱和度渠道:

enter image description here

价值渠道:

enter image description here

请注意,在这种情况下,Hue通道无效,因为阴影和球看起来相同。但是,我们可以使用饱和度通道来查找精简边缘:

饱和通道上的Canny边缘检测器:

enter image description here

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

enter image description here

我没有测试过您发布的其他图片,但我认为类似的方法可以解决问题。

希望它有所帮助!

答案 1 :(得分:0)

问题在于镜面反射。如果您有更多具有不同光照的图像,则可以尝试应用Specular reflection reduction。否则,您可能需要根据此特定照片定制代码。

我不专注于CG,但还有其他一些想法。请注意,高光是与灰白色/灰色背景不同的白色。您可以使用此优势,也可以应用一些过滤器或平滑。此外,您可以尝试在最终边缘上降噪以移除小边缘。