简介:
EasyOCR 是一个开源的光学字符识别(OCR)工具库,基于深度学习技术,常用于图像文本; 支持多语言文本识别包括中文(简体 / 繁体)、英文、日文、韩文、阿拉伯文、印地文等,甚至能处理混合语言场景(如中英文混杂的图片)。
技术架构:
底层基于 PyTorch 深度学习框架
文本检测:使用 CRAFT(Character-Region Awareness For Text detection)模型,定位图像中文字的位置(生成文本框坐标)。
文本识别:采用 CRNN(Convolutional Recurrent Neural Network)等模型,将检测到的文本区域转换为可编辑的字符串。

灵活性& 易用性
提供简洁的 Python API,无需复杂配置,几行代码即可实现 OCR 功能,适合快速集成到项目中。
支持 CPU 和 GPU 运行(GPU 模式下速度提升显著),可通过参数调整平衡识别速度与准确率,也支持自定义模型适配特定场景。

安装:
需提前安装pytorch环境, pytorch有分GPU版本和CPU版本

# 需提前安装pytorch环境, pytorch有分GPU版本和CPU版本
# gpu版本又和cuda版本相关

pip install easyocr

简单使用

import easyocr

# 初始化阅读器(指定语言,如中英文)
reader = easyocr.Reader(['ch_sim', 'en'])  # 首次运行会自动下载对应语言模型

# 识别图片中的文本
img_url = "https://img-blog.csdnimg.cn/img_convert/2b98770d369ea819f2186c6857158fc2.png"
result = reader.readtext(img_url)  # 传入图片路径或 numpy 数组

# 输出结果(包含文本框坐标、识别文本、置信度)
for detection in result:
    print(detection)

这里可能会因为网络等问题,模型可能无法下载, 可以手动下载
直接手动下载: https://www.jaided.ai/easyocr/modelhub/
一个是文本检测 CRAFT (页面最下方), 另外一个文本识别(最上面)
在这里插入图片描述
在这里插入图片描述
不解压,
默认放在 C:\Users\用户名.EasyOCR\model
也可以指定位置

reader = easyocr.Reader(
    ["ch_sim", "en"],
    model_storage_directory="D:/MyWork/GitProject/MySource/ORC/.models/easy-orc-model",
) 

结果输出格式:

([[np.int32(105), np.int32(671)], [np.int32(443), np.int32(671)], [np.int32(443), np.int32(713)], [np.int32(105), np.int32(713)]], '主人间生死等等"功能众多"', np.float64(0.8553165076480224))

第一个元素是文本框的四点坐标(左上、右上、右下、左下),第二个是识别出的文字,第三个是置信度(0~1)

如何提高识别准确率:
EasyOCR 的识别效果极大依赖输入图像质量
EasyOCR 的识别效果极大依赖输入图像质量
EasyOCR 的识别效果极大依赖输入图像质量

其他方法有
1.图像预处理:灰度化(减少颜色干扰)+ 二值化(增强文字对比度)
OpenCV无法处理网络图片 所以需要读取之后处理

# 目标图片URL
img_url = "https://img-blog.csdnimg.cn/img_convert/2b98770d369ea819f2186c6857158fc2.png"


# 1. 下载网络图片(处理网络请求异常)
response = requests.get(img_url, timeout=15)  # 延长超时时间,确保下载完成
response.raise_for_status()  # 若URL无效(如404/500),直接触发异常

# 2. 将图片二进制数据转换为OpenCV可处理的格式
img_array = np.frombuffer(response.content, dtype=np.uint8)
img = cv2.imdecode(img_array, cv2.IMREAD_COLOR)  # 解码为彩色图像

# 3. 检查图片是否成功加载
if img is None:
   raise ValueError("图片解码失败,可能是图片格式损坏或URL指向的文件非图片")

# 4. 图像预处理(增强文字对比度,提升识别准确率)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转为灰度图(减少颜色干扰)

# # 二值化处理(将文字与背景强分离,适合清晰的文字图片)
# _, binary_img = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY_INV)

# 5. EasyOCR识别
reader = easyocr.Reader(
   ["en", "ch_sim"],
   gpu=False,
   model_storage_directory="D:/MyWork/GitProject/MySource/ORC/.models/easy-orc-model",
)
result = reader.readtext(gray)
    print(result)
  1. 去噪处理(针对噪点多的图像)
    方法:用高斯模糊或中值滤波去除高频噪声(保留文字边缘)
import cv2
import numpy as np

# 读取图像(灰度图)
img = cv2.imread("test.jpg", cv2.IMREAD_GRAYSCALE)
# 中值滤波去噪(适合椒盐噪声)
denoised = cv2.medianBlur(img, ksize=3)  # ksize取3/5(奇数),值多则用5
# 或高斯模糊(适合均匀噪声)
# denoised = cv2.GaussianBlur(img, (3,3), 0)
  1. 增强对比度(针对暗 / 过亮图像)
    光照不均、文字与背景对比度低(如浅色文字在浅色背景上)。
    方法:用直方图均衡化或自适应阈值增强对比度。
# 方法1:全局直方图均衡化(简单场景)
equalized = cv2.equalizeHist(denoised)
# 方法2:自适应直方图均衡化(复杂光照,保留细节)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))  # 分块处理
equalized = clahe.apply(denoised)

  1. 矫正倾斜文本(针对倾斜 / 旋转图像)
# 边缘检测(用于找文本轮廓)
edges = cv2.Canny(equalized, 50, 150)

# 霍夫变换检测直线(文本通常是水平/垂直的)
lines = cv2.HoughLinesP(edges, 1, np.pi/180, threshold=50, minLineLength=50, maxLineGap=10)

# 计算倾斜角度(取多数直线的角度)
angles = []
for line in lines:
    x1, y1, x2, y2 = line[0]
    angle = np.arctan2(y2 - y1, x2 - x1) * 180 / np.pi
    angles.append(angle)
median_angle = np.median(angles)  # 多数直线的角度即倾斜角度

# 旋转矫正
h, w = equalized.shape
M = cv2.getRotationMatrix2D((w//2, h//2), median_angle, 1.0)  # 旋转矩阵
corrected = cv2.warpAffine(equalized, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)

  1. 裁剪文本区域(去除无关背景)
# 手动裁剪(已知文字区域坐标)
# 例如:裁剪左上角(100, 50)到右下角(400, 200)的区域
cropped = corrected[50:200, 100:400]  # [y1:y2, x1:x2]

# 自动裁剪(通过轮廓检测找文字区域)
_, thresh = cv2.threshold(corrected, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 找最大轮廓(假设文字集中在一个区域)
max_contour = max(contours, key=cv2.contourArea)
x, y, w, h = cv2.boundingRect(max_contour)
cropped = corrected[y:y+h, x:x+w]
  1. 限定识别字符范围(关键优化)
    适用场景:已知文本仅包含特定字符(如数字、大写字母、符号)。
# 示例:仅识别大写字母、数字和横杠(如"E44-A")
result = reader.readtext(
    cropped,
    allowlist="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-",  # 白名单
    denylist="abcdefghijklmnopqrstuvwxyz"  # 黑名单(排除小写字母)
)

EasyOCR 对印刷体效果好,但对手写体较弱

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