python 去水印复杂问题

废话不多说,直接开干!

单色图片去水印,问题不大
当遇到多色水印图片,工作量来了,而且不一定去除,头大了

直接看代码

# -*- coding: utf-8 -*-
# @Time    : 2020/07/11 16:50
# @Author  :白大米66
import time

import cv2 as cv
import numpy as np
from os.path import splitext
from itertools import product
from PIL import Image




class WaterMark(object):

    def console_location(path):
        """
        控制台输出区域像素的位置
        :param path:
        :return:
        """
        # 定片位置
        img = cv.imread(path)

        def on_mouse(event, x, y, flags, param):
            if event == cv.EVENT_LBUTTONDOWN:
                # 宽 高
                print(x, y)

        # 构建窗口
        # 回调绑定窗口
        cv.namedWindow("img", cv.WINDOW_NORMAL)
        cv.setMouseCallback("img", on_mouse, 0)
        cv.imshow("img", img)
        # 键盘输入 q退出
        if cv.waitKey() == ord("q"):
            cv.destroyAllWindows()
    #  多色水印去除,这个匹配水印位置,目前匹配一种
    def mark(self, path='duo.png'):
        # 提取感兴趣区域ROI
        img = cv.imread(path)
        # 通过运行console_location函数后在相应的图片上点击两个点可以获取一下两个参数
        # 高1:高2 宽1:宽2
        roi = img[360:450, 91:896]
        # cv.imwrite('02.jpg', roi)
        roi_hsv = cv.cvtColor(roi, cv.COLOR_BGR2HSV)
        # cv.imwrite('hsv.jpg', roi_hsv)

        # 设定白色HSV范围
        lower = np.array([0, 0, 0])
        upper = np.array([204, 128, 235])

        # 创建水印蒙层
        kernel = np.ones((3, 3), np.uint8)
        # cv.imwrite('kernel.jpg',kernel)
        mask = cv.inRange(roi_hsv, lower, upper)
        # cv.imwrite(r'mask.jpg',mask)
        # 对水印蒙层进行膨胀操作
        dilate = cv.dilate(mask, kernel, iterations=1)
        res = cv.inpaint(roi, dilate, 7, flags=cv.INPAINT_TELEA)
        # 双边滤波
        res = cv.bilateralFilter(res, 5, 280, 50)

        # 高1:高2 宽1:宽2
        img[360:450, 91:896] = res
        cv.imwrite('8899.jpg', img)

    # 单色去除水印
    def one_single(self,path='单色.gif'):
        update_time = time.strftime('%Y%m%d', time.localtime(time.time()))  # 当前时间
        fn = path
        im = Image.open(fn)
        width, height = im.size
        for pos in product(range(width), range(height)):
            # 580是经验值,需要根据图片内容和水印的颜色值进行调整整
            if sum(im.getpixel(pos)[:3]) > 580:
                im.putpixel(pos, (250, 250, 250))
        im.save(update_time.join((splitext(fn))))

# 去除带色文档
if __name__ == '__main__':
    path = 'dan.gif'
    # console_location(path)
    w = WaterMark()
    # 调用多色
    # w.mark(path)
    # 调用单色
    w.one_single(path)



在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值