视频智能去水印:从数学建模到工程实现
羅偉
網易資深研發工程師
先后參與KMS流媒體服務器及NTS分布式任務處理系統的開發
作者簡介大部分時候,為了表明作品來源,我們需要對拍攝制作的圖片或者視頻加上水印logo。不過,我們有時候也需要對視頻已經加上的水印進行移除處理,然后加上新的水印。加水印的自動處理是很容易實現的,而檢測并去除水印的自動處理就有相當的挑戰性了。
?
問題已經拋出,網易云信的分布式視頻處理系統,于近期發布了支持視頻自動去水印的轉碼功能,我們是怎么自動化、智能化地解決這一問題的呢?
?
其實很簡單,它總共分三步:
分析并檢測出視頻所有水印的區域;
根據區域對這些水印進行移除處理;
加上新的水印。
?
細心的讀者可能已經發現,這事情"簡單"地好比如何把大象放進冰箱,那我們就來試試把大象放進冰箱。
?
本文分三個部分來描述:數學建模、工程實現、實際效果。
●●●
數學建模
因為視頻是由一幀一幀的圖像組成,所以視頻去水印其實就是一組圖像的去水印。這部分內容比較偏學術,筆者爭取描述得通俗易懂。
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磨皮美顏錄制
總結
以上是生活随笔為你收集整理的视频智能去水印:从数学建模到工程实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android微信视频播放填坑指南
- 下一篇: 网易云信直播sdk的整体传输优化