2

我有一个带有图形的图像文件。例如: 美国地图

  1. 如何有效地提取此图?你能给我一些例子/概念吗?

  2. 我有一个包含边缘细节的数据文件,我可以将它们绘制在地图上以创建图像(如链接中显示的图像),但背景不同。我如何比较两者并说存在匹配/不匹配?

非常感谢任何帮助/评论/想法。

4

1 回答 1

3

由于这很难针对不同的图像进行复制,因此这只是对适用于该特定图像的一些东西的概述。

首先将您的图像转换为 CMYK 并考虑将第三个通道 ('Y') 进行二值化(最大值的 80%,您的顶点是相对黄色的)以找到顶点:

在此处输入图像描述

现在考虑对第二个通道('M')进行二值化(再次为最大值的 80%)以找到边缘:

在此处输入图像描述

现在,如果您将每个顶点视为连接组件,并将每个边也视为连接组件,那么您可以简单地通过同时考虑两个图像并考虑给定顶点接触哪些边来构建图形。

您现在可以将输入图像转换为灰度以查找文本。在这个简单的图像中,一些特别的连接组件分析和简单的阈值将给出所有文本:

在此处输入图像描述

如果我在最后一张图片上运行一些非常基本的文本识别,我会得到:

Seattle
Chicago
Bay Area DC Metro NYC
Denver
Los
Angeles
Phoenix

这非常好,因为它找到了所有文本。剩下的就是为已经构建的图中的顶点命名。为此,请考虑文本块出现的位置并继续找到最近的边缘(第一张图像,到质心的欧几里德距离)。

如果重要的话,这里是获得这些结果的代码:

f = Import["http://i.stack.imgur.com/DP3la.png"]
cmyk = ColorSeparate[f, "CMYK"]
vertex = Binarize[cmyk[[3]], 0.8]   (* The first image *)
edge = Binarize[cmyk[[2]], 0.8]     (* The second image *)
nyctext = SelectComponents[
  DeleteSmallComponents[
   SelectComponents[Binarize[ColorConvert[f, "Grayscale"], 0.01], 
    Small]], "Length", #1 < 25 &]
alltext = ImageAdd[
  SelectComponents[
   ColorNegate[Binarize[ColorConvert[f, "Grayscale"], 0.5]], Small], 
    nyc_text]                       (* The last image *)
TextRecognize[alltext]              (* The text recognized *)
于 2013-01-27T02:23:29.077 回答