双线性插值图像放大(钳位边界)后质心偏移的修正方法
修正双线性插值放大后的质心偏移问题
问题根源
你遇到的质心左偏,核心原因是离散像素的坐标对齐方式错误:默认的双线性插值如果把原像素当作单点(坐标为整数索引)来映射,会导致原数据的有效区间被错误截断,对称结构的中心无法对齐。
原扫描线是对称的[0,1,2,3,3,2,1,0],共8个像素,本质上它应该代表的是连续区间上的采样值——每个像素对应一个长度为1的区间,比如第k个像素(k从0到7)对应的区间是[k-0.5, k+0.5],整个原数据的覆盖范围是[-0.5, 7.5],中心在3.5处。如果直接按整数坐标映射,放大后的采样点会集中在原整数坐标左侧,自然导致质心左移。
修正方法
1. 采用「像素区间映射」的坐标对齐逻辑
放大时,目标像素的采样点需要对应到原数据的连续区间上,而非原像素的整数索引:
- 设放大倍数为
scale=4,目标像素索引为m(0到31),目标像素对应的连续区间是[(m/scale) - 0.5/scale, (m/scale) + 0.5/scale] - 取目标区间的中心作为采样点:
x = (m/scale) + 0.5/scale = (2m + 1)/(2*scale) - 用这个
x在原数据的连续区间上执行双线性插值(边界仍用clamp)
以原数据中心区域为例,原第3、4个像素对应区间[2.5,3.5]和[3.5,4.5],放大后的中心采样点会落在3.5两侧,保证对称,质心自然不会偏移。
2. 简化的坐标偏移公式
如果不想重新推导区间映射,也可以直接在原坐标计算时加入偏移量,抵消左偏:
原坐标计算公式改为:
x = (m / scale) + 0.5 * (1 - 1/scale)
代入scale=4,得到x = m/4 + 3/8,这个偏移会让采样点整体向右移动,刚好修正原有的左偏问题。
3. 验证效果
用修正后的坐标计算放大后的中心区域,你会得到对称的数值:比如原中心的3,放大后对应的4个值会围绕3对称分布,而非像之前那样递增到1.75后再变化,质心会回到原数据的对称中心位置。
内容的提问来源于stack exchange,提问作者user877329
相关产品推荐
相关产品推荐

