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

OpenCV技术实现:如何将图片中的文字复制叠加到另一张图片

提取黑底白字并叠加到目标图片的解决方案

问题描述

我有一张仅包含白色文字的黑底图片,想把文字复制到另一张图片里。现在用截图叠加的方式,会把黑色背景也一起叠加上,请问怎么去掉黑框,或者只提取黑背景里的文字再叠加到目标图片?

相关图片

黑底白字的文字素材图
需要叠加文字的目标图片
当前叠加后带黑框的效果

当前实现代码

image_2_replace = cv2.imread(mask_image2)
im2r = cv2.cvtColor(image_2_replace, cv2.COLOR_BGR2RGB)

image_2_title_img = cv2.imread(image_2_title)
image_2_titl_img = cv2.cvtColor(image_2_title_img, cv2.COLOR_BGR2RGB)

im2r_title = cv2.resize(image_2_titl_img, (left_image_msg[2], left_image_msg[3]))

# 定位需要放置文字截图的位置并叠加
im2r[153: 153 + 324, 
     580: 580 + 256] = im2r_title

解决方案

方法一:用掩码实现透明叠加(保留原文字样式)

核心是把黑底白字图的黑色背景设为透明,只保留白色文字区域,再和目标图合并:

import cv2
import numpy as np

# 读取目标图和文字素材图
target_img = cv2.imread(mask_image2)
text_img = cv2.imread(image_2_title)

# 转为RGB格式(若后续用PIL展示需转,直接用OpenCV的话BGR格式也可)
target_rgb = cv2.cvtColor(target_img, cv2.COLOR_BGR2RGB)
text_rgb = cv2.cvtColor(text_img, cv2.COLOR_BGR2RGB)

# 调整文字图尺寸到目标区域大小
text_resized = cv2.resize(text_rgb, (left_image_msg[2], left_image_msg[3]))

# 生成掩码:黑底转0(透明),白字转255(不透明)
gray_text = cv2.cvtColor(text_resized, cv2.COLOR_RGB2GRAY)
_, mask = cv2.threshold(gray_text, 10, 255, cv2.THRESH_BINARY)  # 阈值可根据实际图调整
mask_inv = cv2.bitwise_not(mask)

# 提取目标图对应区域的背景
roi = target_rgb[153:153+324, 580:580+256]
target_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)

# 提取文字图中的纯文字区域
text_fg = cv2.bitwise_and(text_resized, text_resized, mask=mask)

# 合并文字和目标背景
merged_area = cv2.add(text_fg, target_bg)

# 将合并后的区域放回目标图
target_rgb[153:153+324, 580:580+256] = merged_area

# 保存结果(转回BGR格式适配OpenCV)
cv2.imwrite("final_result.png", cv2.cvtColor(target_rgb, cv2.COLOR_RGB2BGR))

方法二:OCR识别文字后重新绘制(更灵活)

如果不需要严格保留原文字的字体样式,可以用OCR识别文字内容,直接在目标图上绘制文字,彻底避免黑框问题:

  1. 先安装Tesseract OCR引擎,再安装Python库:pip install pytesseract
  2. 运行以下代码:
import cv2
import pytesseract

# 若Tesseract不在系统环境变量中,需指定路径
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

# 读取文字图并预处理增强识别率
text_img = cv2.imread(image_2_title)
gray_text = cv2.cvtColor(text_img, cv2.COLOR_BGR2GRAY)
_, thresh_text = cv2.threshold(gray_text, 10, 255, cv2.THRESH_BINARY)

# 识别文字(中文用chi_sim,英文用eng)
text_content = pytesseract.image_to_string(thresh_text, lang='chi_sim').strip()

# 读取目标图并绘制文字
target_img = cv2.imread(mask_image2)
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(
    target_img, 
    text_content, 
    (580, 153 + 50),  # 调整y坐标让文字垂直居中
    font, 
    1.2,  # 字体大小
    (255,255,255),  # 白色文字
    2  # 文字粗细
)

# 保存结果
cv2.imwrite("direct_draw_result.png", target_img)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 10:07:13