10

Pythonでnumpy配列として表される画像データの双一次補間を実装するにはどうすればよいですか?

4

1 に答える 1

35

このトピックに関する多くの質問と多くの回答が見つかりましたが、データがグリッド上のサンプル (つまり、長方形の画像) で構成され、numpy 配列として表される一般的なケースでは効率的ではありませんでした。この関数はリストを x 座標と y 座標の両方として受け取ることができ、ループを必要とせずにルックアップと合計を実行します。

def bilinear_interpolate(im, x, y):
    x = np.asarray(x)
    y = np.asarray(y)

    x0 = np.floor(x).astype(int)
    x1 = x0 + 1
    y0 = np.floor(y).astype(int)
    y1 = y0 + 1

    x0 = np.clip(x0, 0, im.shape[1]-1);
    x1 = np.clip(x1, 0, im.shape[1]-1);
    y0 = np.clip(y0, 0, im.shape[0]-1);
    y1 = np.clip(y1, 0, im.shape[0]-1);

    Ia = im[ y0, x0 ]
    Ib = im[ y1, x0 ]
    Ic = im[ y0, x1 ]
    Id = im[ y1, x1 ]

    wa = (x1-x) * (y1-y)
    wb = (x1-x) * (y-y0)
    wc = (x-x0) * (y1-y)
    wd = (x-x0) * (y-y0)

    return wa*Ia + wb*Ib + wc*Ic + wd*Id
于 2012-10-04T14:12:15.947 に答える