如何使用图像处理识别 Google 地图图像中的树木?

Posted

技术标签:

【中文标题】如何使用图像处理识别 Google 地图图像中的树木?【英文标题】:How do I recognize trees in a Google Maps Image using image processing? 【发布时间】:2015-02-04 11:07:15 【问题描述】:

在给定静态地图图像(左图)的情况下,我试图大致找到树木覆盖的区域。

我想到的方法是对图像进行逐像素分析,最初找出“更绿”的像素(使用 HSV 配色方案来提取色调值)。

我意识到,在黎明或黄昏拍摄的某些图像中,树木实际上可能没有任何绿色,可能只是呈现出深灰色/黑色。而那些在中午拍摄的,显示为亮绿色。所以我尝试使用图像阈值并获得了不错的结果(正确的图像):

但我仍然不满意,因为建筑物的阴影,或者黑暗的物体可能会给我带来误报。

我想借鉴一些开发人员在 Stack Overflow 上的经验,并建议在这种情况下哪种图像处理工具和方法可以给我最好的结果?

【问题讨论】:

更复杂的方法倾向于使用红外通道,其中生物质发射强烈 - Google NDVI(归一化差异植被指数),但遗憾的是您没有可用的。另一个选项是纹理分析。 @MarkSetchell:有没有免费的高质量红外线地图?那时我可以完全放弃谷歌地图。 Google Map Engine 支持树过滤(我记得)。 我认为您的阈值地图看起来相当准确?如果您应用关闭运算符(扩张+侵蚀),它应该非常好(但您必须反转才能获得树掩码)。所以我希望你有不同的图像,这种方法不能很好地工作?您能否提供一系列图像(例如,光线条件较差的情况)以了解完整的任务和困难? SE 信号处理社区非常擅长回答我曾经遇到的一个图像处理问题。如果 SO 没有提供您可以使用的答案,我建议您前往那里并重新提出您的优秀问题。 【参考方案1】:

-threshold Y% 的问题在于:它会将足够暗的所有像素转换为黑色!

如果您的图片中有其他深色(深棕色、深蓝色、深红色、深灰色或黑色),您会错误地将其识别为“木头”。

如果我理解正确,您只是在寻找那些像素,它们是某种绿色或深绿色。

因此,我建议您使用以下命令的一些变体对您自己的方法进行基准测试:

compare                              \
 -size 600x600                       \
 -fuzz 30%                           \
  http://i.stack.imgur.com/kqMtt.png \
  xc:'darkgreen'                     \
  output-1.png    

您可以使用“#006400”的相应颜色值来代替“深绿色”,它是相同的:

compare                              \
 -size 600x600                       \
 -fuzz 30%                           \
  http://i.stack.imgur.com/kqMtt.png \
  xc:'#006400'                       \
  output-2.png    

上面的compare 命令从两个具有以下特征的输入图像中创建一个output-1.png

    将原始图像与动态创建的 (xc:) 600x600 像素的统一颜色“深绿色”补丁进行比较; 输出将原始图像显示为浅色背景; 输出显示红色像素,其中原始图像的各个像素在考虑 30% 的“模糊因子”后与颜色值“深绿色”不同(其中“0%”表示精确 em> 颜色值的匹配); 输出显示白色/半透明像素,其中原始图像的各个像素与颜色“深绿色”相似(模糊因子为 30%)。

这是并排比较的结果:

您当然可以使用模糊因子以及“深绿色”颜色值的精确定义。这是-fuzz 25% 的结果:

如果您希望比较显示反转颜色(红色像素显示在原始图像具有绿色的位置,透明/白色是像素非绿色的位置),请使用“深绿色”的反转颜色作为比较补丁(这是某种粉红色,顺便说一句),还有一个不同的模糊因素:

compare                              \
 -size 600x600                       \
 -fuzz 70%                           \
  http://i.stack.imgur.com/kqMtt.png \
  xc:'#ff9bff'                     \
  output-3.png    

现在的结果是:

如果您希望输出将原始图像显示为浅色背景,则将-compose src 添加到您的命令中:

compare                              \
 -size 600x600                       \
 -fuzz 70%                           \
  http://i.stack.imgur.com/kqMtt.png \
  xc:'#ff9bff'                       \
 -compose src                        \
  output-4.png    

您还可以将突出显示“delta”像素的红色更改为其他颜色。使用黑色:

compare                              \
 -highlight-color black              \
 -size 600x600                       \
 -fuzz 60%                           \
  http://i.stack.imgur.com/kqMtt.png \
  xc:'#ff9bff'                       \
 -compose src                        \
  output-5.png    

您现在可以将最后一个命令的结果用作“掩码”。将该蒙版覆盖在原始图像上,并以一种让图像的“仅树”部分出现在结果中的方式组合它们,并去掉所有其他部分。

【讨论】:

感谢您发布如此详细的答案!我打算使用 Image Magick 来完成上述任务。你能告诉我你用什么工具/语言来写上面的代码吗? @user3210476:上面的代码没有特殊的“语言”。我只使用了 ImageMagick 命令行工具compare,以及一些可用的选项。此命令可以在 Mac OSX 的 Terminal.app 内、Linux 或 Unix 上的任何终端应用程序内以及 Windows 上的 DOS box 窗口 (cmd.exe) 内运行...... 我打算给你的不仅仅是一个赞成票,呵呵!感谢您的回答,我想我找到了我正在寻找的工具。 [paintopaqueimage] (php.net/manual/en/imagick.paintopaqueimage.php) 在 Image Magick PHP 中

以上是关于如何使用图像处理识别 Google 地图图像中的树木?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Java 使用 Google Map 下载地图图像

使用 Google 的文本识别 API 检测图像中的水平线而不是块

如何将自定义图层添加到 Google 地图

将Google Map DIV转换为图像

将KMZ文件上传到我的Google地图中,并在地标描述中添加图像

为啥我在 Google 地图中使用 GroundOverlay 设置图像时会变形?