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
相关产品推荐
相关产品推荐

