如何使用Python OCR工具提取图片指定区域文本而非全量文本
实现方案
推荐使用EasyOCR完成需求,该库支持多语言识别、准确率表现较好,无需复杂配置,适配银行凭证类的文本识别场景。
第一步:安装依赖库
pip install easyocr opencv-python numpy
分场景实现代码
根据你的使用场景,可选择以下两种实现方式:
场景1:同银行凭证版式固定,红圈对应区域坐标固定
同一家银行的交易凭证版式基本不会变化,你可以提前确定红圈对应区域的坐标,直接裁剪区域后识别即可,效率最高:
import cv2 import easyocr # 初始化识别器,仅识别英文和数字的话传['en']即可,有其他语言需求可追加对应语言代码 # 有GPU的话可将gpu参数设为True提升识别速度 reader = easyocr.Reader(['en'], gpu=False) # 读取目标图片 img = cv2.imread('your_image_path.jpg') # 替换为你提前确认的红圈区域坐标:x1、y1为区域左上角坐标,x2、y2为区域右下角坐标 x1, y1, x2, y2 = 100, 200, 350, 260 # 裁剪目标区域 roi = img[y1:y2, x1:x2] # detail设为0仅返回识别到的文本内容 result = reader.readtext(roi, detail=0) print("提取到的指定文本:", "".join(result))
场景2:红圈位置不固定,需要自动识别红圈区域
如果红圈标注的位置不固定,可以先通过OpenCV识别红色区域,自动裁剪对应范围后再识别:
import cv2 import numpy as np import easyocr reader = easyocr.Reader(['en'], gpu=False) img = cv2.imread('your_image_path.jpg') hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 定义红色的HSV阈值范围 lower_red1 = np.array([0, 120, 70]) upper_red1 = np.array([10, 255, 255]) lower_red2 = np.array([170, 120, 70]) upper_red2 = np.array([180, 255, 255]) mask1 = cv2.inRange(hsv, lower_red1, upper_red1) mask2 = cv2.inRange(hsv, lower_red2, upper_red2) mask = mask1 + mask2 # 查找红色区域的轮廓 contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for cnt in contours: # 过滤面积过小的噪点区域 if cv2.contourArea(cnt) < 100: continue x, y, w, h = cv2.boundingRect(cnt) # 裁剪红圈覆盖的区域,适当扩大裁剪范围避免截断文字 roi = img[y-5:y+h+5, x-5:x+w+5] result = reader.readtext(roi, detail=0) print("提取到的红圈区域文本:", "".join(result))
识别准确率优化技巧
- 识别前可以对裁剪后的区域做预处理:转灰度、高斯模糊、二值化,能大幅提升识别准确率,预处理示例代码如下:
gray_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY) blur_roi = cv2.GaussianBlur(gray_roi, (3,3), 0) _, binary_roi = cv2.threshold(blur_roi, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU) # 用处理后的binary_roi替换原roi传入识别接口即可
- 如果EasyOCR的识别准确率达不到要求,可以换用PaddleOCR,对中英文数字的识别准确率更高,更适配东南亚银行凭证的识别场景。
- 针对扫描件转换的图片,可以先做倾斜校正后再识别,避免因图片倾斜导致识别错误。
内容的提问来源于stack exchange,提问作者林抿均
相关产品推荐
相关产品推荐

