如何在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
相关产品推荐
相关产品推荐

