关键词:数据处理、图像处理
Mathematica教你如何处理那些非文本数据
以下范例演示如何使用图像处理功能将表的图像转换为可轻松操作的 CSV 文件。
在该表中,水平和垂直网格线比单元格的背景更暗。FindPeaks 用于查找这些网格线的位置。getGridLines 将返回包含行和列网格坐标的两个列表的列表。
getGridLines[img_, opts : OptionsPattern[]] := Block[{vals},
vals = ImageData[Binarize[img, .7], opts];
FindPeaks[1 - (Mean /@ #), 0, 0, .5][[All, 1]] & /@ {vals,
Transpose[vals]}
]
{rows, cols} = getGridLines[img, DataReversed -> True];
HighlightImage[img, {PointSize[.008], Red, Outer[List, cols, rows]}]
然后可以基于这些坐标对图像进行分割。 一旦图像被分割并进行一些小的清理,TextRecognize 就可以完成繁重的工作。
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。
首先,在继续之前导入完整数据。
现在,您可以将美国人口的第一行与原始图像进行比较。
dset[["United States"]]
ImageTake[img, 80, {1250, -1}]
看起来这里的所有数据都匹配! 要检查其余数据是否也匹配,您可以获取除第一行之外的所有列的总和,并查看它们是否匹配。
dset[[2 ;;]][Total]
事实证明他们完全匹配!
dset[["United States"]] == dset[[2 ;;]][Total]
True