我们再搬运视频的时候常常会遇到视频有水印的问题
如下

下面就通过python来实现对视频水印的去除

在pycharm新建一个项目,创建image,video目录其他不用

必要条件

在终端下载相关依赖包

pip install moviepy==1.0.3
pip installnumpy==1.21.5
pip install opencv_python==4.5.5.62

将要去除水印的视频放在video目录下,运行一下

用鼠标操作去除的部分,回车即可

去除了水印的视频输出到了output文件夹下

查看效果,还不错

代码实现

import os
import sysimport cv2
import numpy
from moviepy import editorVIDEO_PATH = 'video'
OUTPUT_PATH = 'output'
TEMP_VIDEO = 'temp.mp4'class WatermarkRemover():def __init__(self, threshold: int, kernel_size: int):self.threshold = threshold #阈值分割所用阈值self.kernel_size = kernel_size #膨胀运算核尺寸def select_roi(self, img: numpy.ndarray, hint: str) -> list:'''框选水印或字幕位置,SPACE或ENTER键退出:param img: 显示图片:return: 框选区域坐标'''COFF = 0.7w, h = int(COFF * img.shape[1]), int(COFF * img.shape[0])resize_img = cv2.resize(img, (w, h))roi = cv2.selectROI(hint, resize_img, False, False)cv2.destroyAllWindows()watermark_roi = [int(roi[0] / COFF), int(roi[1] / COFF), int(roi[2] / COFF), int(roi[3] / COFF)]return watermark_roidef dilate_mask(self, mask: numpy.ndarray) -> numpy.ndarray:'''对蒙版进行膨胀运算:param mask: 蒙版图片:return: 膨胀处理后蒙版'''kernel = numpy.ones((self.kernel_size, self.kernel_size), numpy.uint8)mask = cv2.dilate(mask, kernel)return maskdef generate_single_mask(self, img: numpy.ndarray, roi: list, threshold: int) -> numpy.ndarray:'''通过手动选择的ROI区域生成单帧图像的水印蒙版:param img: 单帧图像:param roi: 手动选择区域坐标:param threshold: 二值化阈值:return: 水印蒙版'''#区域无效,程序退出if len(roi) != 4:print('NULL ROI!')sys.exit()#复制单帧灰度图像ROI内像素点roi_img = numpy.zeros((img.shape[0], img.shape[1]), numpy.uint8)start_x, end_x = int(roi[1]), int(roi[1] + roi[3])start_y, end_y = int(roi[0]), int(roi[0] + roi[2])gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)roi_img[start_x:end_x, start_y:end_y] = gray[start_x:end_x, start_y:end_y]#阈值分割_, mask = cv2.threshold(roi_img, threshold, 255, cv2.THRESH_BINARY)return maskdef generate_watermark_mask(self, video_path: str) -> numpy.ndarray:'''截取视频中多帧图像生成多张水印蒙版,通过逻辑与计算生成最终水印蒙版:param video_path: 视频文件路径:return: 水印蒙版'''video = cv2.VideoCapture(video_path)success, frame = video.read()roi = self.select_roi(frame, 'select watermark ROI')mask = numpy.ones((frame.shape[0], frame.shape[1]), numpy.uint8)mask.fill(255)step = video.get(cv2.CAP_PROP_FRAME_COUNT) // 5index = 0while success:if index % step == 0:mask = cv2.bitwise_and(mask, self.generate_single_mask(frame, roi, self.threshold))success, frame = video.read()index += 1video.release()return self.dilate_mask(mask)def generate_subtitle_mask(self, frame: numpy.ndarray, roi: list) -> numpy.ndarray:'''通过手动选择ROI区域生成单帧图像字幕蒙版:param frame: 单帧图像:param roi: 手动选择区域坐标:return: 字幕蒙版'''mask = self.generate_single_mask(frame, [0, roi[1], frame.shape[1], roi[3]], self.threshold) #仅使用ROI横坐标区域return self.dilate_mask(mask)def inpaint_image(self, img: numpy.ndarray, mask: numpy.ndarray) -> numpy.ndarray:'''修复图像:param img: 单帧图像:parma mask: 蒙版:return: 修复后图像'''telea = cv2.inpaint(img, mask, 1, cv2.INPAINT_TELEA)return teleadef merge_audio(self, input_path: str, output_path: str, temp_path: str):'''合并音频与处理后视频:param input_path: 原视频文件路径:param output_path: 封装音视频后文件路径:param temp_path: 无声视频文件路径 '''with editor.VideoFileClip(input_path) as video:audio = video.audiowith editor.VideoFileClip(temp_path) as opencv_video:clip = opencv_video.set_audio(audio)clip.to_videofile(output_path)def remove_video_watermark(self):'''去除视频水印'''if not os.path.exists(OUTPUT_PATH):os.makedirs(OUTPUT_PATH)filenames = [os.path.join(VIDEO_PATH, i) for i in os.listdir(VIDEO_PATH)]mask = Nonefor i, name in enumerate(filenames):if i == 0:#生成水印蒙版mask = self.generate_watermark_mask(name)#创建待写入文件对象video = cv2.VideoCapture(name)fps = video.get(cv2.CAP_PROP_FPS)size = (int(video.get(cv2.CAP_PROP_FRAME_WIDTH)), int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)))video_writer = cv2.VideoWriter(TEMP_VIDEO, cv2.VideoWriter_fourcc(*'mp4v'), fps, size)#逐帧处理图像success, frame = video.read()while success:frame = self.inpaint_image(frame, mask)video_writer.write(frame)success, frame = video.read()video.release()video_writer.release()#封装视频(_, filename) = os.path.split(name)output_path = os.path.join(OUTPUT_PATH, filename.split('.')[0] + '_no_watermark.mp4')#输出文件路径self.merge_audio(name, output_path, TEMP_VIDEO)if os.path.exists(TEMP_VIDEO):os.remove(TEMP_VIDEO)def remove_video_subtitle(self):'''去除视频字幕'''if not os.path.exists(OUTPUT_PATH):os.makedirs(OUTPUT_PATH)filenames = [os.path.join(VIDEO_PATH, i) for i in os.listdir(VIDEO_PATH)]roi = []for i, name in enumerate(filenames):#创建待写入文件对象video = cv2.VideoCapture(name)fps = video.get(cv2.CAP_PROP_FPS)size = (int(video.get(cv2.CAP_PROP_FRAME_WIDTH)), int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)))video_writer = cv2.VideoWriter(TEMP_VIDEO, cv2.VideoWriter_fourcc(*'mp4v'), fps, size)#逐帧处理图像success, frame = video.read()if i == 0:roi = self.select_roi(frame, 'select subtitle ROI')while success:mask = self.generate_subtitle_mask(frame, roi)frame = self.inpaint_image(frame, mask)video_writer.write(frame)success, frame = video.read()video.release()video_writer.release()#封装视频(_, filename) = os.path.split(name)output_path = os.path.join(OUTPUT_PATH, filename.split('.')[0] + '_no_sub.mp4')#输出文件路径self.merge_audio(name, output_path, TEMP_VIDEO)if os.path.exists(TEMP_VIDEO):os.remove(TEMP_VIDEO)if __name__ == '__main__':#去除视频水印remover = WatermarkRemover(threshold=80, kernel_size=5)remover.remove_video_watermark()#去除视频字幕remover = WatermarkRemover(threshold=80, kernel_size=10)remover.remove_video_subtitle()

