如何使用Python过滤EasyOCR识别结果,删除置信度低于0.4的低概率文本
EasyOCR低置信度识别结果过滤方案
需求说明
使用EasyOCR做文本识别时,需要删除所有识别概率低于0.4的检测结果,同时支持删除检测结果中概率最低的文本条目。
依赖安装
pip install pytesseract pip install easyocr
运行命令
python main.py -i image1.jpg
代码修改说明
需要对原有代码做两处核心调整:
- 调整命令行参数
--min-conf的类型为浮点型,适配0-1范围的置信度阈值,默认值设置为0.4 - 在获取到
results识别结果后,添加过滤逻辑,先筛掉低于阈值的结果,再按需删除置信度最低的条目
修改后完整代码
# import the necessary packages from pytesseract import Output import pytesseract import argparse import cv2 from matplotlib import pyplot as plt import numpy as np import os import easyocr from PIL import ImageDraw, Image def remove_lines(image): result = image.copy() gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1] # Remove horizontal lines horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (40,1)) remove_horizontal = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, horizontal_kernel, iterations=2) cnts = cv2.findContours(remove_horizontal, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = cnts[0] if len(cnts) == 2 else cnts[1] for c in cnts: cv2.drawContours(result, [c], -1, (255,255,255), 5) # Remove vertical lines vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1,40)) remove_vertical = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, vertical_kernel, iterations=2) cnts = cv2.findContours(remove_vertical, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = cnts[0] if len(cnts) == 2 else cnts[1] for c in cnts: cv2.drawContours(result, [c], -1, (255,255,255), 5) plt.imshow(result) plt.show() return result # construct the argument parser and parse the arguments ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", required=True, help="path to input image to be OCR'd") # 此处修改:将min-conf的类型改为float,默认值设置为0.4 ap.add_argument("-c", "--min-conf", type=float, default=0.4, help="mininum confidence value to filter weak text detection") args = vars(ap.parse_args()) reader = easyocr.Reader(['ch_sim','en']) # need to run only once to load model into memory # load the input image, convert it from BGR to RGB channel ordering, # and use Tesseract to localize each area of text in the input image image = cv2.imread(args["image"]) # image = remove_lines(image) results = reader.readtext(image) ########## 新增过滤逻辑开始 ########## # 1. 过滤所有置信度低于阈值的结果 filtered_results = [item for item in results if item[2] >= args["min_conf"]] # 2. 如需删除置信度最低的条目,保留下方代码;不需要则直接注释掉即可 if len(filtered_results) >= 2: # 按置信度升序排序,弹出第一个即最低置信度的条目 filtered_results.sort(key=lambda x: x[2]) filtered_results.pop(0) # 覆盖原结果 results = filtered_results ########## 新增过滤逻辑结束 ########## print(results)
可选调整说明
如果不需要固定阈值为0.4,也可以在运行时通过参数自定义阈值,示例:
python main.py -i image1.jpg -c 0.5
内容的提问来源于stack exchange,提问作者Asp Lab
相关产品推荐
相关产品推荐

