You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python图像检测与旋转实现:PDF发票OCR预处理问题咨询

嘿,这个场景我处理发票OCR的时候真的碰到过!旋转的页面绝对是OCR准确率的杀手,分享几个我亲测好用的解决方案:

1. 用OCR引擎自带的旋转检测(最省心的方案)

像Tesseract这类主流OCR工具,本身就内置了文本方向检测的能力,完全不用自己从零造轮子。它能直接识别页面的旋转角度,你只要根据结果校正图像就行。

比如用Python的pytesseract库实现:

import pytesseract
from PIL import Image

# 加载单页图像
page_image = Image.open("rotated_invoice_page.png")

# 调用Tesseract的OSD(方向和脚本检测)功能
osd_result = pytesseract.image_to_osd(page_image)

# 从返回结果里提取旋转角度(找包含"Rotate:"的行)
rotate_angle = int([line.split(":")[1].strip() for line in osd_result.split("\n") if "Rotate" in line][0])

# 校正旋转:如果角度不为0,就反向旋转回去
if rotate_angle != 0:
    corrected_image = page_image.rotate(-rotate_angle, expand=True)
    # 用校正后的图像执行OCR
    ocr_text = pytesseract.image_to_string(corrected_image)

如果是命令行使用Tesseract,直接加--psm 0参数就能先输出旋转信息,再手动校正图像。

2. 基于图像特征的检测(应对OCR检测失效的极端情况)

如果某些页面文本极少(比如只有logo或少量数字),O引擎可能检测不准,这时候可以用OpenCV的图像分析工具,通过检测文本行的方向来判断旋转角度:

import cv2
import numpy as np

# 加载图像并转灰度
image = cv2.imread("rotated_invoice_page.png")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 边缘检测+霍夫直线变换,提取文本行的角度
edges = cv2.Canny(gray, 50, 150, apertureSize=3)
lines = cv2.HoughLines(edges, 1, np.pi/180, 200)

# 统计所有直线的角度分布
angles = []
for line in lines:
    rho, theta = line[0]
    angle = theta * 180 / np.pi
    # 把角度归一到0-90度范围
    angle = angle if angle <= 90 else angle - 90
    angles.append(angle)

# 找出现频率最高的角度,就是文本的倾斜方向
most_common_angle = np.bincount(np.round(angles).astype(int)).argmax()

# 根据角度校正:如果接近90度,说明是旋转了90度
if most_common_angle > 45:
    corrected_image = cv2.rotate(image, cv2.ROTATE_90_COUNTERCLOCKWISE)
elif most_common_angle > 0:
    corrected_image = cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE)

这个方法适合文本行较多的页面,空白页或极简页面效果会打折扣。

3. 批量处理的小技巧

因为你是处理多页PDF,建议先把PDF每页转成图像(用pdf2image库),再对每个图像页单独执行旋转检测和校正,最后统一做OCR:

from pdf2image import convert_from_path

# 把PDF转成图像列表(dpi设300保证OCR精度)
pdf_pages = convert_from_path("multi_page_invoice.pdf", dpi=300)

for idx, page in enumerate(pdf_pages):
    # 对当前页执行上述旋转检测+校正逻辑
    # 校正后直接OCR,或者保存为图像备用
    pass

4. 最后加一步验证

校正后可以简单验证下:比如提取一段文本,检查是否是正常可读的(没有上下颠倒的单词),或者统计文本行的方向是否水平。如果遇到极端奇葩的页面,再手动调整就行(这种情况其实很少)。

内容的提问来源于stack exchange,提问作者Developer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:32:32