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

如何在OpenCV-Python阈值处理时保留不同颜色的文本?

解决思路与实现方案

问题核心在于:深紫色文本直接转灰度后与深色背景的对比度极低,全局反转+OTSU阈值会将其误判为背景;自适应阈值虽能保留细节,但背景的非纯黑特性会引入大量噪点。以下是两种针对性的处理方案:

方案1:分颜色通道提取+合并文本

深紫色的蓝色分量(B通道)远高于深色背景,单独提取B通道可大幅提升文本与背景的对比度,再结合灰度图处理浅色文本,最后合并结果:

import cv2

# 读取原始图片
img = cv2.imread("your_image_path.jpg")

# 1. 处理浅色文本:灰度图+OTSU阈值
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, light_text_mask = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# 2. 处理深紫色文本:提取B通道+OTSU阈值
b_channel = img[:, :, 0]  # OpenCV采用BGR顺序,索引0对应蓝色通道
_, dark_purple_mask = cv2.threshold(b_channel, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# 3. 合并两个文本掩码(保留所有白色文本区域)
combined_mask = cv2.bitwise_or(light_text_mask, dark_purple_mask)

# 可选:反转掩码回到深色背景浅色文本的形式(如果OCR需要)
final_img = cv2.bitwise_not(combined_mask)

方案2:自适应阈值+形态学去噪

如果不想分通道处理,可先对灰度图做高斯模糊抑制噪点,再用自适应阈值,最后通过形态学操作清理残留噪点:

import cv2

img = cv2.imread("your_image_path.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 高斯模糊:降低背景噪点影响
blurred = cv2.GaussianBlur(gray, (5, 5), 0)

# 自适应阈值:采用高斯加权,适配局部亮度差异
adaptive_thresh = cv2.adaptiveThreshold(
    blurred, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2
)

# 形态学开运算:先腐蚀再膨胀,去除小噪点
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2))
cleaned_img = cv2.morphologyEx(adaptive_thresh, cv2.MORPH_OPEN, kernel)

关键说明

  • 方案1更精准,能分别最大化两种文本的对比度,适合颜色差异明显的场景;
  • 方案2操作更简洁,适合背景噪点分布均匀的情况,调整高斯模糊核大小和自适应阈值的块大小、常数参数可进一步优化效果。

内容的提问来源于stack exchange,提问作者Bryant Makes Programs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 11:40:21