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

如何检测图像中文本方向?Tesseract识别结果异常求助

文本方向检测中Rotate值不稳定的问题分析与解决

问题背景

我需要检测图像中文本的方向,共有8种不同方向的图像样本。使用pytesseract进行文本方向检测的代码如下:

import pytesseract as tess
from PIL import Image

my_image = Image.open(temp_image_path)
osd = tess.image_to_osd(my_image)
print(osd)

得到的输出示例:

Page number: 0
Orientation in degrees: 270
Rotate: 90
Orientation confidence: 2.77
Script: Cyrillic
Script confidence: 2.88

遇到的核心问题:部分垂直文本图像(样本Type II)的Rotate值有时为90,有时为270,结果不稳定;尝试过OpenCV和TensorFlow,仅能实现相似度匹配,无法有效识别文本方向差异。

原因分析

  1. Tesseract OSD的判定逻辑:Tesseract的方向检测模块(OSD)通过分析文本行朝向、字符特征判断旋转需求。对于垂直文本,若文本从上到下排列、字符朝左,会判定需Rotate 90度纠正;若文本从上到下排列、字符朝右,则判定需Rotate 270度。但部分垂直样本的字符朝向边界模糊,或存在轻微倾斜、噪点,会干扰特征识别,导致判定波动。
  2. 低置信度干扰:从输出可见Orientation confidence仅为2.77,属于低置信度结果,这种情况下Tesseract的判定极易出现摇摆,同类型样本甚至同一样本的多次检测都可能给出不同Rotate值。
  3. 脚本类型误判:输出显示判定为西里尔文(Cyrillic),若样本实际为其他脚本,或西里尔文垂直排版特征不够典型,也会影响OSD的判断准确性。

解决方法

1. 优化Tesseract的OSD参数

通过调整页面分割模式(--psm)和引擎模式(--oem),强制Tesseract专注于方向检测,提升稳定性:

osd = tess.image_to_osd(my_image, config='--psm 0 --oem 3')
  • --psm 0:仅执行方向与脚本检测,不识别文本内容
  • --oem 3:使用LSTM引擎+传统引擎混合模式,增强检测鲁棒性

2. 基于置信度的二次验证

若检测置信度低于阈值(如5.0),可对图像进行90/270旋转后,通过文本识别量验证最优旋转方向:

from pytesseract import Output

def get_stable_rotation(image):
    osd_data = tess.image_to_osd(image, output_type=Output.DICT)
    conf = osd_data['orientation_conf']
    if conf < 5.0:
        # 尝试90度旋转后检测文本量
        img_90 = image.rotate(90, expand=True)
        text_90 = tess.image_to_string(img_90)
        # 尝试270度旋转后检测文本量
        img_270 = image.rotate(270, expand=True)
        text_270 = tess.image_to_string(img_270)
        # 返回文本识别量更多的旋转方向
        return 90 if len(text_90) > len(text_270) else 270
    return osd_data['rotate']

3. 图像预处理增强特征

通过OpenCV预处理图像,减少噪点、增强文本特征,提升OSD检测的置信度:

import cv2
import numpy as np

def preprocess_image(image_path):
    img = cv2.imread(image_path)
    # 转为灰度图
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 自适应阈值降噪
    thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2)
    # 去除小噪点
    kernel = np.ones((2,2), np.uint8)
    cleaned = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
    # 转回PIL格式供Tesseract使用
    return Image.fromarray(cleaned)

4. 自定义方向分类模型

若Tesseract的OSD始终不稳定,可基于8种样本训练轻量CNN模型做方向分类:

  • 将样本标注为0°、90°、180°、270°等明确类别
  • 基于MobileNet、ResNet等模型做迁移学习,专门针对垂直文本的朝向差异做识别

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 00:55:35