罗伟

网易资深研发工程师

先后参与KMS流媒体服务器及NTS分布式任务处理系统的开发

作者简介

大部分时候,为了表明作品来源,我们需要对拍摄制作的图片或者视频加上水印logo。不过,我们有时候也需要对视频已经加上的水印进行移除处理,然后加上新的水印。加水印的自动处理是很容易实现的,而检测并去除水印的自动处理就有相当的挑战性了。

问题已经抛出,网易云信的分布式视频处理系统,于近期发布了支持视频自动去水印的转码功能,我们是怎么自动化、智能化地解决这一问题的呢?

其实很简单,它总共分三步:

  1. 分析并检测出视频所有水印的区域;

  2. 根据区域对这些水印进行移除处理;

  3. 加上新的水印。

细心的读者可能已经发现,这事情"简单"地好比如何把大象放进冰箱,那我们就来试试把大象放进冰箱。

本文分三个部分来描述:数学建模、工程实现、实际效果。

数学建模

因为视频是由一帧一帧的图像组成,所以视频去水印其实就是一组图像的去水印。这部分内容比较偏学术,笔者争取描述得通俗易懂。

1-1 image matting问题

视频去水印的本质是multi-image matting问题,图像处理中的image matting问题最早由Alvy Ray Smith在其SIGGRAPH论文《Blue screen matting》中提出和定义,中文意思就是抠图。

AlvyRay Smith认为一张图片I,应该由前景F和背景B合成,合成方式就是通过透明度α来操作。在不同的区域两者的比例不一样,对于只有背景的地方,前景的参与比例为0%,对于只有前景的地方,背景的参与比例为0%。具体公式如下:

可以看出来,matting问题研究的是,如何通过左边的I,推测出右边的三个变量α、F和B,方程数量严重少于未知数数量,理论上是无精确解的,实际工程上根据不同场景或者一些先验前提,我们是可以一定程度上求出近似解的,不过其难度仍然巨大。

这项技术主要被用在电影工业中,比如你在观看一些电影花絮视频时,有时会看到拍摄现场有绿色背景和一群穿着绿色衣服的工作人员,这些都会在后期的抠图技术下被抠掉换上“真正的”背景。这种Blue Screen Matting 技术,使用纯色背景可以确保前景被准确抠出。

在2001年的CVPR会议上,贝叶斯公式被引入解决matting问题,在04年的SIGGRAPH上,MSRA的Jian Sun等人发表了基于泊松方程的Poisson Matting这篇文章,其实际上是将透明度作为图像的一种内在属性—“场”,变向地寻求其最优解。后来同在MSRA工作的KaiMing He,在图像去雾算法中发现了暗通道先验,并获得2009年的CVPR最佳论文。

1-2 水印估计与去除算法

今年,Google在CVPR2017会议上发表了一篇去水印的论文《On the Effectiveness of Visible Watermarks》,其几近完美地解决了具有共同水印的一组图像去水印问题,研究人员提出了广义的multi-image matting模型。

对于水印图像 J ,我们认为其通过将水印 W 叠加到自然图像 I 来获得,类似于上面的公式,可以有下面的公式:

其中p =(x,y)是像素位置,α(p)是空间变化的不透明度,最常用的水印是半透明的,以保持底层的图像内容部分可见。

给定W和α,可以对每个像素进行计算操作来获取原图像:

如果没有先验信息,单独给予J来恢复I的问题是非常困难的,因为每个像素点都有三个未知的(W,α,I)变量和一个约束方程。

但是,大部分场景下,水印是以一致的方式添加到一组图像中,所以,对于图像集合{Ik},由相同的W和α标记,我们有(为了简洁省略像素索引p):

换句话说,我们的目标是,给定{Jk} k = 1…K,恢复W,α和{Ik} k = 1..K。大致算法如下:

A、估计检测水印

广义上来说,在一组图像中将所有图像中属于水印的图像结构检测还原出来,这是一个先有鸡还是先有蛋的问题,因为水印图像内容的检测估计和水印的区域位置是相互依赖的关系。对于有共同水印的一组图像来说(视频),即W(p)相同,这将不是问题。

B、多图像匹配和重建

有了所有图像中水印的检测位置信息,我们可以真正解决 multi-image matting problem,即由J 得到 W 、α、原始图像 I,这一部分是核心步骤,在后文的工程实现中我们会详细描述我们的实现。

C、删除新图像中的水印

有了W和α,根据公式我们就可以轻松地将任意新图像中的水印去除,当然前提是使用了相同的 W和α。

工程实现

2-1 模块框架

引擎的整体框架模块如下:

如上图所示,左侧是视频的水印检测,与谷歌的算法不尽一致,但是核心思路是一致的,仍然是对所有图像帧进行迭代处理,最终收敛出水印图像的结构。为提升运行效率,我们未必需要将所有的视频帧提取出来,当视频帧数量较多时,我们会进行跨帧的提取,丢弃一些GOP,避免不必要的解码运算。

右侧则是对视频中所有的图像进行水印去除操作,其依赖左侧模块所计算得出的水印信息。

2-2 算法实现

我们选择了一个示例视频,展示这个过程。

(1)记录图片序列每个位置最大值和最小值,并确定每个位置的像素值范围。由于在添加水印时的算法通常如下:

因此水印添加区的像素范围为:

当α值小于0.5时,水印添加区的像素范围低于127,因此标记像素范围小于127的区域为有效区域

(2)对图片逐帧水平垂直方向梯度进行叠加,无水印区域是动态区域,在空间域上梯度期望为0,即:

在水印与边界交界处,梯度期望不为0,例如在边界(????0,????0) ,有:

