如何使用Pytesseract为成对单词绘制单个Bounding Box?
如何用Pytesseract为连续两个单词绘制单个边界框
默认情况下,Pytesseract的image_to_data会将每个单词识别为独立文本块,因此会为每个单词单独绘制边界框。要实现将连续两个单词(比如“Bounding Box”)合并为一个边界框,可以按以下思路修改代码:
核心思路
- 过滤识别结果中的空文本项,仅保留有效单词的检测数据
- 成对遍历相邻单词,计算合并后边界框的坐标:
- 合并框左上角x取两个单词的最小
left值 - 左上角y取两个单词的最小
top值 - 右下角x取两个单词
left+width的最大值 - 右下角y取两个单词
top+height的最大值
- 合并框左上角x取两个单词的最小
- 根据计算出的坐标绘制合并后的边界框
修改后的代码
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
相关产品推荐
相关产品推荐

