使用OpenCV Python实现边缘文本去除并为中心文本绘制边界框
问题原因
- 形态学处理参数不匹配,无法将中心文本聚合为单个连通域,同时没有过滤边缘零散文本轮廓
- 缺失边缘文本清除逻辑
- 缺少matplotlib依赖导入,且OpenCV默认BGR色彩空间直接在plt显示会偏色,循环内调用imshow会重复渲染
- 未对轮廓做位置、面积过滤,误识别边缘文本为有效目标
可运行修正代码
import cv2 import numpy as np import matplotlib.pyplot as plt # 读取图像 image = cv2.imread(r'C:\TABLEWORK\remove edged text and autoadjust bbox\3.jpg') h, w = image.shape[:2] # 定义边缘10%范围为需要清除文本的边缘区域 edge_margin = int(min(h, w) * 0.1) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) blur = cv2.GaussianBlur(gray, (9,9), 0) thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1] # 调整形态学参数,聚合中心文本区域 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (8,8)) dilate = cv2.dilate(thresh, kernel, iterations=6) kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (12,12)) dilate = cv2.morphologyEx(dilate, cv2.MORPH_OPEN, kernel) # 查找轮廓 cnts = cv2.findContours(dilate, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = cnts[0] if len(cnts) == 2 else cnts[1] # 存储中心区域有效轮廓 valid_cnts = [] for c in cnts: x,y,w_rect,h_rect = cv2.boundingRect(c) # 过滤边缘区域的轮廓,同时填充为背景色实现边缘文本去除 if x < edge_margin or y < edge_margin or x + w_rect > w - edge_margin or y + h_rect > h - edge_margin: cv2.drawContours(image, [c], -1, (255,255,255), -1) else: valid_cnts.append(c) # 取中心区域面积最大的轮廓作为目标文本块 if valid_cnts: main_cnt = max(valid_cnts, key=cv2.contourArea) x,y,w_rect,h_rect = cv2.boundingRect(main_cnt) cv2.rectangle(image, (x, y), (x + w_rect, y + h_rect), (36,255,12), 2) # 转换色彩空间后显示 plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) plt.axis('off') plt.show()
关键修改说明
- 新增了边缘范围判断逻辑,将边缘区域的文本轮廓直接填充为白色实现清除
- 调整了形态学操作的核大小和迭代次数,确保中心文本区域聚合为单个连通域
- 增加了轮廓过滤逻辑,仅保留中心区域的最大轮廓绘制边界框,避免小区域误判
- 修复了图像显示的色彩空间问题,关闭了坐标轴显示更符合视觉需求
内容的提问来源于stack exchange,提问作者Hammad Younas
相关产品推荐
相关产品推荐

