Video-removal -logo

​ 本代码仓库使用opencv中的图像修复技术来对视频中的每一帧进行修复,从而得到干净去除掉水印的视频,同时保留了视频的音频部分。

Dependent environment

pip install opencv-python
pip install moviepy
pip install pydub

How to remove

1.找到水印的位置,对于视频中logo会出现在相对固定位置的去除方法。比如抖音,快手,logo会出现在视频的左上角或者视频的右下角的时候,我们使用图像处理的基本知识来定位找到水印的位置。

2.读取视频的每一帧图像,创建一个和原图大小的mask,使得找到的水印的标识显现在mask图像中。

3.使用形态学膨胀操作,将找到的logo标识进行膨胀处理。

4.使用opencv中cv.inpant图像修复技术来对图像进行修复,去除logo。

5.处理视频中需要裁剪的视频帧数,并且计算得到裁剪时间,同步裁剪视频的音频文件,对视频中的音频文件进行裁剪处理,减掉片尾。

6.裁剪后的视频和裁剪后的音频进行合成视频,得到去除logo后的视频。

image display

Code usage

1.先执行remove_logo.py文件来去除水印和得到裁剪掉片尾的音频文件。

python remove_logo.py

2.运行Combine-audio-video.py来对去除logo的视频和音频文件进行合并。合并的视频文件保存在save_path文件夹中

python Combine-audio-video.py

The video address after removing the logo

链接:https://pan.baidu.com/s/1jB_-ES_JyIq-Bfu4H82Phg
提取码:hnr9

