Mah*_*00d 6 opencv image-processing
我正在使用OpenCV(Java)处理一些叶子图像.叶子被捕获在白纸上,有些像这样的阴影:

当然,它是某种极端情况(有更温和的阴影).
现在,我想要对叶子进行阈值处理并删除阴影(同时保留叶子的细节).
我目前的流程如下:
1)转换为HSV并提取饱和度通道:
Imgproc.cvtColor(colorMat, colorMat, Imgproc.COLOR_RGB2HSV);
ArrayList<Mat> channels = new ArrayList<Mat>();
Core.split(colorMat, channels);
satImg = channels.get(1);
Run Code Online (Sandbox Code Playgroud)
2)去噪(中位数)并应用adaptiveThreshold:
Imgproc.medianBlur(satImg , satImg , 11);
Imgproc.adaptiveThreshold(satImg , satImg , 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 401, -10);
Run Code Online (Sandbox Code Playgroud)
结果如下:

它看起来不错,但阴影导致沿左边界出现一些异常.此外,我有这种感觉,我没有使用白色背景对我有利.
现在,我有两个问题:
1)如何改善结果并摆脱阴影?
2)如果不在饱和通道上工作,我能获得好的结果吗?.我问的原因是,在我的大多数图像上,使用L通道(来自HLS)可以获得更好的结果(当然除了阴影).
更新:使用Hue通道使threshdolding更好,但使阴影情况更糟:

Update2:在某些情况下,阴影比叶子更暗的假设并不总是成立.因此,处理强度无济于事.我正在寻求一种色彩通道方法.
我不使用 opencv,而是尝试使用 matlab 图像处理工具箱来提取叶子。希望 opencv 能为您提供所有的处理功能。请看下面我的结果。我在你的原始图像通道3和通道1中完成了所有操作。
首先,我使用了您的通道 3,将其阈值设置为 100(左上)。然后我删除边界上的区域和像素大小小于100的区域,填充叶子中的洞,结果显示在右上角。
接下来我使用了你的通道1,做了与我在通道3中相同的操作,结果显示在左下角。然后我找到了连接的区域(左下图中只有两个),删除面积较小的区域(右下所示)。

假设右上图像为I1,右下图像为I,通过实现提取叶子~I && I1。叶子是:

希望能帮助到你。谢谢
| 归档时间: |
|
| 查看次数: |
4040 次 |
| 最近记录: |