java - OpenCV 中的 Canny 边缘检测器

标签 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

最佳答案

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

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

色相 channel :

enter image description here

饱和 channel :

enter image description here

值(value) channel :

enter image description here

请注意,在这种情况下,Hue channel 将无济于事,因为阴影和球看起来是一样的。然而,我们可以使用饱和度 channel 来寻找精巧的边缘:

饱和 channel 上的 Canny 边缘检测器:

enter image description here

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

enter image description here

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

希望对您有所帮助!

关于java - OpenCV 中的 Canny 边缘检测器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30426388/

相关文章:

opencv - Asift 和 openCV?

python - python在重叠和旋转的瓷砖中分割图像

python - Opencv错误-输入图像的深度不受支持:

python - 尝试将灰度图像中的所有白色区域变成黑色

java - 由 : javax. persistence.PersistenceException : org. apache.cassandra.serializers.MarshalException 引起:映射值后出现意外的无关字节

java - 数据流流作业无法扩展到超过 1 个工作人员

java - 找不到处理 jacoco-maven-plugin 的市场条目

java - Java 中 OpenCV 中的 KeyPoint 和 MatchDpoint 是什么

opencv - 来自 solvePnP 的 rvec/tvec 与来自 calibrateCamera 的 rvec/tvec

java - dataSnapshot.getValue 的 Android Studio Kotlin 错误