首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >用Wolfram语言把表格图像转换为CSV格式

用Wolfram语言把表格图像转换为CSV格式

作者头像
WolframChina
发布于 2019-07-31 12:26:10
发布于 2019-07-31 12:26:10
1.4K0
举报
文章被收录于专栏:WOLFRAMWOLFRAM

关键词:数据处理、图像处理

Mathematica教你如何处理那些非文本数据

以下范例演示如何使用图像处理功能将表的图像转换为可轻松操作的 CSV 文件。

在该表中,水平和垂直网格线比单元格的背景更暗。FindPeaks 用于查找这些网格线的位置。getGridLines 将返回包含行和列网格坐标的两个列表的列表。

代码语言:javascript
复制
getGridLines[img_, opts : OptionsPattern[]] := Block[{vals},
   vals = ImageData[Binarize[img, .7], opts];
   FindPeaks[1 - (Mean /@ #), 0, 0, .5][[All, 1]] & /@ {vals, 
     Transpose[vals]}
   ]
代码语言:javascript
复制
{rows, cols} = getGridLines[img, DataReversed -> True];
HighlightImage[img, {PointSize[.008], Red, Outer[List, cols, rows]}]

然后可以基于这些坐标对图像进行分割。 一旦图像被分割并进行一些小的清理,TextRecognize 就可以完成繁重的工作。

代码语言:javascript
复制
segmentImage[img_] := Block[{i = Binarize[img], rowPairs, colPairs},
   {rowPairs, colPairs} = Partition[#, 2, 1] & /@ getGridLines[img];
   Outer[ImageTake[i, ##] &, rowPairs, colPairs, 1]
   ];
cleanUp[data_, pats_] := MapAt[StringReplace[pats], data, {All, 2 ;;}];
data = cleanUp[TextRecognize /@ segmentImage[img], {" " -> ""}];
TextGrid[data]

此数据现在可以导出为 CSV。 导入 CSV 数据时,会自动解释数字,您可以使用标头构建 Dataset。

首先,在继续之前导入完整数据。

现在,您可以将美国人口的第一行与原始图像进行比较。

代码语言:javascript
复制
dset[["United States"]]
代码语言:javascript
复制
ImageTake[img, 80, {1250, -1}]

看起来这里的所有数据都匹配! 要检查其余数据是否也匹配,您可以获取除第一行之外的所有列的总和,并查看它们是否匹配。

代码语言:javascript
复制
dset[[2 ;;]][Total]

事实证明他们完全匹配!

代码语言:javascript
复制
dset[["United States"]] == dset[[2 ;;]][Total]
True

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-10,如有侵权请联系 cloudcommunity@tencent.com 删除
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档