嗨我有一个红色球的图像,如果我做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]);
答案 0 :(得分:1)
您的对象具有非常特定的颜色,因此在这种特定情况下使用颜色信息可能是正确的方法。
将图像转换为HSV色彩空间:
Hue频道:
饱和度渠道:
价值渠道:
请注意,在这种情况下,Hue通道无效,因为阴影和球看起来相同。但是,我们可以使用饱和度通道来查找精简边缘:
饱和通道上的Canny边缘检测器:
最后,我们可以过滤获得的轮廓,只接受面积最大或面积大于某个阈值的轮廓。这样我们就得到了球:
我没有测试过您发布的其他图片,但我认为类似的方法可以解决问题。
希望它有所帮助!
答案 1 :(得分:0)
问题在于镜面反射。如果您有更多具有不同光照的图像,则可以尝试应用Specular reflection reduction。否则,您可能需要根据此特定照片定制代码。
我不专注于CG,但还有其他一些想法。请注意,高光是与灰白色/灰色背景不同的白色。您可以使用此优势,也可以应用一些过滤器或平滑。此外,您可以尝试在最终边缘上降噪以移除小边缘。