You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Pytesseract为成对单词绘制单个Bounding Box?

如何用Pytesseract为连续两个单词绘制单个边界框

默认情况下,Pytesseract的image_to_data会将每个单词识别为独立文本块,因此会为每个单词单独绘制边界框。要实现将连续两个单词(比如“Bounding Box”)合并为一个边界框,可以按以下思路修改代码:

核心思路

  1. 过滤识别结果中的空文本项,仅保留有效单词的检测数据
  2. 成对遍历相邻单词,计算合并后边界框的坐标:
    • 合并框左上角x取两个单词的最小left值
    • 左上角y取两个单词的最小top值
    • 右下角x取两个单词left+width的最大值
    • 右下角y取两个单词top+height的最大值
  3. 根据计算出的坐标绘制合并后的边界框

修改后的代码

import pytesseract
import cv2
from pytesseract import Output

# 读取目标图像
image = cv2.imread("your_image_path.jpg")

# 获取OCR识别数据
d = pytesseract.image_to_data(image, output_type=Output.DICT)

# 筛选出包含有效文本的索引
valid_indices = [i for i, text in enumerate(d['text']) if text.strip() != '']

# 成对遍历相邻单词,绘制合并边界框
for i in range(len(valid_indices) - 1):
    idx1 = valid_indices[i]
    idx2 = valid_indices[i+1]
    
    # 获取两个单词的坐标信息
    x1, y1, w1, h1 = d['left'][idx1], d['top'][idx1], d['width'][idx1], d['height'][idx1]
    x2, y2, w2, h2 = d['left'][idx2], d['top'][idx2], d['width'][idx2], d['height'][idx2]
    
    # 计算合并后的边界框参数
    merge_x = min(x1, x2)
    merge_y = min(y1, y2)
    merge_w = max(x1 + w1, x2 + w2) - merge_x
    merge_h = max(y1 + h1, y2 + h2) - merge_y
    
    # 绘制合并边界框(红色,线宽2)
    cv2.rectangle(image, (merge_x, merge_y), (merge_x + merge_w, merge_y + merge_h), (0, 0, 255), 2)

# 可选:保留原单个单词的绿色边界框
for i in range(len(d['level'])):
    text = d['text'][i].strip()
    if text:
        x, y, w, h = d['left'][i], d['top'][i], d['width'][i], d['height'][i]
        cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)

# 展示结果
cv2.imshow("Merged Bounding Boxes", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

额外说明

  • 代码中用红色框标记合并后的双单词边界,绿色框保留原单个单词的边界(可根据需求删除该部分逻辑)
  • 若仅需针对特定单词组合(而非所有相邻单词),可在遍历前添加判断,例如检查两个单词的文本是否为'Bounding'和'Box'

内容的提问来源于stack exchange,提问作者Danish Siddique

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 06:15:14