Bilinear interpolation with non-aligned input points

后端 未结 2 1179
Happy的楠姐
Happy的楠姐 2020-12-24 08:59

I have a non-grid-aligned set of input values associated with grid-aligned output values. Given a new input value I want to find the output:

      &nb

2条回答
  •  再見小時候
    2020-12-24 09:26

    You can bilinearly interpolate in any convex tetragon. A cartesian grid is just a bit simpler because the calculation of interpolation parameters is trivial. In the general case you interpolate as follows:

    parameters alpha, beta
    interpolated value = (1 - alpha) * ((1 - beta) * p1 + beta * p2) + alpha * ((1 - beta) * p3 + beta * p4)
    

    In order to calculate the parameters, you have to solve a system of equations. Put your input values in the places of p1 through p4 and solve for alpha and beta.

    Then put your output values in the places of p1 through p4 and use the calculated parameters to calculate the final interpolated output value.

    For a regular grid, the parameter calculation comes down to:

    alpha = x / cell width
    beta  = y / cell height
    

    which automatically solves the equations.

    Here is a sample interpolation for alpha=0.3 and beta=0.6

    Sample interpolation

    Actually, the equations can be solved analytically. However, the formulae are quite ugly. Therefore, iterative methods are probably nicer. There are two solutions for the system of equations. You need to pick the solution where both parameters are in [0, 1].

    First solution:

    alpha = -(b e - a f + d g - c h + sqrt(-4 (c e - a g) (d f - b h) +
            (b e - a f + d g - c h)^2))/(2 c e - 2 a g)    
    beta  = (b e - a f - d g + c h + sqrt(-4 (c e - a g) (d f - b h) + 
            (b e - a f + d g - c h)^2))/(2 c f - 2 b g)
    

    where

    a = -p1.x + p3.x
    b = -p1.x + p2.x
    c = p1.x - p2.x - p3.x + p4.x
    d = center.x - p1.x
    e = -p1.y + p3.y
    f = -p1.y + p2.y
    g = p1.y - p2.y - p3.y + p4.y
    h = center.y - p1.y
    

    Second solution:

    alpha = (-b e + a f - d g + c h + sqrt(-4 (c e - a g) (d f - b h) + 
            (b e - a f + d g - c h)^2))/(2 c e - 2 a g)
    beta  = -((-b e + a f + d g - c h + sqrt(-4 (c e - a g) (d f - b h) + 
            (b e - a f + d g - c h)^2))/( 2 c f - 2 b g))
    

提交回复
热议问题