使用Python,Tesseract更正文本方向

2023-11-08

这篇博客将介绍如何使用 Tesseract 的方向和脚本检测 (OSD) 模式执行自动文本方向检测和更正。

orientation and script detection (OSD) 方向和脚本检测
text orientation 文本定向

OSD模式检测并提供了图像中文本的方向,估计的旋转校正角度和脚本/书写系统。文本方向是指图像中文本的角度(以度为单位)。执行 OCR 时可以通过校正文本方向来获得更高的准确性。另一方面,脚本检测是指文本的书写系统,可以是拉丁语,汉字,阿拉伯语,希伯来语等。

任何 OCR 系统的一个基本组件都是图像预处理 ——呈现给OCR引擎的输入图像质量越高,OCR 输出就越好。要在 OCR 中取得成功,最重要的预处理步骤是文本方向。

1. 效果图

原图 VS 旋转校正后图如下:
可以看到文本正确识别,并且当前文本旋转了90°,需要旋转270°进行校正,文本的语言类型是Latin文。下图也可以看到文本方向被正常校正。
在这里插入图片描述

在这里插入图片描述

效果图2如下:
可以看到文本正确识别,当前文本旋转了180°,需要旋转180°进行校正,文本的语言类型是Latin文。下图也可以看到文本方向被正常校正。
在这里插入图片描述

效果图3如下:对于旋转非90°或者90°倍数的识别有问题,如下图所示;

在这里插入图片描述

2. 原理

文本方向是指图像中一段文本的旋转角度。如果文本明显旋转,则给定的单词、句子或段落在 OCR 引擎中看起来就像胡言乱语。OCR引擎是智能的,但像人类一样,它们没有被训练成倒置阅读!

因此为 OCR 准备图像数据的关键第一步是检测文本方向(如果有),然后更正文本方向。 将校正后的图像呈现到 OCR 引擎(理想情况下可以获得更高的 OCR 准确性)。

2.1 步骤

  1. 方向和脚本检测 (OSD) 的概念
  2. 如何使用 Tesseract 检测文本脚本(即书写系统)
  3. 如何使用 Tesseract 检测文本方向
  4. 如何使用 OpenCV 自动更正文本方向
pip install opencv-contrib-python

2.2 什么是方向和脚本检测?

Tesseract 有几种不同的模式,可以在自动检测和 OCR 文本时使用。其中一些模式对输入图像执行完整的OCR,而其他模式则输出元数据,例如文本信息,方向等(即orientation and script detection OSD模式)。
Tesseract的OSD模式的输出返回两个值:

  • 文本方向:输入图像中文本的估计旋转角度(以度为单位)。
  • 脚本:图像中文本的预测“书写系统”。

书写系统是一种传达信息的视觉方法,但与语音不同,书写系统还包括“存储”和“知识转移”的概念。

3. 源码

# 使用 Tesseract 检测和更正文本方向(检测到文本角度,旋转以转回去的角度,文本系统语言)
# 识别字母
# tesseract E:\mat\py-demo-22\extreme_points\images\normal.jpg E:\mat\py-demo-22\extreme_points\images\normal txt
# 识别osd
# tesseract E:\mat\py-demo-22\extreme_points\images\normal.jpg E:\mat\py-demo-22\extreme_points\images\normal_1 -l osd --psm 0
# USAGE
# python detect_orientation.py --image images/normal.jpg
# python detect_orientation.py --image images/rotated60.jpg
# python detect_orientation.py --image images/rotated180.jpg
# python detect_orientation.py --image images/rotated90.jpg
# python detect_orientation.py --image images/rotated120.jpg

# 导入必要的包
# coding = utf -8
import argparse
import os

import cv2
import imutils
import pytesseract
from PIL import Image
import numpy as np
from pytesseract import Output  # PyTesseract 的输出类 (https://github.com/madmaze/pytesseract)。这个类只是指定了四种数据类型,包括将利用的DICT。

# 语言文件.traindata
os.environ['TESSDATA_PREFIX'] = 'D:\\tesseract\\tessdata'  # 在PATH中配置tesseract环境变量或者此处指定

# 如果未在PATH中配置tesseract环境变量,则需要手动设置tesseract可执行文件的全路径
pytesseract.pytesseract.tesseract_cmd = r'D:\\tesseract\\tesseract.exe'  # 手动设置另一个版本的pytesseract

# 构建命令行参数及解析
# --image 要ocr的图像
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=False, default="images/normal.jpg",
                help="path to input image to be OCR'd")
args = vars(ap.parse_args())

