サンプル / カーネルフィルタ¶
ここでは主に下記についての説明を行っています。
構造体のポインタ型メンバに対する設定
ここでの例で使用される構造体 F_FILTER_KERNEL_T
のメンバ p は
DOUBLE
型ポインタであり、 このメンバにカーネルの値が格納された配列を指定することになります。
typedef struct {
// カーネルを表す1次元配列のポインタ
DOUBLE *p;
// 除算値
DOUBLE denom;
// カーネルのサイズ
INT size_x;
INT size_y;
// カーネルのアンカー位置
INT anchor_x;
INT anchor_y;
} F_FILTER_KERNEL_T;
下記は、 メンバ p に対して PyFIE 配列(多次元) を設定する例です。
- C 言語
F_FILTER_KERNEL_T kernel; DOUBLE * p = NULL; // 2 x 2 のカーネルフィルタ kernel.size_x = 2; kernel.size_y = 2; kernel.anchor_x = 0; kernel.anchor_y = 1; p = (DOUBLE *)fnOAL_malloc(sizeof(DOUBLE) * kernel.size_x * kernel_size_y); p[kernel.size_x*0 + 0] = 1; p[kernel.size_x*0 + 1] = 0; p[kernel.size_x*1 + 0] = -2; p[kernel.size_x*1 + 1] = 1; kernel.p = p; kernel.denom = 1; fnFIE_kernel_filter( src, dst, &kernel, F_BORDER_NONE, 0 ); fnOAL_free(p); p = NULL; // 5 x 5 のカーネルフィルタ kernel.size_x = 5; kernel.size_y = 5; kernel.anchor_x = 2; kernel.anchor_y = 2; p = (DOUBLE *)fnOAL_malloc(sizeof(DOUBLE) * kernel.size_x * kernel_size_y); p[kernel.size_x*0 + 0] = 2; p[kernel.size_x*0 + 1] = 2; p[kernel.size_x*0 + 2] = 4; p[kernel.size_x*0 + 3] = 2; p[kernel.size_x*0 + 4] = 2; p[kernel.size_x*1 + 0] = 1; p[kernel.size_x*1 + 1] = 1; p[kernel.size_x*1 + 2] = 2; p[kernel.size_x*1 + 3] = 1; p[kernel.size_x*1 + 4] = 1; p[kernel.size_x*2 + 0] = 0; p[kernel.size_x*2 + 1] = 0; p[kernel.size_x*2 + 2] = 0; p[kernel.size_x*2 + 3] = 0; p[kernel.size_x*2 + 4] = 0; p[kernel.size_x*3 + 0] = -1; p[kernel.size_x*3 + 1] = -1; p[kernel.size_x*3 + 2] = -2; p[kernel.size_x*3 + 3] = -1; p[kernel.size_x*3 + 4] = -1; p[kernel.size_x*4 + 0] = -2; p[kernel.size_x*4 + 1] = -2; p[kernel.size_x*4 + 2] = -4; p[kernel.size_x*4 + 3] = -2; p[kernel.size_x*4 + 4] = -2; kernel.p = p; kernel.denom = 1; fnFIE_kernel_filter( src, dst, &kernel, F_BORDER_NONE, 0 ); fnOAL_free(p);
- Python
kernel = pyfie.F_FILTER_KERNEL_T() # 2 x 2 のカーネルフィルタ kernel.size_x = 2 kernel.size_y = 2 kernel.anchor_x = 0 kernel.anchor_y = 1 p = pyfie.DOUBLE.ARRAY(kernel.size_y, kernel.size_x) p[0][0] = 1 p[0][1] = 0 p[1][0] = -2 p[1][1] = 1 kernel.p = p kernel.denom = 1 pyfie.fnFIE_kernel_filter( src, dst, kernel, pyfie.F_BORDER_NONE, 0 ) # 5 x 5 のカーネルフィルタ kernel.size_x = 5 kernel.size_y = 5 kernel.anchor_x = 2 kernel.anchor_y = 2 p = pyfie.DOUBLE.ARRAY(kernel.size_y, kernel.size_x) p[0][:] = 2, 2, 4, 2, 2 p[1][:] = 1, 1, 2, 1, 1 p[2][:] = 0, 0, 0, 0, 0 p[3][:] = -1, -1, -2, -1, -1 p[4][:] = -2, -2, -4, -2, -2 kernel.p = p kernel.denom = 1 pyfie.fnFIE_kernel_filter( src, dst, kernel, pyfie.F_BORDER_NONE, 0 )
変数 src 、 dst は確保済の画像オブジェクト(FHANDLE) であるものとします
構造体のポインタ型メンバの設定には Python 組み込み型のリスト(list
)やタプル(tuple
)を使用することができます。
下記は PyFIE 配列の代わりにタプルを使用して
構造体 F_FILTER_KERNEL_T
のカーネル値(メンバ p
)設定を行う例です。
- C 言語
F_FILTER_KERNEL_T kernel; DOUBLE * p = NULL; // 5 x 5 のカーネルフィルタ kernel.size_x = 5; kernel.size_y = 5; kernel.anchor_x = 2; kernel.anchor_y = 2; p = (DOUBLE *)fnOAL_malloc(sizeof(DOUBLE) * kernel.size_x * kernel_size_y); p[kernel.size_x*0 + 0] = 2; p[kernel.size_x*0 + 1] = 2; p[kernel.size_x*0 + 2] = 4; p[kernel.size_x*0 + 3] = 2; p[kernel.size_x*0 + 4] = 2; p[kernel.size_x*1 + 0] = 1; p[kernel.size_x*1 + 1] = 1; p[kernel.size_x*1 + 2] = 2; p[kernel.size_x*1 + 3] = 1; p[kernel.size_x*1 + 4] = 1; p[kernel.size_x*2 + 0] = 0; p[kernel.size_x*2 + 1] = 0; p[kernel.size_x*2 + 2] = 0; p[kernel.size_x*2 + 3] = 0; p[kernel.size_x*2 + 4] = 0; p[kernel.size_x*3 + 0] = -1; p[kernel.size_x*3 + 1] = -1; p[kernel.size_x*3 + 2] = -2; p[kernel.size_x*3 + 3] = -1; p[kernel.size_x*3 + 4] = -1; p[kernel.size_x*4 + 0] = -2; p[kernel.size_x*4 + 1] = -2; p[kernel.size_x*4 + 2] = -4; p[kernel.size_x*4 + 3] = -2; p[kernel.size_x*4 + 4] = -2; kernel.p = p; kernel.denom = 1; fnFIE_kernel_filter( src, dst, &kernel, F_BORDER_NONE, 0 ); fnOAL_free(p);
- Python
kernel = pyfie.F_FILTER_KERNEL_T() # 5 x 5 のカーネルフィルタ kernel.size_x = 5 kernel.size_y = 5 kernel.anchor_x = 2 kernel.anchor_y = 2 kernel.p = ( 2, 2, 4, 2, 2, 1, 1, 2, 1, 1, 0, 0, 0, 0, 0, -1, -1, -2, -1, -1, -2, -2, -4, -2, -2 ) kernel.denom = 1 pyfie.fnFIE_kernel_filter( src, dst, kernel, pyfie.F_BORDER_NONE, 0 )
変数 src 、 dst は確保済の画像オブジェクト(FHANDLE) であるものとします