照片里的衬衫,为什么会多出原本不存在的条纹?
一块织得很密的布,肉眼看起来平平常常,到了相机里却可能泛起一圈圈波纹。被拍摄的物体没有变化,照片却在记录原有纹理时,长出了新的纹理。这是摩尔纹的一种成因。用一个简单的合成实验,就能把其中的门道看得很清楚。
看起来清晰的图案,也可能是错误的图案。
像素之间的空隙,同样重要
想象我们在一块条纹表面上,以固定间距测量亮度。每个测量点只能告诉我们这里有多亮,却无法说明到下一个点之前,亮度如何变化。如果条纹变化足够缓慢,这些测量就能很好地描述它。可如果两个测量点之间已经发生多次变化,另一种图案也可能符合相同的测量结果。
真实的传感器像素会收集一小片面积内的光,而镜头也会在光线到达传感器前柔化细节。我们的模型刻意从更简单的情况出发:理想的点采样,加上一幅单色图案。先去掉这些缓冲机制,采样中的歧义就能单独显现出来。

两种不同的波形,可以留下同一组点
在下面的曲线图里,蓝色波形每跨过一个像素间距,就重复0.92个周期;金色波形只重复0.08个周期。一个变化密集,一个起伏缓慢。但在每一个整数像素位置,两者的亮度完全相同。在采样点之间,它们描述的却是截然不同的景象。
这就是混叠:不同的信号,在采样后变成了同一种结果。对于简单的等间距亮度采样,在通常的带限假设下,要避免这种歧义,频率必须低于每个采样间距半个周期。实验中的0.92周期超出了这条界线,于是表现为缓慢得多的变化。

假图案,也有自己的方向
现在把一条线扩展成一个平面。生成的条纹在水平方向每个像素推进0.92个周期,在竖直方向推进0.03个周期。把它放到100 × 100的网格上采样,得到的数值,与水平、竖直分量分别为−0.08和0.03的宽条纹完全一致。两个方向之间的关系变了,条带看起来的角度也随之改变。
下一张图只改变水平分量,依次使用0.90、0.92和0.94。每次小幅调整,都会在同一个网格上产生不同的宽条带。这有助于理解,为什么取景稍微一变,摩尔纹就可能大幅移动。实验展示的是机制,而不是某一款镜头或相机的具体表现。

一点模糊,反而能留下更真实的画面
一个出人意料的办法,是在采样之前先去掉一部分细节。某些相机用光学低通滤镜在物理层面完成这件事。缩小数字图像前,也可以用数字低通滤波器做类似处理。两者都是为了防止超出采样能力的细节,换成更大尺度的图案重新出现。
在第二组合成表面中,我们给细条纹叠加了原本就存在的宽阔明暗变化。采用宽度参数为0.6像素的理想高斯预滤波后,细条纹的幅度降低了99.76%,宽阔明暗变化的幅度则保留了98.87%。这些数字来自这个特定合成信号的实际计算,不是对相机改善效果的承诺。
先后顺序很重要。一旦采样已经把两种图案混在一起,模糊处理就无法知道哪一种变化才是真的。先滤波,可以避免混淆;后滤波,则可能只是让错误的条带变柔和。

布料开始泛波纹时,可以试什么
稍微改变拍摄距离、焦距或相机角度,可能会改变重复纹理与传感器网格的对应关系。但应当检查结果,不能预设变化一定有效。不同取景可能移动问题、减轻问题,也可能制造另一种图案。除了缩小的预览图,也要查看原始文件,因为缩放本身又是一次采样。
颜色会让事情更复杂。许多相机在相邻的感光位置测量不同颜色,再估算缺失的数值。因此,细密纹理不仅可能出现错误的明暗条带,还可能产生原本没有的颜色。这里的灰度演示没有模拟彩色滤光阵列、去马赛克、锐化或任何厂商的图像处理。
看见更多细节,不等于得到更多信息
摩尔纹让人困惑,是因为结果可以显得非常整齐、非常笃定。宽条纹明明白白地摆在那里,但清楚可见并不代表忠实。记录系统恰恰可能因为没有取得足以区分不同情况的信息,而生成一种很有说服力的结构。
一个有用的习惯,是问清楚:测量了什么,间距是多少,测量前去掉了哪些内容。只要连续的世界被转换成网格,这些问题就值得追问。有时,更诚实的图像,恰恰是愿意放弃一点锐利感的那一张。
继续阅读
Nikon · Moiré & False Color ↗NI · Sampling, bandwidth and aliasing ↗NumPy · Discrete Fourier Transform ↗所有插图均由本地计算生成。屏幕或浏览器缩放图片时,细密图案还可能产生额外的显示伪影。
