関数 | |
INT FVALGAPI | fnFIE_meanshift_multithreshold (FHANDLE hsrc, FHANDLE hdst, INT **thresh, INT *num_discrimination, DOUBLE bandwidth, DOUBLE union_thresh, INT dst_mode) |
Mean-Shift 法による多値化 | |
INT FVALGAPI | fnFIE_discrimination_multithreshold (FHANDLE hsrc, FHANDLE hdst, INT *thresh, INT num_discrimination, INT dst_mode) |
判別分析法による多値化 | |
INT FVALGAPI | fnFIE_kittler_multithreshold (FHANDLE hsrc, FHANDLE hdst, INT *thresh, INT num_discrimination, INT dst_mode) |
キトラー(Kittler)法による多値化 |
INT FVALGAPI fnFIE_meanshift_multithreshold | ( | FHANDLE | hsrc, | |
FHANDLE | hdst, | |||
INT ** | thresh, | |||
INT * | num_discrimination, | |||
DOUBLE | bandwidth, | |||
DOUBLE | union_thresh, | |||
INT | dst_mode | |||
) |
Mean-Shift 法による多値化
Mean-Shift 法によるクラスタリングを利用し、多値化処理をします。
多値化の分割数は自動的に決まります。
画素を標本点と見なして濃度値空間で Mean-Shift を実行し、 近い収束値に到達した標本点を同じクラスタに属するものとします。 濃度値が近いものはひとまとまりにされ、遠いものと分離されます。 また、小さなクラスタを濃度値が近い大きなクラスタにまとめ、過剰な濃度値の分割を抑制することもできます。
上記のようにクラスタリングを行った後、1つのクラスタに1つの出力値を割り当てることによって多値化を行います。
本関数では、確率密度関数の推定には Epanechnikov カーネルを使用します。
そのほか、Mean-Shift 法に関するアルゴリズムは、 fnFIE_meanshift_filter() を参照してください。
[in] | hsrc | 入力画像オブジェクト (type:uc8,us16,s16 and ch:1) |
[out] | hdst | 結果格納用画像オブジェクト 出力画像が必要でない場合には NULL を指定可能です。 NULL でない場合、入力画像オブジェクトと同じ画像タイプ、サイズの 1ch 画像である必要があります。 |
[out] | thresh | 多値化しきい値結果格納バッファ しきい値が必要でない場合には NULL を指定可能です。 NULL 以外が指定された場合、 thresh は、関数内部で必要なメモリを確保します。 関数へのエントリー時、*thresh は NULL でなければいけません。確保されたメモリは、 fnOAL_free() で解放してください。 num_discrimination が 1 以外の場合、thresh は、(num_discrimination - 1) 個分のメモリを確保し、しきい値を格納します。 num_discrimination が 1 の場合は、要素1個分のメモリを確保し、入力画像が取りうる値の最小値を格納します。 |
[out] | num_discrimination | 多値化の分割数 多値化の分割数が必要でない場合には NULL を指定可能です。 |
[in] | bandwidth | カーネル幅 (0 < bandwidth) 大きくなるほど多値化の分割数が小さくなります。 また、収束値の差が bandwidth 以下の標本点は、同じクラスタと見なされます。つまり、dst_mode = 0 の場合、出力画像の出現濃度値の間隔は、bandwidth 以上が保証されます。 |
[in] | union_thresh | クラスタ統合しきい値 (0 ≦ union_thresh ≦ 1) 所属する標本点数が union_thresh * (全体の画素数) 以下のクラスタを最も近いものに統合します。推奨値は、0.01 ~ 0.05 です。 |
[in] | dst_mode | 出力画像を生成する際の動作モード (hdst に NULL が指定された場合にはこの値は使用されません)
|
F_ERR_NONE | 正常終了 | |
F_ERR_NOMEMORY | メモリ不足 | |
F_ERR_INVALID_IMAGE | 画像オブジェクト異常 | |
F_ERR_INVALID_PARAM | パラメータ異常 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
![]() 入力画像(type:uc8) | ![]() 結果画像(dst_mode = 0) | ![]() 結果画像(dst_mode = 1) |
INT FVALGAPI fnFIE_discrimination_multithreshold | ( | FHANDLE | hsrc, | |
FHANDLE | hdst, | |||
INT * | thresh, | |||
INT | num_discrimination, | |||
INT | dst_mode | |||
) |
判別分析法による多値化
判別分析法による2値化(fnFIE_discrimination_threshold() )を、多値化に拡張したものです。多値化処理には動的計画法を実装し、アルゴリズム上での高速化を図っています。
[in] | hsrc | 入力画像オブジェクト(type:uc8,us16,s16 and ch:1) |
[out] | hdst | 結果格納用画像オブジェクト。入力画像オブジェクトと同じ画像タイプ、サイズであること。出力画像が必要でない場合にはNULLを指定可能です。 |
[out] | thresh | 多値化しきい値結果格納バッファ。しきい値の格納用に num_discrimination -1 個のメモリを確保しておいてください。しきい値が必要でない場合にはNULLを指定可能です。 |
[in] | num_discrimination | 多値化の分割数(2 ≦ num_discrimination ≦ 入力画像の持つ階調数) |
[in] | dst_mode | 出力画像を生成する際の各区間の値を決定する動作モード(hdst にNULLが指定された場合にはこの値は使用されません)
|
F_ERR_NONE | 正常終了 | |
F_ERR_NOMEMORY | メモリ不足 | |
F_ERR_INVALID_IMAGE | 画像オブジェクト異常 | |
F_ERR_INVALID_PARAM | パラメータ異常 | |
F_ERR_CALC_IMPOSSIBLE | 計算不可能 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
// エラー処理は省略しているので注意して下さい。 #include "fie.h" #include <stdio.h> VOID discrimination_multithreshold() { FHANDLE hsrc = NULL; FHANDLE hdst = NULL; FHANDLE hdst2 = NULL; INT width, height; INT threshold[4]; //5値化を行うためにしきい値を格納する配列を4つ宣言 INT i; // 入力画像の読み込み // 適当な画像を読み込んでください fnFIE_load_png( "book.png", &hsrc, F_COLOR_IMG_TYPE_UC8 ); //入力画像の幅と高さを取得します width = fnFIE_img_get_width( hsrc ); height = fnFIE_img_get_height( hsrc ); //出力画像の領域を確保します hdst = fnFIE_img_root_alloc( F_IMG_UC8, 1, width, height ); hdst2 = fnFIE_img_root_alloc( F_IMG_UC8, 1, width, height ); //判別分析法により画像を多値化します //dst_mode=0の場合(5値化),しきい値も取得する fnFIE_discrimination_multithreshold( hsrc, hdst, threshold, 5, 0); //dst_mode=1の場合(5値化),しきい値は取得しない fnFIE_discrimination_multithreshold( hsrc, hdst2, NULL, 5, 1); //判別分析法により求めたしきい値を表示します(しきい値の個数4) for(i=0; i < 4; i++) { printf("しきい値[%d] = %d\n", i, threshold[i]); } //結果画像を保存します fnFIE_save_png("result.png", hdst, -1); fnFIE_save_png("result2.png", hdst2, -1); //確保した画像領域を解放します fnFIE_free_object( hsrc ); fnFIE_free_object( hdst ); fnFIE_free_object( hdst2 ); } INT main(VOID) { // FIEライブラリの使用前に必ずコールする必要があります。 fnFIE_setup(); discrimination_multithreshold(); // 終了処理 fnFIE_teardown(); return 0; }
![]() 入力画像(type:uc8) | ![]() 処理結果画像(dst_mode =0) | ![]() 処理結果画像(dst_mode =1) |
val[ 0 ]: min ≦ X <thresh[ 0 ] val[ 1 ]:thresh[ 0 ] ≦ X <thresh[ 1 ] : : : : : : : : val[n-2]:thresh[n-3] ≦ X <thresh[n-2] val[n-1]:thresh[n-2] ≦ X ≦ maxとなります。
INT FVALGAPI fnFIE_kittler_multithreshold | ( | FHANDLE | hsrc, | |
FHANDLE | hdst, | |||
INT * | thresh, | |||
INT | num_discrimination, | |||
INT | dst_mode | |||
) |
キトラー(Kittler)法による多値化
キトラー法による2値化( fnFIE_kittler_threshold() )を、多値化に拡張したものです。多値化処理には動的計画法を実装し、アルゴリズム上での高速化を図っています。
[in] | hsrc | 入力画像オブジェクト(type:uc8,us16,s16 and ch:1) |
[out] | hdst | 結果格納用画像オブジェクト。入力画像オブジェクトと同じ画像タイプ、サイズであること。出力画像が必要でない場合にはNULLを指定可能です。 |
[out] | thresh | 多値化しきい値結果格納バッファ。しきい値の格納用に num_discrimination -1 個のメモリを確保しておいてください。しきい値が必要でない場合にはNULLを指定可能です。 |
[in] | num_discrimination | 多値化の分割数(2 ≦ num_discrimination ≦ 入力画像の持つ階調数) ただし、画像の階調数/2 よりも大きな値を指定すると計算不可能になってしまいますので、F_ERR_CALC_IMPOSSIBLE を返します。 |
[in] | dst_mode | 出力画像を生成する際の各区間の値を決定する動作モード(hdst にNULLが指定された場合にはこの値は使用されません)
|
F_ERR_NONE | 正常終了 | |
F_ERR_NOMEMORY | メモリ不足 | |
F_ERR_INVALID_IMAGE | 画像オブジェクト異常 | |
F_ERR_INVALID_PARAM | パラメータ異常 | |
F_ERR_CALC_IMPOSSIBLE | 計算不可能 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
// エラー処理は省略しているので注意して下さい。 #include "fie.h" #include <stdio.h> VOID kittler_multithreshold() { FHANDLE hsrc = NULL; FHANDLE hdst = NULL; FHANDLE hdst2 = NULL; INT width, height; INT threshold[4]; //5値化を行うためにしきい値を格納する配列を4つ宣言 INT i; // 入力画像の読み込み // 適当な画像を読み込んでください fnFIE_load_png( "book.png", &hsrc, F_COLOR_IMG_TYPE_UC8 ); //入力画像の幅と高さを取得します width = fnFIE_img_get_width( hsrc ); height = fnFIE_img_get_height( hsrc ); //出力画像の領域を確保します hdst = fnFIE_img_root_alloc( F_IMG_UC8, 1, width, height ); hdst2 = fnFIE_img_root_alloc( F_IMG_UC8, 1, width, height ); //キトラー(kittler)により画像を多値化します //dst_mode=0の場合(5値化),しきい値も取得する fnFIE_kittler_multithreshold( hsrc, hdst, threshold, 5, 0); //dst_mode=1の場合(5値化),しきい値は取得しない fnFIE_kittler_multithreshold( hsrc, hdst2, NULL, 5, 1); //判別分析法により求めたしきい値を表示します(しきい値の個数4) for(i=0; i < 4; i++) { printf("しきい値[%d] = %d\n", i, threshold[i]); } //結果画像を保存します fnFIE_save_png("result.png", hdst, -1); fnFIE_save_png("result2.png", hdst2, -1); //確保した画像領域を解放します fnFIE_free_object( hsrc ); fnFIE_free_object( hdst ); fnFIE_free_object( hdst2 ); } INT main(VOID) { // FIEライブラリの使用前に必ずコールする必要があります。 fnFIE_setup(); kittler_multithreshold(); // FIEライブラリの終了処理 fnFIE_teardown(); return 0; }
![]() 入力画像(type:uc8) | ![]() 処理結果画像(dst_mode =0) | ![]() 処理結果画像(dst_mode =1) |
val[ 0 ]: min ≦ X <thresh[ 0 ] val[ 1 ]:thresh[ 0 ] ≦ X <thresh[ 1 ] : : : : : : : : val[n-2]:thresh[n-3] ≦ X <thresh[n-2] val[n-1]:thresh[n-2] ≦ X ≦ maxとなります。