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识别文字内容,直接在目标图上绘制文字,彻底避免黑框问题:
- 先安装Tesseract OCR引擎,再安装Python库:
pip install pytesseract - 运行以下代码:
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
相关产品推荐
相关产品推荐