(3)针对有效区域内的梯度图使用Canny算子进行运算,初步标记的区域如下图所示:

(4)可以看出有部分静态区域也被识别出纹理,由于水印区域边界的梯度值并不稳定,因此水印区域的边缘梯度线呈现出非连续状态,可通过去除长线段的方式去除非水印静态区域边缘梯度线段,处理后的效果如下:

(5)此时可发现水印区域纹理密度要远高于其它区域,对图像进行均值滤波,然后通过大津阈值法对图像进行二值化,处理后的效果如下所示:

(6)最后通过连通域算法和聚类算法,过滤掉不符合规定的区域,从而确定水印区域,结果如下所示:

效果展示

我们重新选取一个视频,经过我们的去水印引擎,可以自动检测出水印位置,并进行去除操作,效果图见下面的图和视频。

去除水印之后的视频,如下:

【推荐阅读】Android短视频中如何实现720P磨皮美颜录制

视频智能去水印:从数学建模到工程实现相关推荐

  1. 一文带你了解什么是数学建模

    文章目录 一.什么是数学建模? 1.1 数学建模比赛分类 1.2 数学建模比赛常用模型 二.为什么要参加建模比赛呢? 2.1 建模比赛的几个误区 三.怎样准备数学建模比赛? 3.1 组建队伍 3.2 ...

  2. 清风数学建模笔记——Excel画图保姆级教学

    备注:本篇内容是在Office环境下作图,WPS不支持直方图和箱线图好像.免费的Office软件可以在微信搜索中搜"Office"然后挑一个下载即可 本文借鉴了数学建模清风老师的课 ...

  3. 视频教程-MATLAB数学建模-Matlab

    MATLAB数学建模 图像和算法等领域有多年研究和项目经验:指导发表科技核心期刊经验丰富:多次指导数学建模爱好者参赛. 宋星星 ¥12.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+ ...

  4. 数学建模—MATLAB基本使用(一)

    MATLAB为matrix laboratory"矩阵实验室"的缩写,安装资源可以在一些微信公众号上寻找破解版. 命令行窗口:写程序:工作区可以找到你所定义的变量.输入完成程序后可 ...

  5. 2023五一数学建模该选哪道题?选题建议及初步思路来啦

    大家好呀,2023五一数学建模开赛了,在这里给大家带来初步的选题建议及思路,之后我会一直更新更加详细的完整思路以及后续也会有完整成品的讲解视频,手把手教大家如何去做哈,目前的初步思路讲解视频: 202 ...

  6. 基于监控视频的前景目标提取-数学建模

    摘  要 本文研究了本次大赛D题的5个问题.包括静态和动态背景下前景目标检测与提取.存在摄像机抖动情况下前景目标检测与提取.应用以上建立的三种模型对各种视频文件进行显著帧号提取以及多摄像机协同的目标检 ...

  7. matlab书籍(数学建模,信号处理,智能优化,统计分析)

    matlab相关的书籍资料,包括基础入门的学习,数学建模,信号处理,智能优化,统计分析等等,部分书籍有matlab源码,需要的朋友可以看看. matlab入门资料分享及学习网站推荐 - 知乎最近由于做 ...

  8. 数学建模上分利器,小论文中稿神器,赶快学习近15年来较新颖的智能优化算法!

    前言 关于MATLAB系列的精品专栏大家可参见 MATLAB-30天带你从入门到精通 MATLAB深入理解高级教程(附源码) 喜欢的小伙伴可自行订阅,你的支持就是我不断更新的动力哟! 相信各位无论是写 ...

  9. 数学建模——智能优化之遗传算法详解Python代码

    数学建模--智能优化之遗传算法详解Python代码 import numpy as np import matplotlib.pyplot as plt from matplotlib import ...

最新文章

  1. Rafy 框架 - 大批量导入实体
  2. (C/C++学习)6.数组指针和指针数组
  3. [51nod1384]全排列
  4. mod php是什么意思,mod_php模式原理探析
  5. jQuery CSS 样式属性
  6. C函数加密实现及常用字符串处理函数的使用
  7. python pep8
  8. 构造函数,拷贝构造函数,赋值函数
  9. 从零开始刷Leetcode——数组(122.167.169)
  10. list 分页_mybatis一对多分页查询
  11. haoi2018奇怪的背包题解
  12. BZOJ 3173: [Tjoi2013]最长上升子序列 [splay DP]
  13. 【元胞自动机】基于matlab元胞自动机求解城市小区开放对周边道路通行影响研究【含Matlab源码 233期】
  14. Grafana 安装和使用
  15. matlab怎么绘制球差像差曲线,减小球差的环带透镜设计
  16. 【react】---redux-actions的基本使用---【巷子】
  17. 怎样把一张图片插入到CAD图纸中呢?
  18. 压缩WinSxS文件夹
  19. 600度近视眼恢复方法_近视孩子的家长看看:600度以上近视可致盲,不花钱恢复视力法...
  20. DataSource和SessionFactory的区别

热门文章

  1. iOS音频的后台播放 锁屏
  2. 程序员应该具备的能力
  3. Javascript基础回顾 之(一) 类型
  4. 无法访问此网站localhost 拒绝了我们的连接请求_官方教程丨如何在IPFS上创建托管个人网站?...
  5. 医学科研如何快速掌握R语言?
  6. JavaSE(十九)——equals() 和 == 的区别
  7. Java实现二分查找及其优化
  8. Android studio | Android studio下APP目录工程结构详解
  9. php发表图片文章代码,最新PHP图片上传的一个例子的文章【延伸阅读】
  10. php curl 传输大文件,空白目录 · php下载大文件curl · 看云