如何分割PaddleOCR检测边界框供Pytesseract逐块提取德语文本
PaddleOCR检测框裁切对接Pytesseract逐块识别方案
你已经通过PaddleOCR拿到了全量文本检测框坐标,不需要基于绘制完边界框的结果图做裁切,直接在原始加载的RGB图像上按坐标切块即可对接Pytesseract,核心逻辑和实现如下:
- 坐标转换:PaddleOCR输出的单个文本框为4个顶点的坐标列表,格式为
[[x1,y1], [x2,y2], [x3,y3], [x4,y4]],对应检测出的文本四边形四个角点。PIL图像的crop裁切方法需要传入(左边界, 上边界, 右边界, 下边界)的正矩形参数,取4个点中x坐标的最小、最大值,y坐标的最小、最大值即可得到对应裁切区域,建议额外外扩2-3像素边距,避免裁掉文本边缘导致识别错误。 - 逐块识别:裁切得到的单个文本块图像可直接传入Pytesseract,指定德语语言包即可完成识别,可根据实际识别效果对小块做灰度化、二值化预处理,进一步提升准确率。
- 倾斜场景优化:如果待识别图像的文本存在明显倾斜,正矩形裁切会带入多余背景干扰识别,可先通过透视变换将倾斜的四边形文本块拉正后再送入Pytesseract,识别率会有明显提升。
基础实现代码(适配无明显倾斜的常规场景)
在你原有代码的基础上,追加以下内容即可运行:
import pytesseract # 若tesseract未加入系统环境变量,手动取消注释并指定本地安装路径 # pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' # 裁切边距,单位:像素,避免裁断文字边缘 padding = 3 ocr_final_result = [] for single_box in boxes: # 提取框内所有点的x、y坐标 x_list = [point[0] for point in single_box] y_list = [point[1] for point in single_box] # 计算裁切矩形坐标,加上边距 left = int(min(x_list)) - padding top = int(min(y_list)) - padding right = int(max(x_list)) + padding bottom = int(max(y_list)) + padding # 修正坐标,防止越界到图像范围外 left = max(left, 0) top = max(top, 0) right = min(right, image.width) bottom = min(bottom, image.height) # 裁切出单个文本块 text_crop = image.crop((left, top, right, bottom)) # 可选:图像预处理,比如转灰度图 # text_crop = text_crop.convert('L') # 调用pytesseract识别德语文本,需提前安装tesseract德语语言包 block_text = pytesseract.image_to_string(text_crop, lang='deu').strip() ocr_final_result.append({ "bbox": single_box, "content": block_text }) # 打印所有块的识别结果 for block in ocr_final_result: print(f"检测框坐标:{block['bbox']}") print(f"识别文本:{block['content']}\n")
注意事项:运行前请确保已安装pytesseract依赖,同时将德语语言包
deu.traineddata放入tesseract安装目录的tessdata文件夹下,否则会触发语言加载错误。
内容的提问来源于stack exchange,提问作者Atef Chatty
相关产品推荐
相关产品推荐