基于python实现去除视频的水印相关推荐

  1. 基于Python的数字图形可视化水印系统的设计与实现

    目录 1 经典数字图像水印算法 1 1.1 LSB 算法 1 1.2DCT 算法 2 2 经典数字图像水印算法的改进 7 2.1随机间隔算法 7 2.2区域校验位算法 8 2.3图像降级算法及其改进 ...

  2. 基于python的短视频智能推荐/django的影视网站/视频推荐系统

    摘 要 本论文主要论述了如何使用Python技术开发一个短视频智能推荐,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发.在引言中,作者将论述短视频智能推荐 ...

  3. 基于python Moviepy的视频字幕识别和合成!

    前言:前几天看到一篇<用Python解决女朋友看电影没字幕的需求>,觉得很有意思.但是有道的识别没有做过,找了下其他的接口,发现讯飞的识别比较准确.就做了这个小程序. 讯飞接口:https ...

  4. 基于python+flask实现视频数据可视化

    使用爬虫对视频弹幕进行爬取并保存为csv文件,导入数据库中,进而实现前后端交互功能.  数据集中包含的数据分别为爬取的热门视频的标题.播放量.弹幕量.收藏量.综合得分以及视频的类别等信息,便于后续我们 ...

  5. 基于python+ffmpeg的视频并发直播压力测试

    通过python与ffmpeg结合使用,可生成进行视频点播.直播的压力测试脚本.可支持不同类型的视频流,比如rtmp或者hls形式. 通过如下方式执行脚本:python multiRealPlay.p ...

  6. 基于python实现opencv视频去抖动

  7. 基于python的视频监控系统_Python远程视频监控程序的实例代码

    老板由于事务繁忙无法经常亲临教研室,于是让我搞个监控系统,让他在办公室就能看到教研室来了多少人.o(>﹏<)o||| 最初我的想法是直接去网上下个软件,可是找来找去不是有毒就是收费,无奈技 ...

  8. 如何去除视频水印?方法超简单

    强迫症完全无法接受.那我们怎么把像抖音.快手这样的短视频去水印呢?今日教你一种去除视频中水印的方法,很简单,完全傻瓜化操作. 步骤一: 在浏览器上搜索"水印云",打开官网首页,或者 ...

  9. 视频中的水印如何去除?教你几种简单去除视频水印方法

    视频中的水印如何去除掉呢?如果我们经常观看视频,可能会注意到一些视频上有水印.水印是在视频中嵌入的品牌标志或文字.这些水印可能会影响视频的观感,去除水印可以帮助我们在学习和研究方面更有效地使用视频资源 ...

