——本文大多内容来自达特茅斯的 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 才能更强的哈!