python+opencv实现图片/短视频一键去水印

0 前言

在制作ppt个人文章或者分享图片过程中,经常会遇到一些带有水印的情况,不少人都希望能够去除这些水印,提高图片和视频的观看体验。本文将介绍如何使用Python+opencv实现图片的去水印功能。
在这里插入图片描述
👉 点击链接体验在线demo

1 准备工作

首先,我们需要导入OpenCV和NumPy库。OpenCV是一个开源的计算机视觉库,可以用于图像和视频处理,NumPy是Python的一个科学计算库,提供了高性能的多维数组对象。

import cv2
import numpy as np

2 读取图片或视频

在代码中,我们定义了一个变量pmode来指定处理模式,可以是"image"或"video"。当pmode为"image"时,我们从指定路径读取一张图片;当pmode为"video"时,我们通过cv2.VideoCapture()函数从指定路径读取一个视频。

pmode="image"
path = "316.jpg"   #记得不要有中文路径
vieodpath="350.mp4"
cap=cv2.VideoCapture(vieodpath)

if pmode=="video":
    ret,img = cap.read()
else:
    img = cv2.imread(path)
height,width = img.shape[0:2]

3 添加回调获取鼠标绘制水印区域

接下来,我们获取图片的高度和宽度,并定义了一些全局变量,用于记录鼠标事件的状态和坐标。同时,我们创建了一个与窗口绑定的回调函数,用于实现鼠标事件的交互操作。

# 鼠标回调函数
def draw_circle(event, x, y, flags, param):
    global ix, iy, drawing, mode, img

    if event == cv2.EVENT_LBUTTONDOWN:
        drawing = True
        ix, iy = x, y

    elif event == cv2.EVENT_MOUSEMOVE:
        if drawing == True:
            if mode == True:
                cv2.rectangle(mask, (ix, iy), (x, y), (0, 255, 0), -1)
                cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
            else:
                cv2.circle(mask, (x, y), 5, (0, 255, 0), -1)
                cv2.circle(img, (x, y), 5, (0, 255, 0), -1)

在这里插入图片描述

在鼠标回调函数中,我们根据不同的鼠标事件进行相应的操作。当按下鼠标左键时,开始画矩形或圆形,记录起始坐标;当鼠标移动时,如果继续按下鼠标左键,根据当前模式画矩形或圆形;当释放鼠标左键时,停止画矩形或圆形,根据当前模式完成最后一个矩形或圆形的绘制。

			elif event == cv2.EVENT_LBUTTONUP:
			        drawing = False
			        if mode == True:
			            cv2.rectangle(mask, (ix, iy), (x, y), (0, 255, 0), -1)
			            cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
			        else:
			            cv2.circle(mask, (x, y), 5, (0, 255, 0), -1)
			            cv2.circle(img, (x, y), 5, (0, 255, 0), -1)

4 调用opencv函数

接下来,我们定义了一个waterprint()函数,用于去除图片中的水印。在该函数中,我们首先定义了要查找的颜色范围,然后将图片转换为HSV颜色空间,并使用cv2.inRange()函数根据颜色范围得到一个二值图像。接着,我们使用cv2.dilate()函数对二值图像进行膨胀操作,得到一张掩膜图像。最后,我们使用cv2.inpaint()函数根据掩膜图像进行修复操作,得到最终的去水印结果。

def waterprint(img):
    global mask
    #开始操作
    # 设定要查找的颜色范围
    lower_green = np.array([50, 100, 100])
    upper_green = np.array([70, 255, 255])
    

    hsv = cv2.cvtColor(mask, cv2.COLOR_BGR2HSV)
    thresh = cv2.inRange( hsv,lower_green,upper_green) 

    
    scan = np.ones((5,5),np.uint8)
    cor = cv2.dilate(thresh,scan,iterations=1)

    
    dst = cv2.inpaint(img, cor, 3, cv2.INPAINT_TELEA)

5 绘制蒙版主循环

在主程序中,我们创建了一个窗口,并将回调函数与窗口绑定。然后,我们进入一个循环,不断显示原始图片,并根据按键的操作切换绘制模式、生成掩膜图像,以及退出程序。

while(1):
    cv2.imshow('image', img)
    k = cv2.waitKey(1) & 0xFF
    if k == ord('m'):
        mode = not mode
    elif k == ord('s'):
        mask = np.zeros(img.shape[:2], dtype=np.uint8)
        contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        for contour in contours:
            x, y, w, h = cv2.boundingRect(contour)
            cv2.rectangle(mask, (x, y), (x+w, y+h), (0, 0, 0), -1)
        cv2.imshow('mask', mask)
    elif k == 27:
        break

cv2.destroyAllWindows()

6 去水印主循环

在处理视频时,我们首先创建了一个视频编写器,并使用cv2.VideoWriter()函数指定输出视频的格式、帧率和大小。然后,我们使用cv2.VideoCapture()函数读取视频的每一帧,并对每一帧进行去水印操作。最后,我们将处理后的帧写入输出视频,并显示处理后的帧。如果按下键盘上的"s"键,则停止处理并保存输出视频。最后,我们释放资源,关闭窗口。

# 创建视频编写器
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('output'+datetime.now().strftime("%H-%M-%S")+'.mp4', fourcc, 20.0, (width, height))

if pmode=="video":
    if cap.isOpened():
        cap.release()
    cap=cv2.VideoCapture(vieodpath)
    while(cap.isOpened()):        
        ret, frame = cap.read()
        if ret:
            # 写入输出视频
            nowaterprint_frame=waterprint(frame)
            out.write(nowaterprint_frame)
           
            # 显示帧
            cv2.imshow('frame', nowaterprint_frame)
        
        if cv2.waitKey(27) & 0xFF == ord('s'):            
            
            # 释放资源
            
            break
        
    cap.release()
    out.release()
    cv2.destroyAllWindows()    
else:
    nowaterprint_frame=waterprint(img)
    cv2.imshow('frame', nowaterprint_frame)
    cv2.waitKey(0)
    cv2.destroyAllWindows()  

如果处理的是一张图片,则直接调用waterprint()函数进行去水印,并显示处理后的图片。

通过以上代码,我们实现了图片和视频的去水印功能。当我们运行代码并选择相应的处理模式后,可以通过鼠标交互操作选择要去除的水印区域,并得到去水印后的结果。这样,我们就可以更好地欣赏图片和观看视频,提高视觉体验。

总结

总结起来,本文介绍了如何使用Python编程语言实现图片和视频的去水印功能。通过OpenCV和NumPy库的支持,我们可以轻松处理图像和视频,并实现自定义的图像处理效果。希望本文对大家了解Python图像处理有所帮助。
源码链接

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-31 19:56:04       106 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-31 19:56:04       116 阅读
  3. 在Django里面运行非项目文件

    2023-12-31 19:56:04       95 阅读
  4. Python语言-面向对象

    2023-12-31 19:56:04       103 阅读

热门阅读

  1. go 语言程序设计第3章--基础数据类型

    2023-12-31 19:56:04       59 阅读
  2. Bug升级记

    2023-12-31 19:56:04       64 阅读
  3. CF1914C Quests

    2023-12-31 19:56:04       54 阅读
  4. Crow:run的流程2 建立io_service及线程

    2023-12-31 19:56:04       62 阅读