# 加载输入图像,转换BGR为RGB通道使得其与tesseract兼容
# 调用Tesseract执行文本定向
image = cv2.imread(args["image"])
if image is None:
    raise Exception(args["image"] + (" image not exists"))
img = image.copy()

# 打印pytesseract支持的所有语言
print('langs: ', pytesseract.get_languages(config=''))

print(pytesseract.image_to_string(img))
# OR explicit beforehand converting
print(pytesseract.image_to_string(Image.fromarray(img)))

# 简单的图像串
print(pytesseract.image_to_string(Image.open(args["image"])))
print(pytesseract.image_to_string(args["image"]))
# 法语文本图像串
print(pytesseract.image_to_string(Image.open(args["image"]),
                                  lang='fra'))  # 需要D:/Tesseract-OCR/tessdata/fra.traineddata

# 获取详细的数据,包括盒,置信线和页码
print(pytesseract.image_to_data(Image.open(args["image"])))
# 获取有关方向和脚本检测信息
# print(pytesseract.image_to_osd(Image.open(args["image"])))
print('image_to_osd: ', pytesseract.image_to_osd(args["image"]))
# 获取包围盒估计
# print(pytesseract.image_to_boxes(Image.open(args["image"])))
print('image_to_boxes: ', pytesseract.image_to_boxes(args["image"]))

rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
results = pytesseract.image_to_string(rgb)
print(results)
results = pytesseract.image_to_osd(args["image"], output_type=Output.DICT, config="--dpi 70")

# 展示定向信息
# 当前方向
# 旋转图像以校正其方向的度数
# 检测到的脚本类型,如拉丁语或阿拉伯语
print("[INFO] detected orientation: {}".format(
    results["orientation"]))
print("[INFO] rotate by {} degrees to correct".format(
    results["rotate"]))
print("[INFO] detected script: {}".format(results["script"]))

def rotate_bound(image, angle):
    # grab the dimensions of the image and then determine the
    # center
    (h, w) = image.shape[:2]
    (cX, cY) = (w / 2, h / 2)

    # grab the rotation matrix (applying the negative of the
    # angle to rotate clockwise), then grab the sine and cosine
    # (i.e., the rotation components of the matrix)
    M = cv2.getRotationMatrix2D((cX, cY), -angle, 1.0)
    cos = np.abs(M[0, 0])
    sin = np.abs(M[0, 1])

    # compute the new bounding dimensions of the image
    nW = int((h * sin) + (w * cos))
    nH = int((h * cos) + (w * sin))

    # adjust the rotation matrix to take into account translation
    M[0, 2] += (nW / 2) - cX
    M[1, 2] += (nH / 2) - cY

    # perform the actual rotation and return the image
    return cv2.warpAffine(image, M, (nW, nH), borderValue=(255, 255, 255))

def getImg(img, angel,ls):
    print(angel+ls)
    rotated = rotate_bound(img, angle=angel+ls)
    return imutils.resize(rotated, width=300)

# 旋转图像以校正方向
# 使用OpenCV的通用cv2.rotate方法,部分图像可能会丢失
# imutils.rotate_bound 不丢失保留边界的旋转图像
rotated = rotate_bound(img, angle=results["rotate"])

# 展示原始图像和校正后的图像
cv2.imshow("Original", imutils.resize(img, width=300))
cv2.imshow("Output", imutils.resize(rotated,width=300))

for i in range(0,361,30):
    cv2.imshow("Output"+str(results["rotate"]+i), getImg(img,results["rotate"],i))
cv2.waitKey(0)

参考

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Python,Tesseract更正文本方向 的相关文章

