Numpy との連携


ここでは PyFIE と NumPy の連携機能について紹介しています。 これらの機能は NumPy を使用することが可能な環境でのみ有効となります。

なお、 ここで示されるサンプルコードでは、 下記のように NumPy のインポートが行われているものとします。

import numpy as np

まず PyFIE の画像オブジェクト(FHANDLE)の 属性 ndarray は、 その画像メモリを共有する numpy.ndarray となります。 これを介して画像メモリに対するアクセスを行うことが可能となります。

C 言語
FHANDLE img = fnFIE_img_root_alloc(F_IMG_UC8, 1, 1024, 1024);


// 全画素の値を 0 クリア.
fnFIE_img_clear(img, 0);

// 水平垂直方向 2 画素おきに画素値を設定.
{
    UCHAR * adrs = fnFIE_img_get_adrs(img);
    INT_PTR step = fnFIE_img_get_step(img);
    INT x, y;

    for(y = 0; y < 1024; y += 2){
        UCHAR * p = adrs + y * step;

        for(x = 0; x < 1024; x += 2){
            p[x] = 255;
        }
    }
}


fnFIE_free_object(img);
Python
img = pyfie.fnFIE_img_root_alloc(pyfieF_IMG_UC8, 1, 1024, 1024)


# 全画素の値を 0 クリア.
img.ndarray[:] = 0

# 水平垂直方向 2 画素おきに画素値を設定.
img.ndarray[::2, ::2] = 255

# (上記は画像オブジェクト img の画像メモリに対して
#  直接処理を行っていることになります)

下記は属性 ndarray を使用して PyFIE の画像オブジェクトに対して NumPy が提供する関数を使用する例です。

Python
# 入力画像を PyFIE 画像オブジェクトとして用意
src = pyfie.FHANDLE()
pyfie.fnFIE_img_load_bmp("filename.bmp", src, pyfie.F_COLOR_IMG_TYPE_UC8)


# Numpy による FFT 変換.
fft = np.fft.fft2(src.ndarray)
Python
# 入出力画像を PyFIE 画像オブジェクトとして用意
src = pyfie.FHANDLE()
pyfie.fnFIE_img_load_bmp("filename.bmp", src, pyfie.F_COLOR_IMG_TYPE_UC8)

dst = src.empty_like(pyfie.F_IMG_DOUBLE)


# Numpy による水平方向積分画像の作成
np.cumsum(src.ndarray, out=dst.ndarray, axis=1)

また PyFIE 関数の引数において画像オブジェクトを要求するものに対しては、 numpy.ndarray を直接渡すことができます。

Python
# 入力画像を Numpy の ndarray として用意
src = np.random.normal(loc=128, scale=3.5, size=(480, 512))


# PyFIE 関数による平均値計算
ave = pyfie.DOUBLE()
pyfie.fnFIE_img_calc_average(src, ave)
Python
# 入力画像を PyFIE 画像オブジェクトとして用意
src = pyfie.FHANDLE()
pyfie.fnFIE_img_load_bmp("filename.bmp", src, pyfie.F_COLOR_IMG_TYPE_UC8)

# 出力画像を Numpy の ndarray として用意
dst = np.ndarray(
    shape=(src.height, src.width), dtype=src.dtype
)


# PyFIE 関数による平滑化
pyfie.fnFIE_average(src, dst, pyfie.F_BORDER_NONE, 0)


この他、 PyFIE 画像オブジェクトと numpy.ndarray 間相互でのオブジェクト複製や、 PyFIE 算術型ポインタと numpy.ndarray の連携等が機能として用意されています。

詳細については "詳細 >> 拡張機能 >> NumPy との連携 " を参照ください。