如何使用图像处理识别 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 地图图像中的树木?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Google 的文本识别 API 检测图像中的水平线而不是块