关于在谷歌地图中识别陆地/海洋质量的技术的建议

时间:2011-02-03 09:59:35

标签: language-agnostic machine-learning computer-vision

我希望开发一些代码,通过查看从谷歌地图下载的图像,分类图像的哪个部分描绘土地,哪个部分描绘海洋。

我是计算机视觉和机器学习的新手,所以我正在寻找一些可能有用的特定技术或API的指针(我不是在寻找这个解决方案的代码)。

到目前为止,我对此有何看法:

  • 边缘检测可能没有太大帮助(单独)。虽然它给出了相当漂亮的海岸轮廓,但海面上/海面上的人工制品可能会给地面带来误报(如云,船等)。
  • 提取图像的蓝色元素可以很好地指示哪个是海洋或者不是海洋(显然,海洋的蓝色饱和度比陆地高得多)

当然,非常感谢任何帮助。

编辑(对于任何可能想要做类似事情的人):

2 个答案:

答案 0 :(得分:2)

我假设您使用的是Google地图中的卫星视图图像,否则您将无法撰写有关船舶或其他文物的文章。

正如您已经说过的那样,尝试提取蓝色图像部分可能是个好主意。 只是看看RGB图像的蓝色通道是行不通的(我只是尝试过),因为树林等不会在水面上给出一个很好的阈值。

因此,您可以尝试将图像转换为YCbCr色彩空间,并查看那里的色度通道。

这是我刚刚用谷歌地图截图制作的一个例子。我在Matlab中将它转换为YCbCr并且只是接受了Cb通道。

original screenshot

cb channel of ycbcr image

然后,您可以通过设定的阈值对此图像进行二值化,这不应该太难找到。 你可能仍然会有一些小的人工制品,你可以使用形态学操作员(打开图像几次)。 这应该删除小的人工制品,留下陆地部分和水的部分。

希望它有所帮助......如果没有,请继续问......

修改

我刚刚尝试使用matlab中的另一个屏幕截图:

  1. 将图像转换为YCbCr色彩空间
  2. 看看Cb频道
  3. 找到固定的Cb图像的阈值,或者通过在二分直方图中找到合适的阈值的Otsu方法
  4. 执行打开或其他过滤器以消除小噪音
  5. 我制作的原始图片:

    screenshot

    在Cb图像上应用阈值后: after applying threshold

    在图像上应用开口(5)后 final image

    我只是手动选择了一个阈值......通过查看哪个阈值可以更好地运行,您可能会得到更好的结果......但是正如您所看到的那样,这也应该适用于来自河流和海洋的不同颜色的水。

答案 1 :(得分:1)

您正在寻找一种分割算法,将每个像素分配给两个类别之一(陆地,海洋)。最简单的方法之一是使用阈值处理。

  1. 定义阈值t
  2. 如果pixel value> t - >指定像素到陆地
  3. 否则将像素分配给大海(通常你会有一个位图,你可以跟踪像素类)
  4. 由于这种方法效果最好,如果你能轻易区分陆地和海洋质量,我建议你比较像素的hue value(即找到蓝色和绿色之间的阈值)。