画像オブジェクトの確保


ここでは画像オブジェクトの確保を簡単に行う方法について説明します。

FIE(C 言語) における画像オブジェクトの確保では、 fnFIE_img_root_alloc() 等の "画像確保関数群" が使用されます。 PyFIE においても同様に、 これらの関数群を使用して画像オブジェクトの確保を行うことができます。

C 言語
INT ch = 1, width = 2048, height = 1024;

FHANDLE img = NULL;
FHANDLE roi = NULL;

// 画像オブジェクトの確保
img = fnFIE_img_root_alloc(F_IMG_UC8, ch, width, height);
roi = fnFIE_img_child_alloc(img, width/4, height/4, width/2, height/2);

fnFIE_free_object(roi);
fnFIE_free_object(img);
Python
ch, width, height = 1, 2048, 1024

# 画像オブジェクトの確保
img = pyfie.fnFIE_img_root_alloc(pyfie.F_IMG_UC8, ch, width, height)
roi = pyfie.fnFIE_img_child_alloc(img, width/4, height/4, width/2, height/2)

注釈

基本的な使い方 にも記していますが、 PyFIE では確保した画像オブジェクトを解放する必要はありません。 これに対して FIE(C 言語) において確保した画像オブジェクトの解放処理は必須となりますが、 以降のサンプルコードでは簡略化のためにこれを省略しています。


上記の例のような FIE ライブラリの "画像確保関数群" を使用することの他に、 PyFIE では画像オブジェクトの確保を簡単に行うための手段がいくつか用意されています。 以降ではそれらの手段について説明します。


ルート画像オブジェクトの確保

PyFIE モジュールのトップレベル名前空間には img_uc8()img_bin() 等、 "特定の画像型に対する画像確保" を行うユーティリティ関数が用意されています。 これらの関数は fnFIE_img_root_alloc() 呼び出しの単なる略記法として使用できます。

C 言語
FHANDLE img1 = fnFIE_img_root_alloc(F_IMG_UC8, 3, 2048, 1024);
FHANDLE img2 = fnFIE_img_root_alloc(F_IMG_BIN, 1, 2048, 1024);
Python
# チャネル数の指定は第 3 引数で行います
img1 = pyfie.img_uc8(2048, 1024, 3)

# チャネル数 1 の場合は指定を省略できます.
img2 = pyfie.img_bin(2048, 1024)

画像オブジェクトの情報取得

PyFIE における画像オブジェクトは f_typechwidthheightstep 等のプロパティをもっており、 画像オブジェクトの情報を得ることができます。

下記例では、 画像確保時にこれらのプロパティを利用しています。

C 言語
FHANDLE dst;
INT type, ch, width, height;

fnFIE_img_get_params(src, &ch, &type, NULL, &width, &height);

dst = fnFIE_img_root_alloc(type, ch, width, height);
Python
dst = pyfie.fnFIE_img_root_alloc(src.f_type, src.ch, src.width, src.height)
  • 変数 src は確保済の画像オブジェクト(FHANDLE) であるものとします


画像オブジェクトからの画像オブジェクト生成

先ほどの例では確保済の画像オブジェクト (src) と同じサイズの画像オブジェクト (dst) の確保を行っていましたが、 画像オブジェクトのメソッド empty_like() を使用するとこれを簡単に行うことができます。

C 言語
FHANDLE dst;
FHANDLE dst_bin;
INT type, ch, width, height;

fnFIE_img_get_params(src, &ch, &type, NULL, &width, &height);

dst = fnFIE_img_root_alloc(type, ch, width, height);
dst_bin = fnFIE_img_root_alloc(F_IMG_BIN, ch, width, height);
Python
# src と同じサイズ、 同じ画像型の画像オブジェクトを生成.
dst = src.empty_like()

# src と同じサイズの 2 値画像オブジェクトを生成.
dst_bin = src.empty_like(pyfie.F_IMG_BIN)
  • 変数 src は確保済の画像オブジェクト(FHANDLE) であるものとします


また FIE ライブラリでは画像オブジェクト内の特定領域(矩形)を処理対象としたい場合、 fnFIE_img_child_alloc() 関数等を用いて特定領域に対するチャイルド画像オブジェクトを作成します。 PyFIE では画像オブジェクトのメソッド roi() を使用してこれを簡単に行うことができます。

roi() メソッドは下記例のように、 入出力画像の特定領域に処理を行う場合等で役に立ちます。

C 言語
FHANDLE src_roi;
FHANDLE dst_roi;

INT width, height, roi_x, roi_y, roi_w, roi_h;

fnFIE_img_get_params(src, NULL, NULL, NULL, &width, &height);
roi_x = width / 4;
roi_y = height / 4;
roi_w = width / 2;
roi_h = height / 2;

src_roi = fnFIE_img_child_alloc(src, roi_x, roi_y, roi_w, roi_h);
dst_roi = fnFIE_img_child_alloc(dst, roi_x, roi_y, roi_w, roi_h);

fnFIE_average(
    src_roi,
    dst_roi,
    F_BORDER_NONE, 0
);
Python
roi_x = src.width / 4
roi_y = src.height / 4
roi_w = src.width / 2
roi_h = src.height / 2

pyfie.fnFIE_average(
    src.roi(roi_x, roi_y, roi_w, roi_h),
    dst.roi(roi_x, roi_y, roi_w, roi_h),
    pyfie.F_BORDER_NONE, 0
)
  • 変数 src 、 dst は同じサイズとして確保済の画像オブジェクト(FHANDLE) であるものとします


同様に画像オブジェクトのメソッド single_ch() は、 指定チャネルのチャイルド画像生成を行うことができますので、 入出力画像の特定チャネルに対して処理を行う場合等で役に立ちます。

C 言語
FHANDLE dst;
FHANDLE src_single;
FHANDLE dst_single;

INT type, ch, width, height;
INT i;

fnFIE_img_get_params(src, &ch, &type, NULL, &width, &height);


// 入力画像 src と同サイズの出力画像 dst を確保.
dst = fnFIE_img_root_alloc(type, ch, width, height);

src_single = fnFIE_img_child_alloc(0, 0, 0, 0, 0);
dst_single = fnFIE_img_child_alloc(0, 0, 0, 0, 0);


for( i = 0; i < ch; i ++ ){
    DOUBLE coeff = 1.0 + 0.5 * i;

    fnFIE_img_child_attach_single_ch(
        src_single, src, i, 0, 0, width, height
    );
    fnFIE_img_child_attach_single_ch(
        dst_single, dst, i, 0, 0, width, height
    );


    // チャネルごとに適当な処理を行う.
    fnFIE_img_mul_const(
        src_single, coeff, dst_single
    );
}
Python
# 入力画像 src と同サイズの出力画像 dst を確保.
dst = src.empty_like()

for i in range(src.ch):
    coeff = 1.0 + 0.5 * i


    # チャネルごとに適当な処理を行う.
    pyfie.fnFIE_img_mul_const(
        src.single_ch(i), coeff, dst.single_ch(i)
    )
  • 変数 src は確保済の複数チャネル画像オブジェクト(FHANDLE) であるものとします


ここで紹介した画像オブジェクト機能についての詳細は、 画像オブジェクト拡張機能 を参照ください。