——本文大多內容來自達特茅斯的 Micah K. Johnson 和 Hany Farid 兩位老師在2006年所寫的 Exposing digital forgeries through chromatic aberration 這篇文章。
目錄
0. 摘要
幾乎所有的光成像系統都會爲圖片帶來一些誤差,比如色差,是由光系統對不同波長的光不完美的聚焦導致的。在一階近似下,橫向色差可以表現爲顏色通道之間的擴展和收縮。然而當對圖片進行篡改時,這種色差通常會被擾亂並且不能與原圖片保持一致。這篇文章描述了一個算法來自動估算橫向色差,並給出了它在對篡改圖像進行檢測時的有效性。
1. 序言
大多數圖像都因爲其成像的光系統,有一系列的瑕疵。在理想的成像系統中,光穿過棱鏡會在一個點上聚焦,但實際上的光系統是背離這一理想模型的,因爲棱鏡並不能完美的對所有波長的光進行聚焦。而它導致的結果就是色差,色差有兩個形式,一個爲縱向色差,一個爲橫向色差。縱向色差表現爲不同波長的光的焦平面不同,而橫向色差表現爲不同波長的光到達傳感器上的空間位移,這種位移與該位置到光學中心的距離成正比。
在一階近似中,縱向色差可以被建模爲一個經過了低通濾波器的顏色通道的卷積。橫向色差可以被建模爲色彩通道之間的擴展和收縮。
本篇文章介紹了一個色差計算方法,並估計了它在圖像篡改中的作用。但此文章僅包含了橫向色差的計算。
2. 色差
爲了更好的說明,這裏先以一維的圖片爲例,再延展至二維。
2.1. 1-D色差
在經典光學中,光在兩個介質的交界面中的折射是符合 Snell's Law 的:
其中是入射角,是反射角;兩個n是介質的折射率,玻璃的折射率,,取決於透過它的光。在多色光中,這種原理會使光在通過透鏡折射,並打到傳感器後分開。如下圖所示:
上圖中的紅光和藍光在入射時是同一角度的混合光,但經過了棱鏡折射後,在傳感器上的投影產生了距離。橫向色差可以用一個低參數模型進行建模,如果假設紅光和藍光入射在傳感器上的位置爲 Xr 和 Xb ,那麼在沒有橫向色差的情況下,Xr 和 Xb 應該是相同的。那麼在表達橫向色差時,我們可以用一個簡單的參數來串聯兩者的關係:
, 而 只是一個縮放值,若對任意兩個波長的波進行建模,則 是一個關於這些波長的方程。這就是簡單的一維色差。
2.2. 2-D色差
真的暈了,寫好了兩節的內容被網站吞了,下面我就不完全複述論文的內容,簡要的介紹一下。
對於2-D的情況,我們首先可以理解爲兩個1-D的疊加,這個疊加可以被簡單的概括爲:
就是直接理解爲,兩個通道之間的有一個拉伸或者縮放;但顯而易見這種假設是不完備的,因爲它建立在色差的中心點與圖像的中心點重合的基礎上,如下圖所示。而實際上,在多棱鏡系統中,色差的中心通常與圖像的中心不在一個點上,所以我們需要加入一個常量,即中心點的座標才能很好的呈現橫向色差:
圖中的向量可以表示爲 ,當色差中心的座標爲 時,我們可以把方程組改爲:
在確定了色差後,我們還需要考慮的是製造商,製造商在製作鏡頭的時候肯定是要最大程度的減少色差的影響,一種普遍使用的策略是將折射率不同的棱鏡進行組合,去匹配不同波長的光。如果兩個波長的光匹配了,那這樣的棱鏡組成爲 achromatic doublet 消色差雙合透鏡 / achromat。 當然,這樣的策略也不可能對所有的光譜進行補償,所以剩下的誤差稱爲 secondary spectrum,次級光譜。次級光譜在高對比度下在圖像上表現爲紫紅色或綠色的光暈。
2.3. 色差估計
我們已經知道了2-D的色差可以被如何估計,那麼接下來我們以綠色通道爲例,計算下紅綠色差和藍綠色差。當然,值得注意的是,在整張圖中,任何地方出現的色差不匹配都可以作爲篡改的證據。
由2.2.的公式,我們可以得知,任何一個區域的色差都可以由三個參數來表徵,即我們使用 和 來表徵紅綠和藍綠通道的扭曲。
這種模型估計可以被當做一個圖像配準問題。我們嘗試使用一個矩陣進行配準,使兩個通道的色差儘量相同,這裏我們使用了一個基於兩通道內容的矩陣進行配準[11](見原文引用),這種矩陣會比相關係數矩陣稍微精確一點,但卻不增加計算複雜度。當然其他矩陣的結果也都很不錯。
我們使用 和 分別代表RGB圖像的紅綠通道,並且把校正後的紅色通道表示爲 :
則我們通過最大化 和 的相互關係來確定參數的值,即
,其中R和G是 和的像素強度描述的隨機變量。
,
其中是聯合概率分佈,是邊緣概率分佈。
這個矩陣的相互關係的最大化使用了brute-force iterative search, “蠻力”搜索,即遍歷搜索。在第一個迭代中,先對 的參數空間進行採樣,在第二次迭代中,會以最大化第一迭代結果來取得更好的採樣空間。這樣的過程會重複N次,雖然BF搜索的計算量很大,但能保證每次都取到全局最小。這裏作者提到了SGD優化器,來優化運行時間。
爲了量化預估的和一直的模型參數的誤差,我們計算了每個像素的位移矢量的平均角誤差。即 爲真實的參數,而 是被計算的模型參數。則色差的位移矢量域爲:
則我們可以用角誤差來對比它們之間的關係:
對誤差取平均,則平均角誤差爲 ,對整個圖像的像素集合P來說:
爲了增加可靠性,這個平均值的計算只有超過了0.01的像素才能參與,所以我們可以用 來衡量對橫向誤差估計的誤差。
3. 結果
這裏的結果由很多,都是針對鏡頭等等的,不是我關注的重點,我選取幾張圖
3.3 圖像取證
這一部分內容,是我們所關心的。
在篡改圖像時,圖像總是由另一部分的圖片填補或者拼湊而成,這種方式會導致橫向色差的不一致。爲了找到這種不一致,我們首先假設只有一小塊圖片是被篡改過的,以及這種篡改不會嚴重地影響到整張圖片的色差估計。所以我們可以用全局的估計與每個小塊做對比,所有與全局估計相悖的像素塊都可能被懷疑是篡改過的。
我們將示例圖片劃分爲300x300的像素塊,在沒有空間頻域信息的情況下得到小塊的色差是很難的,所以我們選擇計算每個色塊的平均梯度,且只提取梯度最大的50個色塊,梯度
其中:
代表了卷積, 和 代表了一對一階導數和低通濾波器。
以下圖片爲例:
最上方圖片圈出的即是一個色塊,第二和第三個圖是藍綠的色差統計,第二張圖是對全局的,而第三張圖是對單獨一塊的。最下面一張圖是角誤差的統計圖,誤差計算的對象是第二張圖和第三張圖。平均角誤差的統計結果爲98%的角誤差低於60°,平均角誤差爲14.8°。這個結果表現出色塊色差的估計如果顯著的大於60°,那麼它可以表示色塊中存在篡改痕跡。
下圖展示的是三張正常圖片和篡改圖片:
從圖中,我們能準確的發現,篡改部分的色塊被標註出,每處一場都平均高出了閾值2.5灰度/像素。色塊的誤差平均值都大於60度,平均扭曲大於0.15個像素就被認爲有篡改痕跡。這種圖像取證的方式適用於圖像篡改的面及較小的圖片,對於篡改區域較大的圖片,可以將圖片切分爲多個色塊,並從每個小色塊中估計全局的色差估計,最後將每個色塊與全局色塊做對比,如果最終全部的色塊都小於60°,則可以認爲圖片是正常的。
4. 結語
看完這篇文章,感覺這個算法還是很厲害,對色差的分析其實是從根本上解決了圖片篡改的問題,因爲往往篡改的部分不可能來源於同一個相機在同一個場景下的同一個位置。接下來打算把這種方法和上篇的CNN做一個結合,上一篇的CNN是作爲了block的提取器,然後使用SVM去做最後的分類。讀完這篇後,感覺可以把色差的信息進行提取,然後使用CNN這種深度學習分類器進行整體的分類。
整理博客的過程中真的被CDSN的草稿小坑了一把,但是還是要堅持記錄一下,step by step 才能更強的哈!