比较图像和文件中的数据

时间:2013-01-27 01:17:07

标签: image algorithm image-processing

我有一个图形文件,里面有图表。例如: USA map

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

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

  3. 非常感谢任何帮助/意见/想法。

1 个答案:

答案 0 :(得分:3)

由于这对于不同的图像很难复制,因此这只是对该特定图像有效的概述。

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

enter image description here

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

enter image description here

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

您现在可以将输入图像转换为灰度以便查找文本。在这个简单的图像中,一些ad-hoc连通分量分析和简单阈值将给出所有文本:

enter image description here

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

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 *)