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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 21:33:10