费用明细表识别出来 9 列,实际只有 6 列,合并单元格被拆开,金额跑到备注列,三十行里有十一行错位。乍看像缓存或者权限的锅,追下去往往不是。
import cv2
img = cv2.imread('table.png', 0)
k = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 25))
lines = cv2.morphologyEx(255 - img, cv2.MORPH_CLOSE, k)
追下去是这么回事:表格识别依赖框线,这张表只有横线没有竖线,模型按字符间距猜列边界。合并单元格在图上跨两行,输出的 rowspan 没有被下游解析。
「表格行列结构还原」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。别只看报错的最后一行,往上看几行,真正的起因通常在上面。
具体做法是,输出改成 html 或 xlsx 结构 保留 rowspan 和 colspan;用表头行做列数基准 数量不符直接判失败;无竖线的表先做形态学加线再识别;金额列按右对齐位置重新聚列。
验收就看一点,识别结果的列数等于表头列数 金额列没有空值和串行。
