双线性插值在缩放中如何计算目标像素

从目标坐标反推四个邻近像素

双线性插值解决的是一个具体问题:缩放后的目标像素,通常对应原图中一个非整数坐标,不能直接读取单个像素。它会找到该坐标周围的4 个邻近像素,再按水平和垂直距离分配权重,计算出目标颜色。

设原图中的采样坐标为 (x, y),目标图像中的像素坐标为 (u, v)。缩放算法先把目标坐标映射回原图,得到 (x, y),再定义:

  • x0=floor(x),x1=x0+1;
  • y0=floor(y),y1=y0+1;
  • 四个邻近像素分别是 (x0,y0)、(x1,y0)、(x0,y1)、(x1,y1)。

这四个像素围成一个小矩形,目标采样点 (x,y) 位于其中。若 x=12.25、y=8.75,那么 x0=12、x1=13、y0=8、y1=9;采样点距离左边界为 0.25,距离上边界为 0.75。

边缘位置需要额外处理。例如,采样点靠近左上角时,x0 或 y0 可能小于 0;靠近右下角时,x1 或 y1 可能超出图像范围。常见策略包括复制边缘像素、镜像边缘,或直接裁剪坐标。实际结果取决于图片库的实现。

用水平与垂直两次插值得到颜色

令 C00、C10、C01、C11 分别表示上述四个像素的颜色。双线性插值可以拆成两步:先水平插值,再垂直插值。两个小数距离决定全部权重:

  • α=x-x0:采样点从左侧像素向右侧像素移动的比例;
  • β=y-y0:采样点从上侧像素向下侧像素移动的比例。

沿水平方向,先计算上、下两行的中间颜色:

CT=(1-α)C00+αC10
CB=(1-α)C01+αC11

再沿垂直方向计算最终颜色:

C=(1-β)CT+βCB

将两步展开后,完整公式是:

C=(1-α)(1-β)C00+α(1-β)C10+(1-α)βC01+αβC11

因此,四个像素的权重依次为 (1-α)(1-β)、α(1-β)、(1-α)β、αβ。只要 0≤α≤1 且 0≤β≤1,四个权重都非负,并且总和为 1。

取 α=0.25、β=0.75:

  • C00 的权重:(1-0.25)(1-0.75)=0.1875;
  • C10 的权重:0.25(1-0.75)=0.0625;
  • C01 的权重:(1-0.25)0.75=0.5625;
  • C11 的权重:0.25×0.75=0.1875。

这说明采样点更靠近下方,因此 C01 获得最高权重。对 RGB 图像而言,红、绿、蓝三个通道分别使用同一组权重计算;它们不会共享颜色数值,只共享空间位置关系。

缩放比例改变采样坐标和画面细节

放大和缩小虽然都能使用双线性插值,但采样含义不同。放大时,一个目标像素通常对应原图中的局部位置;缩小时,一个目标像素代表的原图区域可能覆盖多个原图像素。

常见的像素中心映射形式是:

x=(u+0.5)/scale-0.5

纵坐标可以使用同样形式计算。这里的 0.5 用来把整数坐标视为像素中心,而不是像素边界。不过,具体公式取决于工具采用的像素对齐规则。不同库在半像素偏移、边缘坐标和舍入方式上的差异,可能让同一张图出现 1 个通道值甚至多个通道值的差别。

  • 2× 放大:每个原图像素对应更大的目标区域,双线性插值通常能让边缘比最近邻更平滑。
  • 1.5× 放大:目标坐标大多落在非整数位置,四邻域权重变化明显,适合观察公式的实际效果。
  • 0.5× 缩小:一个目标像素可能代表原图约 2×2 的区域,单次双线性采样仍只取映射点附近的四个像素。

这里容易产生误解:双线性插值使用四个像素,并不表示缩小时每个目标像素只“覆盖”四个原图像素。四邻域公式描述的是一次局部采样;当目标尺寸变小时,原图中更大的区域可能被压缩到一个目标像素里,而算法仍只按映射点附近四个像素计算,因此可能丢失高频细节并产生混叠。是否先做区域平均、使用 Lanczos,或采用其他抗混叠策略,取决于具体实现。

