如何用OpenCV从灰色背景图像提取白色文字并粘贴至另一图像
提取灰色背景中的白色文字并粘贴到目标图像的方法
问题原因
你原来的代码通过固定阈值im1r_title < [100,100,100]区分背景和文字,仅适用于黑色背景(背景像素远低于100)。灰色背景的像素值通常高于100,会被误判为文字区域,导致粘贴逻辑失效。解决核心是先提取白色文字的精确掩码,再基于掩码完成粘贴。
实现代码
import cv2 import numpy as np import matplotlib.pyplot as plt image_msg = (30, 209, 187, 31) # (x起始, y起始, 宽度, 高度) base_path="/Users/images/" mask_image1 = f"{base_path}show_image_2.PNG" image_1_title = f"{base_path}show_image_2_logo.PNG" # 读取目标图像和灰色背景的文字图 img = cv2.imread(mask_image1) img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 转为RGB格式适配plt显示 text_img = cv2.imread(image_1_title) text_img = cv2.cvtColor(text_img, cv2.COLOR_BGR2RGB) # 调整文字图尺寸到目标区域大小 resized_text = cv2.resize(text_img, (image_msg[2], image_msg[3])) # -------------------------- 关键:提取白色文字掩码 -------------------------- # 转为灰度图 gray_text = cv2.cvtColor(resized_text, cv2.COLOR_RGB2GRAY) # 二值化:白色文字(灰度接近255)设为255,灰色背景设为0 # 这里阈值可根据实际灰色背景调整,比如灰色背景偏亮可适当降低阈值 _, text_mask = cv2.threshold(gray_text, 200, 255, cv2.THRESH_BINARY) # 扩展为3通道,和RGB图像匹配 text_mask_3ch = np.repeat(text_mask[:, :, np.newaxis], 3, axis=2) # -------------------------- 基于掩码粘贴文字 -------------------------- # 获取目标区域 target_area = img[image_msg[1]:image_msg[1]+image_msg[3], image_msg[0]:image_msg[0]+image_msg[2]] # 掩码为255的区域用文字图像素,否则保留原目标区域像素 target_area = np.where(text_mask_3ch == 255, resized_text, target_area) # 替换回原图像 img[image_msg[1]:image_msg[1]+image_msg[3], image_msg[0]:image_msg[0]+image_msg[2]] = target_area # 显示结果 plt.imshow(img) plt.axis('off') plt.show()
关键说明
- 阈值调整:
cv2.threshold中的200是可调整的阈值,根据你的灰色背景实际亮度修改——如果背景偏亮(接近200),可以适当降低阈值;如果背景偏暗,提高阈值,确保只有白色文字被识别为255。 - 掩码作用:掩码精准标记了文字区域,避免了灰色背景被误判,确保只有文字部分覆盖到目标图像上。
- 颜色空间统一:全程使用RGB格式适配matplotlib显示,若最终需要保存为BGR格式(OpenCV默认),可在保存前用
cv2.cvtColor(img, cv2.COLOR_RGB2BGR)转换。
内容的提问来源于stack exchange,提问作者Explorer
相关产品推荐
相关产品推荐

