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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 18:06:02