废话不多说,直接开干!
单色图片去水印,问题不大
当遇到多色水印图片,工作量来了,而且不一定去除,头大了
直接看代码
# -*- 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)