最新文章

  1. 为什么使用LM386可以直接收听调频电台节目?
  2. js获取当前日期,包括星期几
  3. mysql isolation level_MySQL数据库事务隔离级别(Transaction Isolation Level)
  4. Git的分支命令详解
  5. Go语言中字符串的查找方法小结
  6. java中的HashSet内部是如何工作的
  7. MYSQL获取同时关注了某两个(或者N个)用户的用户
  8. 图解eclipse+myelcipse开发EJB
  9. 论文检测_免费论文检测系统
  10. EDEM 2020的安装
  11. Gamit 数据处理,相关的文件配置
  12. mysql 表继承_如何在数据库中表示继承?
  13. DeDeCMS二次开发教程之程序安装
  14. 一种xml解析二次处理的方法(根据剔除规则仅保留部分二级节点)
  15. Qt扫盲-QSlider理论总结
  16. 新版本游戏试玩APP搭建教程,附上试玩APP源码
  17. PMP第八章:项目质量管理
  18. 设定了所有种子后每次结果还是不一样 pytorch可重复 可复现问题
  19. 数字信号处理-05- FPGA常用运算模块-复数乘法器
  20. 调试笔记——《一起做RGB-D SLAM 》

热门文章

  1. JDBC连接执行 MySQL 存储过程报权限错误:User does not have access to metadata required to determine stored procedur
  2. 如何通过几何画板中文版快速等分线段
  3. 初识Spring HATEOAS
  4. 写给前端开发者的「Promise备忘手册」
  5. 经颅磁的学习笔记之(一):经颅磁刺激基本原理
  6. screenshot python_python 截图screenshot处理
  7. python下医学图像处理库的安装问题(更新中)
  8. Turbo WinMD5 0.42
  9. android系统之apn相关
  10. 公钥 私钥 数字签名 CA证书