一张皱试卷,逼我们把小程序裁边做到像素级

四季读书网 4 0
一张皱试卷,逼我们把小程序裁边做到像素级

一张皱试卷,逼我们把小程序裁边做到像素级-第1张图片-四季读书网

图文万匠是一个图片处理小程序:擦笔迹、画质增强、试卷转 PDF。用户上传的大多是手机拍的试卷和文档——所以我们的第一道工序,是把照片里的桌面、地砖、阴影裁掉,只留下纸张本身。不然没法识别到试卷正文内容,拍照打印出来的试卷就会有很多的黑边污渍。

这道工序上线后,满心期望收到的是更好的有效反馈,没想到收到的第一条用户反馈是:「左右裁多了,题目没了。

一张皱试卷,逼我们把小程序裁边做到像素级-第2张图片-四季读书网

模型指个大概,不可能指准

最初的方案很直接:把压缩后的照片交给视觉模型,让它返回纸张四个角的坐标,程序按坐标裁剪。真机联调第一天我们就发现,这条路到不了「像素级」——

模型定位误差天生 ±10% 起步,还常把纸面宽度少报一半(线上日志:模型说纸只有 829px 宽,实际 1353px)。更麻烦的是它输出的东西五花八门:带 ```json 围栏的、多行缩进被截断的、坐标是负数的(-40,40,意思是「纸边在照片外面」,后来我们专门做了钳边处理)。连续三个晚上,我们修的全是「怎么把模型的话翻译成可靠坐标」。

结论只有一句话:别指望模型给像素级坐标。它负责指个大概,精确对齐交给本地算法。

像素级校准:以模型矩形为起点,双向收敛

我们在裁剪前加了一步「纸边校准」:以模型矩形为起点,每次 4 像素,逐条扫描外缘线——外缘线几乎全是背景(纸色占比 ≤12%)就向内收,大面积是纸(≥60%)就向外扩,直到贴住真实纸边。同时设了安全边界:内收(裁内容)单边最多 35%,外扩(多留背景)放宽到 55%;校准结果小于原图 30% 整体回退;任何失败一律返回原图,绝不阻断主流程。

一张皱试卷,逼我们把小程序裁边做到像素级-第3张图片-四季读书网原则是:宁可多留一条桌面,绝不裁掉一块题目。

真实照片连续踩坑(修了两轮)

第一版在测试图上全对,上线就被一张皱试卷打脸:试卷铺在暖色地砖上,地砖亮度和纸面几乎一样,「亮度高 = 纸」的判据直接失灵。改成「中性色 + 亮度」双判据,并把单向修正改成双向收敛。

第二版又被生产样本教育了一轮。我们对用户原图进行观察(皱试卷、暗光卷、密集文字页),逐一分析出两类反向失效:暗光下白纸亮度只有 100~118,过不了固定阈值 120,纸被误判成背景,内收循环一路收到只剩三分之一页;密集文字页里,笔画把扫描线切碎,判据永远达不到阈值。修复方向:阈值不再写死,从每张图自己的纸面中心区推算;判据从「连续游程」改成「占比」,对笔画打断免疫。

结果:同样的试卷、同样的模型矩形,旧版复现全部生产翻车(最惨一张 1707px 的卷子只剩 582px),新版纸面内容保留 93%~100%。这些对比图都在下面简单做了分析。

一张皱试卷,逼我们把小程序裁边做到像素级-第4张图片-四季读书网

复盘数字

  • 所有生产翻车样本,全部留档做回归:旧代码必须能复现全部翻车,新代码才算修好
  • 工作分辨率收敛到 2400px、超 25MP 跳过、多图 30 秒时间预算——三道防线治好了连修三轮的内存与超时问题
  • 识别服务商已支持双家切换,任何一家故障,裁边不停摆

这个能力现在是图文万匠所有图片功能的前置工序。你在小程序里「一键擦除」「试卷转 PDF」时感觉不到它的存在。

你拍试卷也被裁掉过内容吗?评论区聊聊,翻车样本我们照单全收。

抱歉,评论功能暂时关闭!