【问题标题】:Canny edge detector in OpenCVOpenCV 中的 Canny 边缘检测器
【发布时间】:2015-05-24 17:37:43
【问题描述】:

您好,我有一个红球的图像,如果我进行 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]);

【问题讨论】:

  • 碗上的渐变更陡峭,尤其是镜面高光。您必须找到一种方法来消除或忽略镜面反射效果。
  • 我可以使用其他边缘检测器吗?
  • 您可以尝试对图像进行预处理。 Specular reflection reduction is a thing。但是,这需要多张不同光照的照片。

标签: java opencv image-processing


【解决方案1】:

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

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

色调通道:

饱和通道:

价值渠道:

请注意,在这种情况下,色调通道将无济于事,因为阴影和球看起来相同。但是,我们可以使用 Saturation 通道来找到精确的边缘:

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

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

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

希望对你有帮助!

【讨论】:

    【解决方案2】:

    问题在于镜面反射。如果您有更多图像,使用不同的照明,您可以尝试应用Specular reflection reduction。否则,您可能必须针对这张特定照片调整代码。

    我不擅长 CG,但有一些其他的想法给你。请注意,高光是与灰白色/灰色背景不同的白色。您可以利用它来发挥自己的优势,并可能应用一些过滤器或平滑处理。此外,您可以尝试对最终边缘进行降噪以去除小边缘。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-16
      • 1970-01-01
      相关资源
      最近更新 更多