我希望开发一些代码,能够通过查看从谷歌地图下载的图像,对图像的哪一部分描绘陆地、哪一部分描绘海洋进行分类。
我是计算机视觉和机器学习的新手,因此我正在寻找一些可能有用的特定技术或 API 的指导(我不是在寻找此解决方案的代码)。
到目前为止我有一些进展:
- 边缘检测(单独而言)可能没有多大帮助。尽管它给出了相当漂亮的海岸轮廓,但海面/海上的人工制品可能会对陆地(如云、船只等)产生误报。
- 提取图像的蓝色元素可以很好地指示哪个是海洋,哪个不是海洋(显然,海洋的蓝色饱和度比陆地高得多)
当然,我们非常感谢任何帮助。
编辑(对于任何可能想做类似事情的人):
- 使用静态谷歌地图 API 获取 map 图像(不是卫星图像) 照片,这些太多了 准确地说是噪声/伪影)。 示例网址- http://maps.google.com/maps/api/staticmap?sensor=false&size=1000x1000¢er=dover&zoom=12&style=feature:all|element:labels|visibility:off&style=feature:road|element:all|visibility:off
- 为了生成阈值图像,我使用了 Image processing lab 。我将应用归一化 RGB -> 提取蓝色 channel 滤波器,然后应用二值化 -> 大津阈值。这产生了非常有用的图像,而无需摆弄阈值(algorithm非常聪明,所以我不会混淆视听并试图解释它)
最佳答案
我假设您正在使用 Google map 上的卫星 View 图像,否则您不会写有关船舶或其他文物的文章。
正如您已经说过的,尝试提取蓝色图像部分可能是一个好主意。 仅仅查看 RGB 图像的蓝色 channel 是行不通的(我刚刚尝试过),因为树林等不会在水面上提供良好的阈值。
因此,您可以尝试将图像转换为 YCbCr 色彩空间并查看其中的色度 channel 。
这是我刚刚用谷歌地图的屏幕截图制作的示例。我在Matlab中将其转换为YCbCr,然后只取了Cb channel 。
然后,您可以通过设置良好的阈值对该图像进行二值化,这应该不难找到。 您可能仍然会有一些小的伪影,您可以使用形态运算符(多次打开图像)。 这应该会移除小的人工制品并留下陆地部分和水体部分。
希望有帮助...如果没有,请继续询问...
编辑
我刚刚在 matlab 中再次尝试使用另一个屏幕截图:
- 将图像转换为 YCbCr 色彩空间
- 看看 Cb channel
- 在 Cb 图像上查找固定阈值或通过 Otsu 方法在二部直方图中查找适当的阈值
- 执行开运算或其他滤波器来消除小噪音
我制作的原始图像:
对 Cb 图像应用阈值后:
在图像上应用开口 (5) 后
我刚刚手动选择了一个阈值...通过查看哪个阈值效果更好,您可能会得到更好的结果...但是正如您所看到的,这也应该适用于河流和海洋的不同颜色的水。
关于language-agnostic - 关于在谷歌地图中识别陆地/海洋质量的技术建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4884654/