随机推荐

  • java解析json获取天气预报城市代码_利用json获取天气信息

    天气预报信息获取是利用json获取的 网上有非常多资源 源码 因为上面涉及到非常多天气信息 包含湿度 出行建议等 以及加入了全部城市代码的资源包 为了练手了解json的原理 我仅获取诚笃城市的最高温 最低温 城市名字 我的布局是通过一个bu
  • vue-cli3+ant-design-vue+typescript 注意事项

    项目参考vue cli3 web init ant design配置部分 1 实现ant disign vue的按需加载方案 1 引入所有的组件 然后加载到vue上面 components ant 2 对Ant Design Vue进行文件
  • unique_ptr的使用和陷阱

    转自 https blog csdn net qq 33266987 article details 78784286 unique ptr的使用 分配内存 与shared ptr不同 unique ptr没有定义类似make shared
  • JavaScript基础Day06:内置对象

    JavaScript基础Day06 内置对象 文章目录 JavaScript基础Day06 内置对象 如何学习一个方法 一 Math对象 二 Date对象 三 String对象 四 Array对象 五 基本包装类型 JavaScript中的
  • 【Docker】docker设置固定ip地址

    1 美图 2 概述 docker设置固定ip地址 Docker安装后 默认会创建下面三种网络类型 docker network ls NETWORK ID NAME DRIVER SCOPE 9781b1f585ae bridge brid
  • vue设置页面滚动高度_vue中获取滚动高度或指定滚动到某位置

    1 点击某个标签 滚动到某个具体位置 switchHeight num this selectNum num if num 0 document getElementById identifer one scrollIntoView els
  • Verilog测试(仿真)文件TestBench如何编写

    一 哪些步骤需要进行仿真 下图是FPGA开发的整个流程 先看一下仿真都出现在哪里 流程图中绿色的步骤是要进行测试仿真的 即有三个步骤是要进行仿真操作的 有时会省略 综合后仿真 这一步 1 RTL仿真 也称为综合前仿真 前仿真和功能仿真 这一
  • 【正点原子STM32连载】第二十一章 高级定时器输出指定个数PWM实验 摘自【正点原子】APM32F407最小系统板使用指南

    1 实验平台 正点原子stm32f103战舰开发板V4 2 平台购买地址 https detail tmall com item htm id 609294757420 3 全套实验源码 手册 视频下载地址 http www openedv
  • 大端对齐和小端对齐

    其实大端对齐和小端对齐 迷惑的原因无非是名字问题 这里为了方便记忆 我们可以将big endian little endian 翻译成大尾端对齐和小尾端对齐 大尾端对齐是网络字节序对齐的一种方式 int i 0x12345678 char
  • 快速解决 pnpm : 无法将“pnpm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再 试一次。

    pnpm 无法将 pnpm 项识别为 cmdlet 函数 脚本文件或可运行程序的名称 请检查名称的拼写 如果包括路径 请确保路径正确 然后再 试一次 所在位置 行 1 字符 1 运行 npm install pnpm g 后 启动项目报错
  • driver +Chrome+proxy

    from selenium import webdriver import time from selenium webdriver common by import By from selenium webdriver chrome op
  • C语言基础知识

    文章目录 基本数据类型 浮点数比较 常用math函数 循环结构 数组 结构体 字符串 基本数据类型 整型int 一个整数占用32位 bit 即4字节 Byte 取值范围 231 231 1 即绝对值109以内整数 长整型long long
  • react实现按需加载的3种方法

    react实现按需加载的3种方法 1 精确加载组件 import Button from antd lib button import antd lib button style 2 暴露配置 配合babel plugin import插件
  • 不要只满足于写业务逻辑

    最近在知乎上 看到三个程序员失业 当然 失业是正常的 我自己就失业多次 他们的共同点 是只会写业务逻辑 其中有一个是工作八年的 创业公司失败的 我觉得他找工作应该好找 如果我8年全职经验 可以横着走了 让我惊讶的是 他说一年的工作经验用了八
  • HardFault排查

    HardFault排查 背景知识简介 发生中断时处理器的行为 HardFault错误信息的挖掘 编译器通过栈来实现函数调用 对信息的继续挖掘 通用寄存器 特殊功能寄存器 SCB寄存器 附录一 Hardfault Handler示例代码 附录
  • 矩阵的转置

    稀疏矩阵 当一个矩阵中的很多元素都是零 而且非零元素的分布没有规律时 该矩阵称为稀疏矩阵 稀疏矩阵的压缩存储方法 从稀疏矩阵的概念 我们可以知道 稀疏矩阵的大多元素都是零 所以 我们只需要存储非零元素即可 这时 我们引入三元组表的概念 三元
  • redis数据类型List的安全队列和不安全队列

    在学习RPOPLPUSH命令的时候 官方文档中有提到安全队列和不安全的队列 一开始没有看懂 现在理解了做个笔记 一般情况下 我们可以借助List来实现消息队列 比如一个客户端通过命令LPUSH BLPUSH 把消息入队 另一个客户端通过命令
  • C语言 指针初阶

    头文件 define CRT SECURE NO WARNINGS 1 include
  • python爬虫七:图新验证码的识别

    1 Tesseract安装与简介 阻碍我们爬虫的 有时候正是在登录或者请求一些数据时候的图形验证码 因此这里我们讲解一种能将图片翻译成文字的技术 将图片翻译成文字一般被称为光学文字识别 Optical Character Recogniti
  • 使用Python,Tesseract更正文本方向

    这篇博客将介绍如何使用 Tesseract 的方向和脚本检测 OSD 模式执行自动文本方向检测和更正 orientation and script detection OSD 方向和脚本检测 text orientation 文本定向 OS