如何在 OCR 运行前修复倾斜的文档
Source: Dev.to

概览
你是否曾尝试从收据照片或扫描的合同中提取文本?如果有,你可能已经知道结果时好时坏。也许纸张倾斜、光线不均,或者图片颗粒感较强。正因为如此,你的OCR 引擎无法正确读取文字。
文档检测可以解决这些问题。它在图像中找到文档,校正其倾斜并进行清理。这让计算机更容易读取文本。
为什么 OCR 在真实图像上会失效
OCR 工具通常期望的是完美的图片。它们是在平整、光亮、正向的文字上进行训练的。用户拍摄的真实照片很少完美——用户常常以奇怪的角度拍摄账单、在凌乱的桌面上捕捉身份证,或上传纸张移动后的扫描件。将这些原始图像直接送入 OCR 工具,往往会得到混乱、缺失或顺序错误的文本。
Filestack 文档检测能够自动处理这些凌乱的输入。它找到纸张的边缘,校正角度,并清理图像,输出一张干净的图片,准备进行文本提取。
工作原理
文档检测使用两种互补的方法:
- 边缘检测 – 在图片中寻找线条和边缘。
- 机器学习模型 – 一个在数千张文档照片上训练的神经网络。
整个过程分为四个步骤:
- 使用模型创建文档的映射。
- 定位纸张的四个角点。
- 对图像进行变换,使文档填满整个画面。
- (可选)去除噪点、加深阴影、提亮高光。
三种检测模式
文档检测提供三种模式,可根据需求选择。
坐标模式
返回文档角点的坐标。
API 调用
doc_detection=coords:true
响应(JSON)
{
"coords": {
"x": 106,
"y": 464,
"width": 580,
"height": 231
}
}
当你需要绘制框、自己裁剪图像,或向其他系统提供文档位置时使用此模式。
变形模式
在不改变颜色或亮度的情况下校正图像。

API 调用
doc_detection=preprocess:false
结果是一张新图像,文档填满整个画面,保留原始的视觉特性。当你想要一张已校正的图片但计划自行进行后期处理时选择此模式。
预处理模式
同时进行变形和视觉增强(降噪、对比度提升)。

API 调用
doc_detection=preprocess:true
这是默认设置。清理步骤会降低噪点并锐化文字,非常适合 OCR 任务。
完整 API 示例
文档检测通过在处理 API的 URL 中添加参数来使用。所有请求都需要安全策略和签名。
-
获取坐标
https://cdn.filestackcontent.com/security=p:POLICY,s:SIGNATURE/doc_detection=coords:true/HANDLE -
获取变形后的图像
https://cdn.filestackcontent.com/security=p:POLICY,s:SIGNATURE/doc_detection=preprocess:false/HANDLE -
获取预处理后的图像
https://cdn.filestackcontent.com/security=p:POLICY,s:SIGNATURE/doc_detection=preprocess:true/HANDLE
与 Resize 链接使用
图像必须 ≤ 2000 × 2000 像素。对于更大的文件,可先添加 resize 步骤:
https://cdn.filestackcontent.com/security=p:POLICY,s:SIGNATURE/resize=height:1500/doc_detection=preprocess:true/HANDLE
与 OCR 链接使用
你可以直接将清理后的图像发送到 Filestack OCR:
https://cdn.filestackcontent.com/security=p:POLICY,s:SIGNATURE/doc_detection=preprocess:true/ocr/HANDLE
示例收据的 OCR 响应(摘录):
{
"text": "Manila Automated Fare\nCollection System\nRECEIPT\nTax ID:\nReceipt No:\nDate and Time:\nStation Name:\nPOS ID:\nOperator ID:\nCard ID:\nCard Name:\n004-1-231125-1134-53\n23 NOV 2025 11:34\nGil Puyat\nPOI, POS.A.02.00.03\n100108195\n6378050082232813\nStandard SVC\nAdd value\nAdd Value:\nold Remaining value:\n42.00\n100.00\nNew Remaining value:\n142.00\nAmount Payable:\n100.00\nAmount Received:\n100.00"
}