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

Python中如何将去水印后的阈值图像转为RGB彩色图像?

解决OpenCV去水印后保存为黑白图像的问题

你的代码最终输出黑白图像的核心原因是:整个去水印流程都在单通道灰度图上操作,最后得到的bw是单通道图像。而cv2.COLOR_BGR2RGB是用于转换3通道BGR图像到RGB的,对单通道灰度图使用该转换完全无效,保存后自然还是黑白。

要得到彩色结果,必须基于原始彩色图像进行修复,而不是在灰度图上处理完再强行转彩色。下面提供两种可行的修改方案:


方案一:使用OpenCV图像修复函数(推荐)

利用cv2.inpaint函数,通过周围像素插值修复水印区域,直接得到彩色去水印结果:

import cv2
import numpy as np

def back_rm(filename):
    # 加载原始彩色图像
    img = cv2.imread(filename)
    # 转灰度图用于生成水印掩码
    gr = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    bg = gr.copy()
    # 形态学操作生成背景模板
    for i in range(5):
        kernel2 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,
                                            (2 * i + 1, 2 * i + 1))
        bg = cv2.morphologyEx(bg, cv2.MORPH_CLOSE, kernel2)
        bg = cv2.morphologyEx(bg, cv2.MORPH_OPEN, kernel2)

    # 计算背景与原图的差异,提取水印区域掩码
    dif = cv2.subtract(bg, gr)
    bw = cv2.threshold(dif, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
    
    # 关键:用原始彩色图像 + 水印掩码进行修复
    result = cv2.inpaint(img, bw, inpaintRadius=3, flags=cv2.INPAINT_TELEA)
    
    # 转换BGR到RGB后保存(OpenCV默认读入为BGR格式)
    rgb_image = cv2.cvtColor(result, cv2.COLOR_BGR2RGB)
    cv2.imwrite('rgb_image.jpg', rgb_image)

back_rm('example2.jpg')

方案二:彩色背景替换法

将灰度背景转为3通道彩色背景,替换原始图像中的水印区域像素:

import cv2
import numpy as np

def back_rm(filename):
    img = cv2.imread(filename)
    gr = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    bg = gr.copy()
    for i in range(5):
        kernel2 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,
                                            (2 * i + 1, 2 * i + 1))
        bg = cv2.morphologyEx(bg, cv2.MORPH_CLOSE, kernel2)
        bg = cv2.morphologyEx(bg, cv2.MORPH_OPEN, kernel2)

    dif = cv2.subtract(bg, gr)
    bw = cv2.threshold(dif, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]

    # 将灰度背景转为3通道彩色背景
    bg_color = cv2.cvtColor(bg, cv2.COLOR_GRAY2BGR)
    # 复制原始图像作为结果基底
    result = img.copy()
    # 替换水印区域像素为背景对应像素
    result[np.where(bw > 0)] = bg_color[np.where(bw > 0)]
    
    rgb_image = cv2.cvtColor(result, cv2.COLOR_BGR2RGB)
    cv2.imwrite('rgb_image.jpg', rgb_image)

back_rm('example2.jpg')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 23:35:10