把一张图缩成一半,表面上只是改变宽高,实际却要回答两个问题:连续场景在旧像素之间是什么样,以及新像素覆盖范围内应该保留哪些频率。前者是重建,后者是采样。忽略任意一个,都会表现为锯齿、摩尔纹、模糊或 ringing。
像素不是可以随意搬动的小方块
离散图像给出规则位置上的样本。目标像素中心通常落在原样本之间,因此缩放需要先用一个核估计连续信号,再在新网格采样:
是插值核。不同方法的差别,本质上是核的支撑范围、平滑性与频率响应不同。
插值核决定邻域怎样参与
同一个目标坐标,不同核会选择不同数量的样本并分配不同权重。
实拍模式把原图先缩到 120×80,再放大到 960×640。负权重能提高边缘锐度,也可能在阶跃附近制造 ringing。
Nearest 只选最近样本,速度快但放大会出现块状阶梯。Bilinear 在一维使用两点线性加权,二维通常是四邻域,结果稳定但偏软。Bicubic 使用四点三次核,二维需要 邻域;Lanczos 用有限窗截断 sinc,能保留更高频细节,却可能产生负旁瓣和 ringing。
坐标必须先定义清楚
常见的像素中心映射是:
是缩放倍率, 和 分别是目标与源坐标。式中的半像素偏移决定两套像素中心如何对齐。不同库若采用 align corners 或不同取整约定,即便都叫 bilinear,边缘位置也可能相差半个像素。
工程实现还要明确边界策略。Clamp 会复制边缘,Mirror 会镜像延拓,Wrap 适合周期纹理;无条件补零则会在图像四周引入不真实的暗边。
缩小不只是“少取几个像素”
当宽度缩为四分之一,新 Nyquist 频率也降到原来的四分之一。输入中超过这个限制的细纹必须在抽样前低通滤除,否则它们会折返到低频,形成不存在的宽条纹或摩尔纹。
缩小前不低通,细纹会折返成假纹
目标只有 24 个样本;超过新 Nyquist 频率的输入不能靠插值器自动消失。
这里用盒式低通便于观察。生产级缩小会把滤波器带宽随缩放倍率收窄,并使用更合适的窗函数。
正确的缩小核会随倍率变宽。若原核为 ,缩放倍率 时可写作:
这不是为了“故意模糊”,而是避免目标网格无法表达的频率伪装成错误结构。盒式平均简单但阻带抑制有限;高质量实现会使用窗化 sinc、分阶段缩小,或专门设计的多相滤波器。
锐利、平滑与振铃
理想 sinc 在频域能实现砖墙低通,却具有无限支撑。实际核必须截断或换成有限支撑近似,于是空间范围、通带平坦度与阻带衰减之间形成取舍。
锐、糊与 ringing 是同一组取舍
用阶跃边缘检查插值器:过窄会阶梯化,正权重核会变宽,负旁瓣核可能过冲。
阶跃不是完整画质评价,但能快速暴露模糊和 ringing。周期纹理、斜线与真实照片仍需一起测试。
Nearest 的零阶保持会产生阶梯;Bilinear 没有负权重,通常不会过冲,但高频衰减较强;Bicubic 和 Lanczos 可以得到更陡的边缘,也可能在高对比轮廓两侧出现亮暗细线。所谓“更锐的插值器”并非无条件更好。
测试不能只看自然照片。黑白阶跃暴露 overshoot,斜线暴露锯齿,周期细条纹暴露 alias,单像素脉冲则能直接显示核形状。
二维可分离实现
许多核可写成 ,因此先水平处理,再垂直处理,避免直接进行大尺寸二维卷积。一个简化实现如下:
def resize_separable(image, x_map, y_map, kernel): horizontal = filter_rows(image, x_map, kernel) return filter_columns(horizontal, y_map, kernel)真实代码还需要预计算相位权重、归一化每组系数、采用足够宽的累加器,并把整数输出的舍入放在最后。定点实现尤其要检查负权重、系数和与溢出。
缩放与锐化谁先谁后
锐化增强的是某一像素尺度上的边缘。先在大图上制造一条 3 px 宽的 halo,再缩成缩略图,它可能被压成异常强的一圈;先缩放后锐化,则能直接针对最终像素尺寸控制边缘宽度。
输出锐化必须知道最终尺寸
把同一条边缘分别按“先锐后缩”和“先缩后锐”处理,观察最终尺度上的边缘响应。
示例参数刻意固定来突出顺序差异。实际输出锐化要随目标尺寸、插值器、观看距离与显示介质共同调节。
因此常把锐化分成捕获锐化与输出锐化:前者轻度补偿成像链软化,后者在最终缩放之后根据输出尺寸和媒介调节。缩小前仍需抗混叠低通,不能用锐化代替。
Alpha、颜色空间与几何变换
带透明度的图像应在预乘 Alpha 后插值,否则完全透明像素里隐藏的 RGB 会污染可见边缘。插值完成后再安全地解除预乘。
对于 RGB 图像,线性光插值更符合能量模型;直接在 Gamma 编码值上平均通常偏暗或改变边缘亮度。是否值得转到线性域取决于质量目标与成本,但必须明确处理域。
旋转、透视、LDC 和任意网格变形同样属于重采样。它们通常采用逆向映射:对每个目标像素寻找源坐标,从而避免正向撒点留下空洞。
验证清单
- 恒定图像缩放后是否仍恒定,系数和是否为 1;
- 单像素脉冲与阶跃响应是否符合设计;
- 水平、垂直、斜向细线是否一致;
- 高频棋盘和扫频图是否出现 alias 或摩尔纹;
- 不同倍率下低通带宽是否正确收缩;
- 图像边界、单行单列和极小尺寸是否越界;
- Alpha 边缘是否出现黑边或隐藏颜色;
- 定点路径是否发生负权重下溢与累计溢出;
- 与参考实现的坐标中心、取整和边界约定是否一致。
图像重采样不是“挑选附近像素”,而是有限成本下的信号重建。插值核决定放大时如何补足样本,预滤波决定缩小时哪些频率必须舍弃;理解二者,才能有意识地在清晰度、混叠、ringing 与计算量之间选择。