remove_logo.py如下:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-import cv2
import os
import sys
import numpy as np
import math
import time# 捕获音频
from moviepy.editor import *
from pydub import AudioSegment
from get_crop_time import get_time'''
1.读取视频
2.读取视频的音频
3.找到视频的切分点
4.对视频进行切分
5.对音频进行切分
6.对视频调用去水印函数
7.去完水印的视频和音频合成
'''def get_img_mask(im,file):shape = im.shapew = shape[1]h = shape[0]# print('shape[0]',shape[0])# print('shape[1]',shape[1])if int(h) > int(w):rect = (math.ceil(0.086 * h), math.ceil(0.41 * w))  # (H, W) 水印框大。 图像高宽为720,1280时为(110,300)# 左上角的位置      (15,15)pos1 = (math.ceil(0.02 * w), math.ceil(0.011 * h))# 右下角的位置   (405,1150)pos2 = (math.ceil(0.5625 * w), math.ceil(0.9 * h))nim = np.zeros((shape[0], shape[1]), dtype=np.uint8)st_lt = 0# x先遍历高,y遍历宽for x in range(pos1[1], pos1[1] + rect[0]):for y in range(pos1[0], pos1[0] + rect[1]):px = im[x, y]  # im[0,1]  0代表图像的高,1代表图像的宽if sum(px) > 640:nim[x, y] = 255st_lt = st_lt + 1  # 像素超过一定数量就判定为右下角, 否则水印在左上角# st_lt = st_lt + 1  # 像素超过一定数量就判定为右下角, 否则水印在左上角#print('st_lt', st_lt)# 左上角logo的像素点为三千多,当低于1000个像素的时候,就认为logo移动到右下角了if st_lt < 1000:nim = np.zeros((shape[0], shape[1]), dtype=np.uint8)  # clear# 先遍历宽,高for x in range(pos2[0], pos2[0] + rect[1]):for y in range(pos2[1], pos2[1] + rect[0] + 3):px = im[y, x]if sum(px) > 700:nim[y, x] = 255# for x in range(400, 720):else:nim = np.zeros((shape[0], shape[1]), dtype=np.uint8)st_lt = 0'''对于1280*720的图片,左上角坐标为(10,10)(350,125)右下角的坐标为(940,580)(1270,710)'''# x先遍历高,y遍历宽for x in range(math.ceil(0.0078125 * h), math.ceil(0.0977 * h)):for y in range(math.ceil(0.0139 * w), math.ceil(0.486 * w)):px = im[x, y]  # im[0,1]  0代表图像的高,1代表图像的宽if sum(px) > 640:nim[x, y] = 255st_lt = st_lt + 1  # 像素超过一定数量就判定为右下角, 否则水印在左上角#print('st_lt', st_lt)# 左上角logo的像素点为三千多,当低于1000个像素的时候,就认为logo移动到右下角了if st_lt < 1000:nim = np.zeros((shape[0], shape[1]), dtype=np.uint8)  # clear# 先遍历宽,高for x in range(math.ceil(0.7344 * w), math.ceil(0.9921 * w)):for y in range(math.ceil(0.805 * h), math.ceil(0.986 * h)):px = im[y, x]if sum(px) > 700:nim[y, x] = 255# 这里提取的水印的灰度图# if not os.path.exists("filter"):# os.makedirs("filter")# cv2.imwrite("filter/" + file, nim)return nim# 传进来一张
def remove_logo(image,file):mask = get_img_mask(image,file)kernel = np.ones((3, 3), np.uint8)dilate = cv2.dilate(mask, kernel, iterations=3)kernel_2 = np.ones((5, 5), np.uint8)dilate = cv2.dilate(dilate, kernel_2, iterations=1)# cv2.imwrite("delate/" + file, dilate)sp = cv2.inpaint(image, dilate, 7, flags=cv2.INPAINT_TELEA)#滤波操作sp = cv2.bilateralFilter(sp, 5, 280, 50)return spif __name__ == '__main__':input_pa = r'D:\person_work\github\video-qushuiyin\watermark-master\1\input_path'print('input_pa',input_pa)filenames = os.listdir(input_pa)# 遍历每个文件for fn in filenames:t0 =time.time()# 每个文件的完整路径input_path = os.path.join(input_pa, fn)print('input_path',input_path)cap = cv2.VideoCapture(input_path)# # 读视频文件videoclip_1 = VideoFileClip(input_path)vidio_id = os.path.basename(input_path).split('.')[0]vidio_id_audio = vidio_id + '.wav'# c=os.path.splitext(input_path)[0]# 保存去除logo的视频文件vidio_id_save = vidio_id + '.mp4'if not os.path.exists("out_path"):os.makedirs("out_path")outpath = os.path.join("out_path", vidio_id_save)tm = get_time(input_path)print('tm',tm)# 对视频画面进行截取# 获取视频分辨率size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))#图片名称frame_png = vidio_id+'.png'# 输出文件编码,Linux下可选X264fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')# 视频帧率fps = cap.get(cv2.CAP_PROP_FPS)print('fps', fps)success, image = cap.read()count = 0success = True# 输出out = cv2.VideoWriter(outpath, fourcc, fps, size)while (count < tm):success, image = cap.read()# 去水印,在写入视频re_logo = remove_logo(image,frame_png)out.write(re_logo)count += 1cap.release()print('time_all',time.time()-t0)# # 提取原始视频文件的音频部分audio_1 = videoclip_1.audioif not os.path.exists("audio_1_path"):os.makedirs("audio_1_path")save_audio_1 = os.path.join("audio_1_path", vidio_id_audio)audio_1.write_audiofile(save_audio_1)# 使用剪切音频的方法来对音频剪辑# 读取音频文件print('save_audio_1',save_audio_1)music = AudioSegment.from_wav(save_audio_1)t = tm/30# 截取前20秒,tm是求得的秒数clip = music[:t * 1000]if not os.path.exists("crop_music"):os.makedirs("crop_music")crop_id = vidio_id + '.mp3'print('crop_id',crop_id)crop_path = os.path.join('crop_music',crop_id)print('crop_path',crop_path)# 保存文件为clip.mp3,格式为mp3clip.export(crop_path, format='mp3')

