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

如何用OpenCV为图像中所有文字及背景添加红色轮廓?

解决文字轮廓检测问题

问题根源

原代码的核心问题在于:

  • 阈值方向错误:使用THRESH_BINARY保留了浅色的星星区域,深色文字被转为黑色,无法被轮廓检测识别
  • 形态学操作无效:(1,1)的卷积核没有起到降噪或连接文字笔画的作用
  • 固定阈值适配性差:216的高阈值过滤掉了部分文字细节

修改后的代码

import cv2 as cv
import numpy as np

# 读取图像
image = cv.imread("input1.jpg")
img_gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)

# 高斯降噪
img_denoised = cv.GaussianBlur(img_gray, (5,5), 2)

# 改用自适应阈值,适配复杂背景的文字提取
thresh = cv.adaptiveThreshold(img_denoised, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, 
                              cv.THRESH_BINARY_INV, 11, 2)

# 用闭操作连接文字笔画、填充小空洞
kernel = np.ones((2,2), np.uint8)
closing = cv.morphologyEx(thresh, cv.MORPH_CLOSE, kernel)

# 检测最外层轮廓
contours, hierarchy = cv.findContours(closing, mode=cv.RETR_EXTERNAL, method=cv.CHAIN_APPROX_SIMPLE)

# 过滤噪声轮廓,绘制文字轮廓
for cnt in contours:
    if cv.contourArea(cnt) > 20:  # 根据实际图像调整面积阈值
        cv.drawContours(image, [cnt], -1, (0, 0, 255), 2)

# 显示结果
cv.imshow("Text Contours", image)
cv.waitKey(0)
cv.destroyAllWindows()

关键修改说明

  • 自适应阈值:结合THRESH_BINARY_INV将深色文字转为白色区域,局部阈值调整能适配不同区域的明暗差异
  • 形态学闭操作:(2,2)卷积核先膨胀后腐蚀,修复文字笔画断裂,同时过滤小噪声
  • 轮廓过滤:通过面积筛选排除细小噪声,只保留文字轮廓
  • 轮廓检测模式:RETR_EXTERNAL只提取最外层轮廓,减少冗余计算

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 08:40:43