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

罗伟

网易资深研发工程师

先后参与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磨皮美颜录制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值