数字图像处理双线性插值:1.5倍缩放时1.5列的物理矩阵表示
Great question — let's break this down step by step, since bilinear interpolation's handling of subpixel positions is often where folks get tripped up.
1. What "1.5 Column" Means in the Original Physical Matrix
The original image’s matrix is a discrete grid of pixels, with columns indexed by integers (0, 1, 2, ..., W-1 for an image of width W). Each integer index corresponds to the center of that pixel’s physical area.
A "1.5 column" position is a subpixel location: it sits exactly halfway between the centers of the 1st column (index 1) and 2nd column (index 2) pixels in the original matrix. It’s not a discrete pixel itself, but a continuous point between two existing pixels.
2. How Bilinear Interpolation Uses This Position
Bilinear interpolation calculates the value at this subpixel point by linearly combining the values of the surrounding pixels. Let’s assume the row position is an integer y for simplicity:
- First, identify the nearest integer columns around 1.5:
floor(1.5) = 1andceil(1.5) = 2. - Since 1.5 is exactly halfway between 1 and 2, each column gets an equal weight of 0.5.
- The interpolated value at
(y, 1.5)is:interpolated_value = 0.5 * I[y][1] + 0.5 * I[y][2]
If the row position was also a subpixel (e.g., y=2.3), you’d first interpolate along the columns for rows 2 and 3, then interpolate those two results along the row direction using weights matching the fractional part (0.7 for row 2, 0.3 for row 3).
3. Quick Edge Case Note
If your subpixel position was closer to an edge (e.g., 0.2 columns), you’d still use the nearest valid columns (0 and 1 here) and adjust weights accordingly (0.8 for column 0, 0.2 for column 1). Most implementations handle boundary positions by clamping to edge pixels or mirroring, but that’s a separate detail.
内容的提问来源于stack exchange,提问作者Satyaki Chatterjee

