起因
孩子期末数学卷子做完、批改完,老师要求家长带娃订正。原卷上红勾红叉、蓝笔答案、铅笔草稿混成一片,想让孩子重做一遍,得先把卷子"还原"成空白版。
家里没扫描仪,就几张开着闪光灯拍的手机照片:有阴影、有反光、有卷外桌面,纸面还发灰。
第一反应:这活儿我熟,让AI干。
#第一回合:贴图切片方案,翻车
思路是"保留原版面":用Python对6张照片做去红去蓝、提亮,再把题目切成小图往Word里拼。
结果:输出糊、歪、版式乱,题目对不齐,插图是斜的,空白留得比脸还大。来回改了三版,留下一堆 .bak 文件,最后出来的东西别说给孩子做了,我自己看着都头大。整个上午搭进去,被一句"还原的跟一坨屎一样"打回原形。
第二回合:整页图像处理,五连击翻车
换路子:不做切片,整页处理——擦掉手写、按比例平铺A4出PDF。
第一版的技术方案:
- 通道差值法去红(红笔批改)、去蓝(蓝笔答案)
- 形态学膨胀1px,吃掉笔迹的抗锯齿淡边
- 白平衡按97分位提亮纸面
自以为很顺,结果被逐条打回,问题整整五个:
1. 老师批改的红勾红叉分数没擦干净
2. 铅笔灰草稿还在,满卷灰道道
3. 卷面外拍到的桌面、阴影没裁掉
4. 原卷比例被拉伸,题目都变形了
5. 纸面不够白,灰扑扑的
第三回合:对症下药,逐条修
针对五条问题逐条上方案:
① 红笔擦不干净
问题出在阈值卡得太死。红色判定从 `r-g>25 且 r-b>25` 放宽到 `>15`,浅红印刷装饰容易误伤,但老师批改的深红勾叉能全擦掉;判定完再 MaxFilter 膨胀吃淡边。
② 铅笔灰
铅笔灰是"严格中性色":饱和度极低、灰度介于140-195之间。用 `饱和度<15 且 140<灰度<195` 圈出来,印刷字的抗锯齿淡边饱和度没那么低,能保住印刷字不秃。
③ 卷外区域
从四边逐行逐列统计暗像素占比,超过55%就整条剥掉。原理很土但管用:桌面和阴影是"大面积暗",印刷内容不会整行整列全暗。
④ 变形
先按内容像素找真实边界裁剪,再等比缩放(取最小缩放比),平铺A4、边距1.5cm,题不拉伸、不裁字。
⑤ 纸面发灰
背景归一化:用101×101局部最大亮度做除法,把拍照阴影、局部反光抹平,纸面统一拉纯白。
数据自检:6页全部过一遍像素统计,红像素0、蓝像素0,纸面纯白占比84%-92%。输出6页A4 PDF,3.9MB,看着像模像样,孩子总算有卷子可做了。
反转
晚上九点半交付完,第二天群里一个妈妈说:手机上"试卷还原"APP,拍完照点一下,五十秒出空白卷,比这干净。
下载试了。还真是。铅笔灰、阴影、红笔批改,处理得干干净净,连装订孔和印刷细节都保住了,顺便还能排版成A4直接打印。
反思
1. 规则算法打不过专训模型。 我这套"颜色阈值+形态学"本质是手工规则,遇到铅笔灰和阴影就顾此失彼:把铅笔擦掉会把印刷字淡边一起擦秃,把阴影抹平会改变局部对比度。专业APP背后是专门训练的图像修复模型,见过几百万张试卷照片,压根不是一个量级。我烧了一整天、几百积分,人家几十秒免费搞定。
2.工具选型比工具使用重要。 动手前先想清楚:这个活的"专业解法"是什么?AI不是万能的,边界内的活它干得漂亮,边界外的活硬干就是烧钱烧积分。
3. 验证方式有讲究。 肉眼看着"差不多"不算数。我后来全部用像素统计说话(逐通道统计残留红蓝像素),这步救了命——至少知道哪里没擦干净、该往哪个方向调参数,而不是凭感觉瞎改。
4. 适可而止,及时换道。第二次重做时其实就该停下来问一句"市面上有没有现成方案"。死磕到第三轮才换工具,多烧了几百积分。
这套脚本最后留档了,技术思路也整理出来了,当个反面教材挺好。但下次孩子再要还原卷子,我知道第一选择是什么了。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。