透明图像还涉及 Alpha 通道,即描述像素不透明程度的数值。RGBA 插值时,如果直接分别插值 RGB 和 Alpha,半透明边缘可能出现暗边;如果先把 RGB 转为预乘 Alpha,再插值,结果通常更适合合成,但最终效果取决于输入数据和后续合成方式。

  • 放大照片:双线性插值速度快,能减少明显的块状边缘,但不会恢复原图没有的细节。
  • 缩小照片:若目标尺寸较小,优先选择带抗混叠的区域采样或高质量滤波器。
  • 缩小图标和文字:应检查细线是否断裂;双线性插值可能让边缘变灰或变细。

用图片工具验证每个目标像素来源

可以用 Pillow 做一个可重复的验证实验。固定缩放算法后,记录目标像素坐标、反向映射坐标、四邻域位置和实际输出值,就能把公式与图片库结果逐项比较。

  1. 准备一张小尺寸测试图,例如 4×4 像素,并放置红、绿、蓝、白等明显颜色块。
  2. 分别设置目标缩放比例为 2×、1.5× 和 0.5×,避免只测试整数倍。
  3. 使用 Pillow 的 Image.resize(),并明确指定 Image.Resampling.BILINEAR。
  4. 选取一个目标像素 (u,v),按照图片库采用的映射规则计算 (x,y)。
  5. 求出 x0、x1、y0、y1,再计算 α、β 和四个权重。
  6. 读取实际输出颜色,与加权公式的结果比较,并单独检查边界像素。

Pillow 的版本可能影响边界处理和坐标对齐细节,因此验证时应记录版本号,例如使用 Pillow 10.x,并把测试代码、输入图和目标尺寸一并保存。若实际结果与手算不同,先检查像素中心映射和边界策略,不要立刻认为双线性公式错误。

判断结果时可以使用三个标准:

  • 四个权重都应非负;
  • 四个权重之和应为 1,允许存在浮点舍入误差;
  • 在线性数值空间中插值时,每个颜色通道的输出通常应位于四个输入通道值的最小值和最大值之间。

最后一点有条件限制。许多图像文件中的 RGB 数值经过了 sRGB 编码,直接在编码值上插值并不等同于在线性光空间插值;如果目标是物理意义更准确的亮度或合成效果,还需要先进行色彩空间转换。缩放工具是否这样处理,仍取决于具体实现。

更多推荐

先用顶帽、黑帽变换找出细长划痕 老照片修复不应直接把疑似划痕涂掉,而要先生成范围可控的掩膜,再由修复算法重建缺失内容。下面这套流程以 OpenCV 为例:用形态学操作检测亮、暗划痕,用连通域筛选误检,最后按区域选择修复方法。 顶帽变换是原

了解更多 >

先把二值图变成可切行的投影信号 OCR 预处理中的倾斜校正,目标是让文字基线接近水平;投影切割,目标是找出每一行文字的上下边界。两者的实际顺序通常是:灰度化、二值化、估计角度、旋转校正、水平投影切行。 二值化是把每个像素归为前景或背景。

了解更多 >

8×8 DCT 水印,先从两个中频系数开始 在基于 8×8 块离散余弦变换(DCT)的图像水印中,嵌入位置决定了压缩耐受性和视觉失真。可复现实验可以从亮度通道的 (2,3)、(3,2) 两个中频系数开始,用它们的差值承载 1 bit,再用

了解更多 >

PNG、JPEG与WebP转换:体积、画质与兼容性的测试方法 照片通常应比较JPEG与WebP有损编码;截图、文字和透明图标通常应比较PNG与WebP无损编码。但不能仅凭格式判断体积,必须固定编码器和参数后,实测文件大小、画质与兼容性。

了解更多 >

从 RGB 数值映射到灰度亮度 把彩色图片转成黑白,核心不是把红、绿、蓝三个数直接相加后平均,而是按照人眼对不同颜色的敏感程度分配权重。常用的 BT.601/Rec.601 亮度近似公式是: Y = 0.299R + 0.587G +

了解更多 >