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

下面就通过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. 统计数据背后的指数分布模型
  2. 转: 通过Servlet生成验证码图片
  3. 彻底卸载vscode Linux,ubuntu如何卸载vscode
  4. 寒假与春节终归,新学期和新任务又至
  5. 简单阻容降压电路图_X2安规电容用于阻容降压容量衰减原因及对策
  6. mysql为什么使用b 树作为索引_为什么Mysql用B+树作为索引
  7. java setrotation_如何使用Java库将文档转换为横向模式?
  8. bzoj4589-Hard Nim【FWT】
  9. python3学习笔记(2)_list-tuple
  10. Spring : Spring 深入理解lombok
  11. React Native 交互管理器InteractionManager
  12. 一些杂七杂八的算法(打表,递推,随机选择算法)
  13. 贝叶斯网络是神经网络吗,贝叶斯网络和神经网络
  14. Ubuntu虚拟机中无法使用罗技鼠标滚轮功能
  15. 支付宝上天了! 移动支付应用首次登上飞机
  16. 第五篇 《小强升职记》
  17. Libero设计流程
  18. 【笔记】Android手机root的概念
  19. 游戏封网卡mac地址后修改网卡mac地址
  20. 图灵奖得主Bengio:深度学习不会被取代,我想让AI会推理、计划和想象

热门文章

  1. idea怎么进行c语言编程_编程入门-C语言开发IDE选择
  2. 惠普HP 畅游人PAVILION 进入BISO开启Intel VT-X
  3. 英国人工智能简史:从艾伦图灵到DeepMind | 历程
  4. 2020年中国汽车试验场行业市场现状分析,新技术、新模式发展带动行业深刻变革「图」
  5. 用配置文件配置数据源出现的access denied for user ‘root‘@这个问题的解决办法
  6. 数据迁移测试经验总结
  7. Apple的营销策略——饥饿营销
  8. linux下基于ipmsg协议的飞鸽传书(一)
  9. mysql 英文文献_mysql数据库英文文献.doc
  10. 自热锅中发热包氧化钙 铝粒 碳酸氢钠的作用