サンプル / カーネルフィルタ

ここでは主に下記についての説明を行っています。

  • 構造体のポインタ型メンバに対する設定


ここでの例で使用される構造体 F_FILTER_KERNEL_T のメンバ pDOUBLE 型ポインタであり、 このメンバにカーネルの値が格納された配列を指定することになります。

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) であるものとします