gpt4 book ai didi

opencv - 自动去除白色背景上的彩色物体阴影的方法?

转载 作者:太空宇宙 更新时间:2023-11-03 20:49:46 26 4
gpt4 key购买 nike

我正在使用 OpenCV (Java) 处理一些叶子图像。叶子被捕获在一张白纸上,有些叶子有像这样的阴影:

enter image description here

当然,这在某种程度上是极端情况(有更温和的阴影)。

现在,我想对叶子进行阈值处理并移除阴影(同时保留叶子的细节)。


我目前的流程是这样的:

1) 转换为HSV并提取饱和度 channel :

Imgproc.cvtColor(colorMat, colorMat, Imgproc.COLOR_RGB2HSV);
ArrayList<Mat> channels = new ArrayList<Mat>();
Core.split(colorMat, channels);
satImg = channels.get(1);

2) 去噪(中值)和应用自适应阈值:

Imgproc.medianBlur(satImg , satImg , 11);
Imgproc.adaptiveThreshold(satImg , satImg , 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 401, -10);

结果是这样的:

enter image description here

看起来不错,但阴影导致左侧边界出现一些异常。另外,我有这种感觉,我没有使用白色背景来为我谋利。

现在,我有两个问题:
1) 如何改善结果并去除阴影?

2) 不在饱和 channel 上工作能得到好的结果吗?。我问的原因是,在我的大多数图像上,使用 L channel (来自 HLS)会产生更好的结果(当然除了阴影)。


更新:使用Hue channel 可以使阈值更好,但阴影情况更糟:

enter image description here


更新 2:在某些情况下,阴影比叶子暗的假设并不总是成立。因此,强度训练无济于事。我更倾向于颜色 channel 方法。

最佳答案

我没有使用 opencv,而是尝试使用 matlab 图像处理工具箱来提取叶子。希望 opencv 具有适合您的所有处理功能。请在下面查看我的结果。我在你的原始图像 channel 3和 channel 1中做了所有的操作。

首先,我使用了您的 channel 3,将其设置为 100(左上)。然后我删除边界上的区域和像素大小小于100的区域,填充叶子中的孔,结果显示在右上角。

接下来我使用你的 channel 1,做了和我在 channel 3 中一样的事情,结果显示在左下角。然后找出连通区域(左下图只有两个),去掉面积小的(右下图)。

enter image description here

假设右上图是I1,右下图是I,叶子是通过工具~I && I1提取的。叶子是:

enter image description here

希望对您有所帮助。谢谢

关于opencv - 自动去除白色背景上的彩色物体阴影的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20542352/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com