get_crop_time.py文件如下

#!/usr/bin/env python3
# -*- coding: utf-8 -*-import cv2
import numpy as npdef is_gray(image):height, width = image.shape[:2]size = (int(width * 0.2), int(height * 0.2))shrink = cv2.resize(image, size, interpolation=cv2.INTER_AREA)# img.ravel() 将图像转成一维数组,这里没有中括号。hist, bins = np.histogram(shrink.ravel(), 256, [0, 256])# print(hist)no_zero = []sta = 0for i in range(len(hist)):if hist[i] > 1:sta += 1return sta# 获取截取视频的时间点
def get_time(videopath):cap = cv2.VideoCapture(str(videopath))success, frame = cap.read()end_frame = 0# print('keyframe_id_set',keyframe_id_set)while (success):# 如果当前帧的图像是全灰度图,则中断程序,跳出循环t = is_gray(frame)if t < 10:breakelse:# 获取截取帧的视频帧数end_frame = end_frame + 1success, frame = cap.read()return end_frame

Combine-audio-video.py如下

#!/usr/bin/env python3
# -*- coding: utf-8 -*-import cv2
import os
import sys
import numpy as np
import math# 捕获音频
from moviepy.editor import *
from pydub import AudioSegment#去除水印后的视频
video_path = r'D:\person_work\github\video-qushuiyin\watermark-master\1\out_path'#裁剪后的音频文件
music_path =r'D:\person_work\github\video-qushuiyin\watermark-master\1\crop_music'filenames = os.listdir(video_path)# 遍历每个文件
for fn in filenames:# 每个文件的完整路径vidio_path_name = os.path.join(video_path, fn)vid = os.path.basename(vidio_path_name).split('.')[0]#音频文件完整路径music_name = vid+'.mp3'music_path_name = os.path.join(music_path, music_name)# 读取音频audio_end = AudioFileClip(music_path_name)videoclip_logo = VideoFileClip(vidio_path_name)# 将提取的音频和第二个视频文件进行合成videoclip_3 = videoclip_logo.set_audio(audio_end)if not os.path.exists("save_path"):os.makedirs("save_path")vidio_id_end = vid + ".mp4"save_video = os.path.join("save_path", vidio_id_end)print('save_video',save_video)# 输出新的视频文件videoclip_3.write_videofile(save_video)

