我正在进行一个叶子病害分类的项目。我希望使用高效的机器学习分割算法去除整个数据集中图像的模糊背景。输出应该是ROI的彩色版本。由于数据集的体量巨大,我希望使用训练时间较短的算法。那么,您能建议我可以坚持使用的选项吗?
下面附上了数据集样本。
回答:
这个特定问题并不难解决。情况并没有那么糟糕,因为只有一个前景对象,这意味着我们可以使用简单的方法来解决它。@***的边缘检测本能是正确的,因为这是前景与模糊背景最明显的区别方式。
我将图像转换为灰度并使用了Canny边缘检测器。我并没有真正调整它,所以我们得到了很多边缘,但我们只关心找到叶子的边缘。幸运的是,我们不必花很多时间为每张图像调整它,因为我们只关心最大的连续边缘。
我扩张了图像以连接附近的边缘(Canny生成的线条宽度为1像素,容易断开),然后使用findContours获取所有白色线条的轮廓。我对轮廓进行排序,选择面积最大的轮廓,并使用它创建一个掩码。
掩码的锯齿状让我感到困扰,所以我进行了一次开运算(以切断细小的锯齿)后,再进行中值模糊(以平滑边缘)。
然后,剩下的就是使用掩码裁剪图像,完成工作。(我不得不将其更改为jpg格式以符合2MB的限制,因此这里可能会有一些压缩 artifact)。
这是代码(注意这是OpenCV 3.4版,如果你使用的是不同的大版本,那么你需要修改findContours那一行)
如果你想将其推广到包含多个前景对象,你可以按大小过滤轮廓,并拒绝小于某个阈值的轮廓。