EasyOrc初识
支持多语言文本识别包括中文(简体 / 繁体)、英文、日文、韩文、阿拉伯文、印地文等,甚至能处理混合语言场景(如中英文混杂的图片)。文本检测:使用 CRAFT(Character-Region Awareness For Text detection)模型,定位图像中文字的位置(生成文本框坐标)。第一个元素是文本框的四点坐标(左上、右上、右下、左下),第二个是识别出的文字,第三个是置信度(0~1)直
简介:
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)
- 去噪处理(针对噪点多的图像)
方法:用高斯模糊或中值滤波去除高频噪声(保留文字边缘)
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:全局直方图均衡化(简单场景)
equalized = cv2.equalizeHist(denoised)
# 方法2:自适应直方图均衡化(复杂光照,保留细节)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) # 分块处理
equalized = clahe.apply(denoised)
- 矫正倾斜文本(针对倾斜 / 旋转图像)
# 边缘检测(用于找文本轮廓)
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)
- 裁剪文本区域(去除无关背景)
# 手动裁剪(已知文字区域坐标)
# 例如:裁剪左上角(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]
- 限定识别字符范围(关键优化)
适用场景:已知文本仅包含特定字符(如数字、大写字母、符号)。
# 示例:仅识别大写字母、数字和横杠(如"E44-A")
result = reader.readtext(
cropped,
allowlist="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-", # 白名单
denylist="abcdefghijklmnopqrstuvwxyz" # 黑名单(排除小写字母)
)
EasyOCR 对印刷体效果好,但对手写体较弱
更多推荐
所有评论(0)