短视频去除logo(抖音)相关推荐

  1. 短视频去水印助手 抖音视频怎样伪原创

             短视频去水印助手 抖音视频怎样伪原创          我们决定开始制作短片.如果您选择短视频合作伙伴,这些好处肯定会让您满意!,且头条广告福利还是可以的,普通广告一万的播放量是3~ ...

  2. 如何做短视频推广?抖音短视频推广方案

    随着社交媒体和移动互联网的普及,短视频推广已成为企业推广营销的重要手段之一.那么什么是短视频推广?短视频推广是通过制作和发布短视频来宣传和推广企业产品或服务,吸引潜在客户,提升品牌知名度和美誉度,实现 ...

  3. 计算机音乐runfree,抖音短视频问答:抖音RunFree歌曲歌词完整版

    今天来聊聊一篇关于抖音短视频问答:抖音RunFree歌曲歌词完整版的文章,现在就为大家来简单介绍下抖音短视频问答:抖音RunFree歌曲歌词完整版,希望对各位小伙伴们有所帮助. 抖音<Run F ...

  4. 短视频营销丨抖音KOL达人在传播中如何发挥作用?

    短视频作为品牌争相抢占的热门推广渠道已不新鲜,尤其占据短视频头部流量的抖音在一众短视频平台中备受重视,尤其是抖音运营.抖音KOC达人传播等推广方式特别受欢迎.对品牌来说,在抖音上开展这方面的推广运营, ...

  5. 适合普通人的108个短视频项目:抖音手绘玩法揭秘(1)

    前段时间抖音上有一类视频非常火爆,是用手绘做出来的动画视频. 那么今天猫哥就为大家揭开手绘视频神秘的面纱,让大家零距离接触. 一.什么是抖音手绘动画? 先来回顾一下什么是抖音手绘动画? (案例1)[思 ...

  6. 短视频寒冬,抖音、美拍、快手等将何去何从?

    ---- / BEGIN / ---- 就在业内还在激烈讨论已经可以算是头条旗下最强明星产品的抖音"还能走多远"以及"谁能来阻止一下抖音"的时候,抖音方面却也传 ...

  7. 抖音短视频如何添加抖音小程序;个人与企业该怎么运营小程序。

    国仁网络资讯-国仁网络资讯-国仁网络资讯 抖音小程序是抖音App提供给企业和个人用户上传自己的服务.产品等信息的窗口,运营的朋友希望把抖音小程序添加到抖音短视频里,通过抖音短视频,一同宣传抖音企业小程 ...

  8. VLOG旅游类短视频如何通过抖音进行变现?运作模式有什么精髓之处?不妨了解下

    旅行日渐成为大众生活中不可或缺的一部分,大众除了利用常规拍照.拍视频的方式,来记 录旅程,volg 也走入大众视线以及短视频舞台中心. 打开抖音,你能频繁刷到关于旅行.美食.学习.日常等各种主题的 v ...

  9. 实用的短视频推广软件 抖音短视频推广助手

    随着短视频平台的不断发展,短视频推广工具越来越受到企业和个人的关注和使用.短视频推广软件是指帮助企业.个人等客户在各种短视频平台上,通过各种营销手段提升短视频曝光度.流量.粉丝等的推广工具.以下是常见 ...

  10. 2020年短视频爆发,抖音趋势怎么样?

    大家好.今天和大家讲一下短视频的运营操作,以及包括剪辑调色很多的一些技巧的综合,所以说可能会给大家带来更多的干货和技巧,也希望大家能够很快的吸收,然后在自己的一个短视频上有所作为. 那么今天我们先来讲 ...

最新文章

  1. 胖子哥的大数据之路(10)- 基于Hive构建数据仓库实例
  2. 基于 Redis 的分布式锁到底安全吗?
  3. ROM、PROM、EPROM、EEPROM、RAM、SRAM、DRAM的区别
  4. html 新append后的元素如何注册click
  5. 多目标非支配排序遗传算法-NSGA-II(二)
  6. Python扩展库安装工具pip的高级用法
  7. POJ 1611 The Suspects(简单并查集)
  8. CE修改器入门:查找共享代码
  9. 物联网开发语言的探讨
  10. xplay6android降级,xplay6 7.0降级6.0卡刷包
  11. python通达信,显示K线图
  12. 2018招商银行春招笔试编程题第一题
  13. ITSM系统核心流程
  14. 你知不知道痛楚的滋味?
  15. 终端网络饱和攻击猜想
  16. Magento常用插件整理收集
  17. revo加密_使用Revo Uninstaller完全卸载程序以及更多其他功能
  18. Django之验证码(十七)
  19. win10 使用wireshark抓包本地localhost请求
  20. 【高效程序员系列】3、别碰鼠标——让键盘飞起来

热门文章

  1. 《系统分析与设计》个人第二次作业
  2. java 图片转换 gif转jpg
  3. 微信公众号发布图文消息次数达到上限
  4. 最新使用Python进行开发网站教程项目实战(完整)
  5. php45欧米伽_PHP中的数字格式5.5到5.50 - php
  6. mysql三表联合查询_求三表联合查询的SQL查询语句
  7. wps word转pdf后出现空白页的删除方式
  8. wps怎么插入目录,快速插入目录的操作步骤
  9. 数据结构:链队列的基本操作(C语言实现)
  10. 如何使用可提高员工敬业度的绩效管理软件