Python基于OpenCV的固定位置半透明水印去除两种方案

1. 基于 inpaint 方法(网上的方法,处理质量较低)

  • 算法理论:基于Telea在2004年提出的基于快速行进的修复算法(FMM算法),先处理待修复区域边缘上的像素点,然后层层向内推进,直到修复完所有的像素点
  • 处理方式:由ui人员制作出黑底白色水印且相同位置的水印蒙版图(必须单通道灰度图),然后使用inpaint方法处理原始图像,具体使用时可把水印区放粗,这样处理效果会好点
# -*- coding: utf-8 -*-
# @Time    : 2017/11/24
# @Author  : fc.w
# @File    : wipe_watermark.py
import cv2
# 默认的彩色图(IMREAD_COLOR)方式读入原始图像
src = cv2.imread('src.jpg')  
# 灰度图(IMREAD_GRAYSCALE)方式读入水印蒙版图像
mask = cv2.imread('mask.png', cv2.IMREAD_GRAYSCALE) 

# 参数:目标修复图像; 蒙版图(定位修复区域); 选取邻域半径; 修复算法(包括INPAINT_TELEA/INPAINT_NS, 前者算法效果较好)
dst = cv2.inpaint(src, mask, 3, cv2.INPAINT_TELEA)

cv2.imwrite('result.jpg', dst)

效果展示

原始图:src.jpg
原始图
蒙版图:mask.jpg
蒙版图
INPAINT_TELEA算法处理效果:
INPAINT_TELEA算法处理效果
INPAINT_NS算法处理效果:

INPAINT_NS算法处理效果

细致比较的话,INPAINT_TELEA算法处理,水印的隐去效果会稍好点

2. 基于像素的反色中和(处理质量较高)

参考自ps去水印原理,通过一张白底的反色水印图来中和原图水印

# -*- coding: utf-8 -*-
# @Time    : 2017/11/24
# @Author  : fc.w
# @File    : wipe_watermark.py
import cv2
import numpy

src = cv2.imread('src.jpg')
mask = cv2.imread('mask.png')
# 创建一张空图像用于保存
save = numpy.zeros(src.shape, numpy.uint8) 

for row in range(src.shape[0]):
    for col in range(src.shape[1]):
        for channel in range(src.shape[2]):
            if mask[row, col, channel] == 0:
                val = 0
            else:
                reverse_val = 255 - src[row, col, channel]
                val = 255 - reverse_val * 256 / mask[row, col, channel]
                if val < 0: val = 0

            save[row, col, channel] = val

cv2.imwrite('result.jpg', save)

效果展示

原始图:src.jpg
原始图
反色水印图:mask.jpg
反色水印图:
效果图
效果图

你可能感兴趣的:(Python基于OpenCV的固定位置半透明水印去除两种方案)