関数 | |
INT FVALGAPI | fnFIE_niblack_threshold (FHANDLE hSrc, FHANDLE hDst, INT iH, INT iV, DOUBLE dK, INT iBrdMod) |
局所平均値と標準偏差を用いたNiblack法による画像2値化 | |
INT FVALGAPI | fnFIE_sauvola_threshold (FHANDLE hSrc, FHANDLE hDst, INT iH, INT iV, DOUBLE dK, DOUBLE dR, INT iBrdMod) |
局所平均値と標準偏差を用いてSauvola法による画像2値化 | |
INT FVALGAPI | fnFIE_background_remove_threshold (FHANDLE hSrc, FHANDLE hDst, INT iH, INT iV) |
[非推奨]局所メディアン値をバックグランドとして除去して得られた画像を判別分析法で2値化 | |
INT FVALGAPI | fnFIE_background_remove_threshold2 (FHANDLE hSrc, FHANDLE hDst, INT iH, INT iV) |
局所メディアン値をバックグランドとして除去して得られた画像を判別分析法で2値化 | |
INT FVALGAPI | fnFIE_binarize (FHANDLE hsrc, FHANDLE hdst, DOUBLE threshold) |
固定しきい値による2値化 | |
INT FVALGAPI | fnFIE_hysteresis_stack_us16 (FHANDLE hMag, USHORT ushTHigh, USHORT ushTLow, FHANDLE hImg) |
ヒステリシス2値化(スタックを利用したアルゴリズム) | |
INT FVALGAPI | fnFIE_hysteresis_rle_uf (FHANDLE hMag, DOUBLE dTHigh, DOUBLE dTLow, UINT uiNoiseEdge, FHANDLE hImg) |
ヒステリシス特性による2値化(ランレングスを利用したアルゴリズム) | |
INT FVALGAPI | fnFIE_ptile_threshold (FHANDLE hSrc, FHANDLE hDst, INT *ipThresh, INT iRate) |
Pタイル法による画像2値化 | |
INT FVALGAPI | fnFIE_discrimination_threshold (FHANDLE hSrc, FHANDLE hDst, INT *ipThresh) |
[非推奨]判別分析法による画像2値化 | |
INT FVALGAPI | fnFIE_discrimination_threshold2 (FHANDLE hSrc, FHANDLE hDst, INT *ipThresh) |
判別分析法による画像2値化 | |
INT FVALGAPI | fnFIE_grad_hist_threshold (FHANDLE hSrc, FHANDLE hDst, INT *ipThresh, INT iEdgeFactor) |
微分ヒストグラム法による画像2値化 | |
INT FVALGAPI | fnFIE_lap_hist_threshold (FHANDLE hSrc, FHANDLE hDst, INT *ipThresh, INT iEdgeFactor) |
[非推奨]ラプラシアンヒストグラム法による画像の2値化 | |
INT FVALGAPI | fnFIE_lap_hist_threshold2 (FHANDLE hSrc, FHANDLE hDst, INT *ipThresh, INT iEdgeFactor) |
ラプラシアンヒストグラム法による画像の2値化 | |
INT FVALGAPI | fnFIE_kittler_threshold (FHANDLE hSrc, FHANDLE hDst, INT *ipThresh) |
キトラー(kittler)法による画像2値化 | |
INT FVALGAPI | fnFIE_shift_avr_threshold_ex (FHANDLE hsrc, FHANDLE hdst, INT size_x, INT size_y, INT border_mode, DOUBLE border_value) |
局所領域平均値による2値画像作成 ボーダー処理付き | |
INT FVALGAPI | fnFIE_shift_avr_threshold (FHANDLE hsrc, FHANDLE hdst, INT size_x, INT size_y) |
局所領域平均値による2値画像作成 | |
INT FVALGAPI | fnFIE_shift_avr_threshold_offset (FHANDLE hsrc, FHANDLE hdst, INT size_x, INT size_y, INT offset, INT border_mode, DOUBLE border_value) |
局所領域平均値とオフセットによる2値画像作成 ボーダー処理付き | |
INT FVALGAPI | fnFIE_shift_avr_threshold_offset_mask (FHANDLE hsrc, FHANDLE hdst, FHANDLE hmask, INT size_x, INT size_y, INT offset, INT border_mode, DOUBLE border_value) |
局所領域平均値とオフセットによる2値画像作成 マスク付き | |
INT FVALGAPI | fnFIE_band_threshold_ch (const FHANDLE hsrc, FHANDLE hdst, const DOUBLE *tlow, const DOUBLE *thigh, INT back_clear) |
2つの固定しきい値を用いたセグメンテーション処理 | |
INT FVALGAPI | fnFIE_band_threshold (FHANDLE hsrc, FHANDLE hdst, DOUBLE tlow, DOUBLE thigh) |
二つの固定しきい値を用いて2値化 | |
INT FVALGAPI | fnFIE_watershed (FHANDLE hSrc, FHANDLE hDst) |
Watershed法による領域分割 |
INT FVALGAPI fnFIE_niblack_threshold | ( | FHANDLE | hSrc, | |
FHANDLE | hDst, | |||
INT | iH, | |||
INT | iV, | |||
DOUBLE | dK, | |||
INT | iBrdMod | |||
) |
局所平均値と標準偏差を用いたNiblack法による画像2値化
入力画像の注目画素の閾値を、その周辺画素の平均値と標準偏差を用いて決定し(Niblack法)、 動的な2値化を行います。周辺画素として統計値を計算する局所領域のサイズは パラメータにより変更することが出来ます。
各画素の閾値の計算は下式にしたがって行われます。
ここで
dK パラメータは公式中の に対応します。 dK の値に制限はありませんが、-1と1の間の小数に設定することを勧めます。
iH と iV パラメータは注目画素周辺の平均値、標準偏差を計算する 局所領域(ウィンドウ)のサイズを指定するパラメータです。 局所領域のサイズは縦横別々に iH と iV パラメータにて指定できます。 サイズは 1〜255 の間の奇数を指定しなければいけません。 但し iH と iV に共に1が指定された場合はパラメータエラーとなりますので、 必ずどちらかを3以上の値にしてください。 また、局所領域のサイズは画像のサイズより小さくなければいけません。 指定された局所領域のサイズが画像サイズよりも大きい場合には、エラーになります。 局所領域のサイズは、2値化しようとしている画像内の目標物よりも大きく設定し、 かつ、局所領域内に前景と背景の両方が入るよう設定すると良い結果が得られます。
iBrdMod はボーダー拡張処理モードを指定するパラメータです。 本関数では局所領域の情報を使って処理を行うため、ボーダー拡張処理をしないと 画像の周囲に処理できない領域が出来ます。しかし、本パラメータにてボーダー拡張処理方法を 指定すると内部でボーダー拡張処理を行うため、画像の端まで結果を得ることが出来ます。 ボーダー拡張については fnFIE_copy_border() 関数を参照してください。
入力画像と出力画像は下記の条件をすべて満たしている必要が有ります。
[in] | hSrc | 入力画像 (type: uc8, us16, s16) |
[out] | hDst | 出力2値画像 (type: bin) |
[in] | iH | 局所領域の横サイズ ( 1〜255 の奇数。但し iH と iV のどちらかは3以上でなければならない) |
[in] | iV | 局所領域の縦サイズ ( 1〜255 の奇数。但し iH と iV のどちらかは3以上でなければならない) |
[in] | dK | 計算式の係数 ![]() |
[in] | iBrdMod | ボーダー処理モード
|
F_ERR_NONE | 正常終了 | |
F_ERR_NOMEMORY | メモリ不足 | |
F_ERR_INVALID_IMAGE | 不正な画像が渡された | |
F_ERR_INVALID_PARAM | パラメータ不正 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
// エラー処理は省略しているので注意して下さい。 #include "fie.h" VOID niblack_threshold() { FHANDLE hsrc = NULL; FHANDLE hdst = NULL; INT width, height; // 入力画像の読み込み // 適当な画像を読み込んでください 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_BIN, 1, width, height ); //Niblack法による画像2値化 //局所領域(ウィンドウ)サイズ11×11,係数-1,ボーダー処理CONTINUOUS //ウィンドウサイズは幅,高さ共に奇数でなければならない fnFIE_niblack_threshold(hsrc, hdst, 11, 11, -1, F_BORDER_CONTINUOUS); //結果画像を保存します fnFIE_save_png("result.png", hdst, -1); //確保した画像の領域を解放します fnFIE_free_object( hsrc ); fnFIE_free_object( hdst ); } INT main(VOID) { // FIEライブラリの使用前に必ずコールする必要があります。 fnFIE_setup(); niblack_threshold(); // 終了処理 fnFIE_teardown(); return 0; }
![]() 入力画像 | ![]() 処理結果画像 |
INT FVALGAPI fnFIE_sauvola_threshold | ( | FHANDLE | hSrc, | |
FHANDLE | hDst, | |||
INT | iH, | |||
INT | iV, | |||
DOUBLE | dK, | |||
DOUBLE | dR, | |||
INT | iBrdMod | |||
) |
局所平均値と標準偏差を用いてSauvola法による画像2値化
入力画像の注目画素の閾値を、その周辺画素の平均値と標準偏差を用いて決定し(Sauvola法)、 動的な2値化を行います。周辺画素として統計値を計算する局所領域のサイズは パラメータにより変更することが出来ます。
閾値の計算は下式にしたがって行われます。
ここで:
Sauvola法はNiblack法( fnFIE_niblack_threshold() )の改善手法です。 Niblack法に比べるとSauvola法は標準偏差の影響を重視し、係数 の影響も小さくなっています。
dK と dR パラメータは公式中の と
に対応します。 dR の絶対値が1より小さい場合は、パラメータ不正となります。但し、入力画像型がF_IMG_DOUBLEとF_IMG_FLOATの場合は、dR が0の場合にのみパラメータ不正となります。 その他に dK と dR の値の制限は有りませんが、 dK は -1と1の間の小数に、 dR は画素値の範囲内(入力画像内の最大画素値から最小画素値の間)に設定することを勧めます。 dR の設定にお困りの場合は次の様な値をお試しください。画像の値域が0〜255の場合は128を、0〜65535の場合は32768等。
iH と iV パラメータは注目画素周辺の平均値、標準偏差を計算する 局所領域(ウィンドウ)のサイズを指定するパラメータです。 局所領域のサイズは縦横別々に iH と iV パラメータにて指定できます。 サイズは 1〜255 の間の奇数を指定しなければいけません。 但し iH と iV に共に1が指定された場合はパラメータエラーとなりますので、 必ずどちらかを3以上の値にしてください。 また、局所領域のサイズは画像のサイズより小さくなければいけません。 指定された局所領域のサイズが画像サイズよりも大きい場合には、エラーになります。 局所領域のサイズは、2値化しようとしている画像内の目標物よりも大きく設定し、 かつ、局所領域内に前景と背景の両方が入るよう設定すると良い結果が得られます。
iBrdMod はボーダー拡張処理モードを指定するパラメータです。 本関数では局所領域の情報を使って処理を行うため、ボーダー拡張処理をしないと 画像の周囲に処理できない領域が出来ます。しかし、本パラメータにてボーダー拡張処理方法を 指定すると内部でボーダー拡張処理を行うため、画像の端まで結果を得ることが出来ます。 ボーダー拡張については fnFIE_copy_border() 関数を参照してください。
入力画像、平均値画像と出力画像は下記の条件をすべて満たしている必要が有ります。
[in] | hSrc | 入力画像 (type: uc8, us16, s16, float, double) |
[out] | hDst | 出力2値画像 (type: bin) |
[in] | iH | 局所領域の横サイズ ( 1〜255 の奇数。但し iH と iV のどちらかは3以上でなければならない) |
[in] | iV | 局所領域の縦サイズ ( 1〜255 の奇数。但し iH と iV のどちらかは3以上でなければならない) |
[in] | dK | 計算式の ![]() |
[in] | dR | 計算式の ![]() |
[in] | iBrdMod | ボーダー処理モード
|
F_ERR_NONE | 正常終了 | |
F_ERR_NOMEMORY | メモリ不足 | |
F_ERR_INVALID_IMAGE | 不正な画像が渡された | |
F_ERR_INVALID_PARAM | パラメータ不正 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
// エラー処理は省略しているので注意して下さい。 #include "fie.h" VOID sauvola_threshold() { FHANDLE hsrc = NULL; FHANDLE hdst = NULL; INT width, height; // 入力画像の読み込み // 適当な画像を読み込んでください 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_BIN, 1, width, height ); //Sauvola法による画像2値化 //局所領域サイズは奇数でなければならない fnFIE_sauvola_threshold(hsrc, hdst, 11, 11, 0.1, 100, F_BORDER_CONTINUOUS); //結果画像を保存します fnFIE_save_png("result.png", hdst, -1); //確保した画像の領域を解放します fnFIE_free_object( hsrc ); fnFIE_free_object( hdst ); } INT main(VOID) { // FIEライブラリの使用前に必ずコールする必要があります。 fnFIE_setup(); sauvola_threshold(); // 終了処理 fnFIE_teardown(); return 0; }
![]() 入力画像 | ![]() 処理結果画像 |
INT FVALGAPI fnFIE_background_remove_threshold | ( | FHANDLE | hSrc, | |
FHANDLE | hDst, | |||
INT | iH, | |||
INT | iV | |||
) |
[非推奨]局所メディアン値をバックグランドとして除去して得られた画像を判別分析法で2値化
iH と iV パラメータは注目画素周辺のメディアン値を計算する 局所領域(ウィンドウ)のサイズを指定するパラメータです。 局所領域のサイズは縦横別々に iH と iV パラメータにて指定できます。 サイズは 1〜253 の間の奇数を指定しなければいけません。 但し iH と iV に共に1が指定された場合はパラメータエラーとなりますので、 必ずどちらかを3以上の値にしてください。 また、局所領域のサイズは画像のサイズより小さくなければいけません。 指定された局所領域のサイズが画像サイズよりも大きい場合には、エラーになります。 局所領域のサイズは、2値化しようとしている画像内の目標物よりも大きく設定し、 かつ、局所領域内に前景と背景の両方が入るよう設定すると良い結果が得られます。
入力画像のボーダー拡張処理モードは指定できません。 関数内部にて F_BORDER_MIRROR2 を使ってボーダー拡張を行っています。 ボーダー拡張については fnFIE_copy_border() 関数を参照してください。
入力画像、平均値画像と出力画像は下記の条件をすべて満たしている必要が有ります。
[in] | hSrc | 入力画像 (type: uc8 ) |
[out] | hDst | 出力2値画像 (type: bin) |
[in] | iH | メディアンフィルタのフィルタ横サイズ ( 1〜253 の奇数。但し iH と iV のどちらかは3以上でなければならない) |
[in] | iV | メディアンフィルタのフィルタ縦サイズ ( 1〜253 の奇数。但し iH と iV のどちらかは3以上でなければならない) |
F_ERR_NONE | 正常終了 | |
F_ERR_NOMEMORY | メモリ不足 | |
F_ERR_INVALID_IMAGE | 不正な画像が渡された | |
F_ERR_INVALID_PARAM | パラメータ不正 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
// エラー処理は省略しているので注意して下さい。 #include "fie.h" VOID background_remove_threshold() { FHANDLE hsrc = NULL; FHANDLE hdst = NULL; INT width, height; // 入力画像の読み込み // 適当な画像を読み込んでください 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_BIN, 1, width, height ); //メディアン値(中央値)をバックグランドとして除去して得られた画像を判別分析法で2値化 //局所領域(ウィンドウ)サイズ7×7(ウィンドウサイズは奇数でなければならない) fnFIE_background_remove_threshold(hsrc, hdst, 7, 7); //結果画像を保存します fnFIE_save_png("result.png", hdst, -1); //確保した画像の領域を解放します fnFIE_free_object( hsrc ); fnFIE_free_object( hdst ); } INT main(VOID) { // FIEライブラリの使用前に必ずコールする必要があります。 fnFIE_setup(); background_remove_threshold(); // 終了処理 fnFIE_teardown(); return 0; }
![]() 入力画像 | ![]() 処理結果画像 |
INT FVALGAPI fnFIE_background_remove_threshold2 | ( | FHANDLE | hSrc, | |
FHANDLE | hDst, | |||
INT | iH, | |||
INT | iV | |||
) |
局所メディアン値をバックグランドとして除去して得られた画像を判別分析法で2値化
入力画像のメディアン値を背景輝度として使用し、その背景輝度を除去した画像に対して 判別分析法を行って2値化します。メディアン値を求める局所領域のサイズは パラメータにより変更することが出来ます。
iH と iV パラメータは注目画素周辺のメディアン値を計算する 局所領域(ウィンドウ)のサイズを指定するパラメータです。 局所領域のサイズは縦横別々に iH と iV パラメータにて指定できます。 サイズは 1〜253 の間の奇数を指定しなければいけません。 但し iH と iV に共に1が指定された場合はパラメータエラーとなりますので、 必ずどちらかを3以上の値にしてください。 また、局所領域のサイズは画像のサイズより小さくなければいけません。 指定された局所領域のサイズが画像サイズよりも大きい場合には、エラーになります。 局所領域のサイズは、2値化しようとしている画像内の目標物よりも大きく設定し、 かつ、局所領域内に前景と背景の両方が入るよう設定すると良い結果が得られます。
入力画像のボーダー拡張処理モードは指定できません。 関数内部にて F_BORDER_MIRROR2 を使ってボーダー拡張を行っています。 ボーダー拡張については fnFIE_copy_border() 関数を参照してください。
入力画像、平均値画像と出力画像は下記の条件をすべて満たしている必要が有ります。
[in] | hSrc | 入力画像 (type: uc8 ) |
[out] | hDst | 出力2値画像 (type: bin) |
[in] | iH | メディアンフィルタのフィルタ横サイズ ( 1〜253 の奇数。但し iH と iV のどちらかは3以上でなければならない) |
[in] | iV | メディアンフィルタのフィルタ縦サイズ ( 1〜253 の奇数。但し iH と iV のどちらかは3以上でなければならない) |
F_ERR_NONE | 正常終了 | |
F_ERR_NOMEMORY | メモリ不足 | |
F_ERR_INVALID_IMAGE | 不正な画像が渡された | |
F_ERR_INVALID_PARAM | パラメータ不正 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
// エラー処理は省略しているので注意して下さい。 #include "fie.h" VOID background_remove_threshold() { FHANDLE hsrc = NULL; FHANDLE hdst = NULL; INT width, height; // 入力画像の読み込み // 適当な画像を読み込んでください 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_BIN, 1, width, height ); //メディアン値(中央値)をバックグランドとして除去して得られた画像を判別分析法で2値化 //局所領域(ウィンドウ)サイズ7×7(ウィンドウサイズは奇数でなければならない) fnFIE_background_remove_threshold2( hsrc, hdst, 7, 7 ); //結果画像を保存します fnFIE_save_png("result.png", hdst, -1); //確保した画像の領域を解放します fnFIE_free_object( hsrc ); fnFIE_free_object( hdst ); } INT main(VOID) { // FIEライブラリの使用前に必ずコールする必要があります。 fnFIE_setup(); background_remove_threshold(); // 終了処理 fnFIE_teardown(); return 0; }
![]() 入力画像 | ![]() 処理結果画像 |
INT FVALGAPI fnFIE_binarize | ( | FHANDLE | hsrc, | |
FHANDLE | hdst, | |||
DOUBLE | threshold | |||
) |
固定しきい値による2値化
指定された濃淡画像を2値化画像へ変換します。 2値化は、濃淡画像の濃度値をXとしたとき、
threshold > X : 0
threshold ≦ X : 1
となります。
閾値パラメータ threshold は判定時に画像の型に合わせてキャストされた後に評価されます。 この際、飽和判定は行わないため、型の表現可能な範囲を超えた値が指定された場合の結果は不定です。 例えば入力画像の型がF_IMG_UC8であれば、UCHARにキャストした後に判定が行われます。
入力画像と出力画像は下記の条件をすべて満たしている必要が有ります。
[in] | hsrc | 入力画像ハンドル( type : uc8, s16, us16, double ) |
[out] | hdst | 出力画像ハンドル( type : bin ) |
[in] | threshold | 2値化閾値 |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_IMAGE | 不正な画像ハンドルが渡されたため異常終了した | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
// エラー処理は省略しているので注意して下さい。 #include "fie.h" VOID binarize() { FHANDLE hsrc = NULL; FHANDLE hdst = NULL; INT width, height; // 入力画像の読み込み // 適当な画像を読み込んでください 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_BIN, 1, width, height ); // 固定しきい値による2値化 fnFIE_binarize( hsrc, hdst, 128 ); //結果画像を保存します fnFIE_save_png("result.png", hdst, -1); fnFIE_free_object( hsrc ); fnFIE_free_object( hdst ); } int main() { // FIEライブラリの使用前に必ずコールする必要があります。 fnFIE_setup(); binarize(); // 終了処理 fnFIE_teardown(); return 0; }
![]() 入力画像 | ![]() 処理結果画像 |
INT FVALGAPI fnFIE_hysteresis_stack_us16 | ( | FHANDLE | hMag, | |
USHORT | ushTHigh, | |||
USHORT | ushTLow, | |||
FHANDLE | hImg | |||
) |
ヒステリシス2値化(スタックを利用したアルゴリズム)
従来のヒステリシス特性は、少ない適合性で適応されます。 本関数では、閾値の上限より勾配の大きい画素へのポインタや画素値を保持するために、 スタックを用いる方法を採用します。 PUSH や POP 操作は、従来の再帰的に接続しているエッジ点を追跡する方法の代わりに使用します。
入力画像は、チャネル数1で画素タイプが F_IMG_US16 である必要があります。 一方、出力画像は、チャネル数1で画素タイプが F_IMG_UC8 である必要があります。 そして、入力画像と出力画像のサイズは同じである必要があります。
出力画像の周囲1画素の濃度値は、0となります。
[in] | hMag | エッジ勾配強度画像 (type: us16 / ch: 1 ) |
[in] | ushTLow | 閾値の下限 |
[in] | ushTHigh | 閾値の上限 |
[out] | hImg | 出力画像 ( type: uc8 / ch: 1 ) |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | ushTHigh <= ushTLow; | |
F_ERR_INVALID_IMAGE | 各画像のサイズが違う、不正な画像が渡された | |
F_ERR_NOMEMORY | バッファーメモリ配分失敗 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
INT FVALGAPI fnFIE_hysteresis_rle_uf | ( | FHANDLE | hMag, | |
DOUBLE | dTHigh, | |||
DOUBLE | dTLow, | |||
UINT | uiNoiseEdge, | |||
FHANDLE | hImg | |||
) |
ヒステリシス特性による2値化(ランレングスを利用したアルゴリズム)
本関数で利用しているランレングスは、2値画像を処理するのに適している構造です。 処理時間短縮の効果があります。 しかし、非常に多くのエッジ点がランダムに分布しているような場合は、 直接画像を処理するより、処理時間が増大することがあります。
本関数は、接続しているエッジ点の長さを評価します。 エッジ点が指定した閾値より短い場合は、ノイズとみなし消去します。
出力画像は画素タイプが F_IMG_UC8 または、 F_IMG_BIN となります。 チャネル数とサイズは入力画像と同じでなければなりません。
[in] | hMag | エッジ勾配強度画像(type: uc8, s16, us16, double) |
[in] | dTHigh | 閾値の上限 |
[in] | dTLow | 閾値の下限 |
[in] | uiNoiseEdge | ノイズとみなすエッジの最大面積 uiNoiseEdge より小さなエッジはノイズとみなし、削除される |
[out] | hImg | 出力画像(type: uc8, bin) |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | 不正なパラメータが渡された
| |
F_ERR_INVALID_IMAGE | 各画像のサイズが違う、不正な画像が渡された \ 画像サイズの横縦いずれかが3以下, 或いは (2^16 - 1) 以上 | |
F_ERR_NOMEMORY | メモリ不足 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
INT FVALGAPI fnFIE_ptile_threshold | ( | FHANDLE | hSrc, | |
FHANDLE | hDst, | |||
INT * | ipThresh, | |||
INT | iRate | |||
) |
Pタイル法による画像2値化
2値画像中の画素の割合が指定された割合になるしきい値を算出して、画像を2値化します。 入力画像のヒストグラムを作成して、輝度値が小さいほうからみて最初に指定した割合を 超える輝度値をしきい値とします。
画像ヒストグラムをUINTで計算するため、入力画像サイズが2^32画素以上の場合には オーバーフローの可能性が有ります。
ipThresh には各チャネルごとに決定された2値化閾値が出力されます。 画像のチャネル数分の配列が必要になるので、あらかじめ格納メモリを確保して下さい。 なお、閾値を取得する必要が無い場合には ipThresh にNULLを指定することが出来ます。
入力画像と出力画像は下記の条件をすべて満たしている必要があります。
[in] | hSrc | 入力画像 (type: uc8, us16, s16) |
[out] | hDst | 出力画像 (type: bin) |
[out] | ipThresh | 各チャネルの閾値 |
[in] | iRate | 割合(1 ~ 99) |
F_ERR_NONE | 正常終了 | |
F_ERR_NOMEMORY | メモリ不足 | |
F_ERR_INVALID_IMAGE | 不正な画像が渡された | |
F_ERR_INVALID_PARAM | パラメータ不正 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
// エラー処理は省略しているので注意して下さい。 #include "fie.h" #include <stdio.h> VOID ptile_threshold() { FHANDLE hsrc = NULL; FHANDLE hdst = NULL; INT width, height; INT threshold; // 入力画像の読み込み // 適当な画像を読み込んでください 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_BIN, 1, width, height ); // Pタイル法による画像2値化します(iRate=20,白画素と黒画素の割合が80:20) fnFIE_ptile_threshold( hsrc, hdst, &threshold, 20 ); //Pタイル法により求めたしきい値を表示します printf("しきい値 = %d\n", threshold); //結果画像を保存します fnFIE_save_png("result.png", hdst, -1); //確保した画像の領域を解放します fnFIE_free_object( hsrc ); fnFIE_free_object( hdst ); } INT main(VOID) { // FIEライブラリの使用前に必ずコールする必要があります。 fnFIE_setup(); ptile_threshold(); // 終了処理 fnFIE_teardown(); return 0; }
![]() 入力画像 | ![]() 処理結果画像 |
INT FVALGAPI fnFIE_discrimination_threshold | ( | FHANDLE | hSrc, | |
FHANDLE | hDst, | |||
INT * | ipThresh | |||
) |
[非推奨]判別分析法による画像2値化
クラス内分散
クラス間分散
但し、
とするときに、 を最大とするように閾値を定めます。
画像ヒストグラムをUINTで計算するため、入力画像サイズが2^32画素以上の場合には オーバーフローの可能性が有ります。
ipThresh には各チャネルごとに決定された2値化閾値が出力されます。 画像のチャネル数分の配列が必要になるので、あらかじめ格納メモリを確保して下さい。 なお、閾値を取得する必要が無い場合には ipThresh にNULLを指定することが出来ます。
入力画像と出力画像は下記の条件をすべて満たしている必要が有ります。
[in] | hSrc | 入力画像 (type: uc8, us16, s16) |
[out] | hDst | 出力画像 (type: bin) |
[out] | ipThresh | 各チャネルの閾値 |
F_ERR_NONE | 正常終了 | |
F_ERR_NOMEMORY | メモリ不足 | |
F_ERR_INVALID_IMAGE | 不正な画像が渡された | |
F_ERR_INVALID_PARAM | パラメータ不正 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
// エラー処理は省略しているので注意して下さい。 #include "fie.h" #include <stdio.h> VOID discrimination_threshold() { FHANDLE hsrc = NULL; FHANDLE hdst = NULL; INT width, height; INT threshold; // 入力画像の読み込み // 適当な画像を読み込んでください 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_BIN, 1, width, height ); //判別分析法により画像を2値化します fnFIE_discrimination_threshold( hsrc, hdst, &threshold); //判別分析法により求めたしきい値を表示します printf("しきい値 = %d\n", threshold); //結果画像を保存します fnFIE_save_png("result.png", hdst, -1); //確保した画像領域を解放します fnFIE_free_object( hsrc ); fnFIE_free_object( hdst ); } INT main(VOID) { // FIEライブラリの使用前に必ずコールする必要があります。 fnFIE_setup(); discrimination_threshold(); // 終了処理 fnFIE_teardown(); return 0; }
![]() 入力画像 | ![]() 処理結果画像 |
INT FVALGAPI fnFIE_discrimination_threshold2 | ( | FHANDLE | hSrc, | |
FHANDLE | hDst, | |||
INT * | ipThresh | |||
) |
判別分析法による画像2値化
あるしきい値によって、ヒストグラムを2クラスに分割した場合の、 クラス間分散が最大になるしきい値kを算出し、各チャネル画像を2値化します。 この方法は、判別分析法 又は 大津の方法 と呼ばれます。 アルゴリズムは下記の通りです。
クラス内分散
クラス間分散
但し、
とするときに、 を最大とするように閾値を定めます。
画像ヒストグラムをUINTで計算するため、入力画像サイズが2^32画素以上の場合には オーバーフローの可能性が有ります。
ipThresh には各チャネルごとに決定された2値化閾値が出力されます。 画像のチャネル数分の配列が必要になるので、あらかじめ格納メモリを確保して下さい。 なお、閾値を取得する必要が無い場合には ipThresh にNULLを指定することが出来ます。
入力画像と出力画像は下記の条件をすべて満たしている必要が有ります。
[in] | hSrc | 入力画像 (type: uc8, us16, s16) |
[out] | hDst | 出力画像 (type: bin) |
[out] | ipThresh | 各チャネルの閾値 |
F_ERR_NONE | 正常終了 | |
F_ERR_NOMEMORY | メモリ不足 | |
F_ERR_INVALID_IMAGE | 不正な画像が渡された | |
F_ERR_INVALID_PARAM | パラメータ不正 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
// エラー処理は省略しているので注意して下さい。 #include "fie.h" #include <stdio.h> VOID discrimination_threshold() { FHANDLE hsrc = NULL; FHANDLE hdst = NULL; INT width, height; INT threshold; // 入力画像の読み込み // 適当な画像を読み込んでください 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_BIN, 1, width, height ); //判別分析法により画像を2値化します fnFIE_discrimination_threshold2( hsrc, hdst, &threshold ); //判別分析法により求めたしきい値を表示します printf("しきい値 = %d\n", threshold); //結果画像を保存します fnFIE_save_png("result.png", hdst, -1); //確保した画像領域を解放します fnFIE_free_object( hsrc ); fnFIE_free_object( hdst ); } INT main(VOID) { // FIEライブラリの使用前に必ずコールする必要があります。 fnFIE_setup(); discrimination_threshold(); // 終了処理 fnFIE_teardown(); return 0; }
![]() 入力画像 | ![]() 処理結果画像 |
INT FVALGAPI fnFIE_grad_hist_threshold | ( | FHANDLE | hSrc, | |
FHANDLE | hDst, | |||
INT * | ipThresh, | |||
INT | iEdgeFactor | |||
) |
微分ヒストグラム法による画像2値化
指定メモリ上の画像データから、1次微分絶対値の大きい画素を抽出し、 各濃度ごとに1次微分絶対値の和を取り、和が最大となる濃度値をしきい値 として2値化します。微分値総和の最大値となる輝度値が複数ある場合は、 一番小さな輝度値が選ばれます。 1次微分の計算は fnFIE_sobel() を使って行います。 また、この際 fnFIE_sobel() のボーダー処理モードには F_BORDER_NONE を使用します。
濃度値があまりにも高い、または低い場合、しきい値として適当でないため、 入力画像のうち、処理を行う濃度値の範囲を制限しています。 処理対象になる画素の濃度値は下記の通りです。
画像ヒストグラムをUINTで計算するため、入力画像サイズが2^32画素以上の場合は オーバーフローの可能性が有ります。
ipThresh には各チャネルごとに決定された2値化閾値が出力されます。 画像のチャネル数分の配列が必要になるので、あらかじめ格納メモリを確保しておいて下さい。 なお、閾値を取得する必要が無い場合には ipThresh にNULLを指定することが出来ます。
入力画像と出力画像は下記の条件をすべて満たしている必要が有ります。
[in] | hSrc | 入力画像 (type: uc8, us16, s16) |
[out] | hDst | 出力画像 (type: bin) |
[out] | ipThresh | 各チャネルの閾値 |
[in] | iEdgeFactor | 処理対象となる(1次微分最大値*iEdgeFactor()) 以上の微分値を持つ画素を処理対象とします。取値範囲は0~100 |
F_ERR_NONE | 正常終了 | |
F_ERR_NOMEMORY | メモリ不足 | |
F_ERR_INVALID_IMAGE | 不正な画像が渡された | |
F_ERR_INVALID_PARAM | パラメータ不正 | |
F_ERR_CALC_IMPOSSIBLE | 入力画像によって2値化閾値は0になった | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
// エラー処理は省略しているので注意して下さい。 #include "fie.h" #include <stdio.h> VOID grad_hist_threshold() { FHANDLE hsrc = NULL; FHANDLE hdst = NULL; INT width, height; INT threshold; // 入力画像の読み込み // 適当な画像を読み込んでください 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_BIN, 1, width, height ); //微分ヒストグラム法による画像2値化 fnFIE_grad_hist_threshold(hsrc, hdst, &threshold, 60); //微分ヒストグラム法により求めたしきい値を表示します printf("しきい値 = %d\n", threshold); //結果画像を保存します fnFIE_save_png("result.png", hdst, -1); //確保した画像の領域を解放します fnFIE_free_object( hsrc ); fnFIE_free_object( hdst ); } INT main(VOID) { // FIEライブラリの使用前に必ずコールする必要があります。 fnFIE_setup(); grad_hist_threshold(); // 終了処理 fnFIE_teardown(); return 0; }
![]() 入力画像 | ![]() 処理結果画像 |
INT FVALGAPI fnFIE_lap_hist_threshold | ( | FHANDLE | hSrc, | |
FHANDLE | hDst, | |||
INT * | ipThresh, | |||
INT | iEdgeFactor | |||
) |
[非推奨]ラプラシアンヒストグラム法による画像の2値化
画像ヒストグラムをUINTで計算するため、入力画像サイズが2^32画素以上の場合には オーバーフローの可能性が有ります。
ipThresh には各チャネルごとに決定された2値化閾値が出力されます。 画像のチャネル数分の配列が必要になるので、あらかじめ格納メモリを確保して下さい。 なお、閾値を取得する必要が無い場合には ipThresh にNULLを指定することが出来ます。
入力画像と出力画像は下記の条件をすべて満たしている必要が有ります。
[in] | hSrc | 入力画像 (type: uc8, us16, s16) |
[out] | hDst | 出力画像 (type: bin) |
[out] | ipThresh | 各チャネルの閾値 |
[in] | iEdgeFactor | 処理対象となる(2次微分最大値*iEdgeFactor(%)) 以上の微分値を持つ画素を処理対象とします。取値範囲は0~100 |
F_ERR_NONE | 正常終了 | |
F_ERR_NOMEMORY | メモリ不足 | |
F_ERR_INVALID_IMAGE | 不正な画像が渡された | |
F_ERR_INVALID_PARAM | パラメータ不正 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
// エラー処理は省略しているので注意して下さい。 #include "fie.h" #include <stdio.h> VOID lap_hist_threshold() { FHANDLE hsrc = NULL; FHANDLE hdst = NULL; INT width, height; INT threshold; // 入力画像の読み込み // 適当な画像を読み込んでください 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_BIN, 1, width, height ); //ラプラシアンヒストグラム法による画像2値化 fnFIE_lap_hist_threshold(hsrc, hdst, &threshold, 0); //ラプラシアンヒストグラム法により求めたしきい値を表示します printf("しきい値 = %d\n", threshold); //結果画像を保存します fnFIE_save_png("result.png", hdst, -1); //確保した画像の領域を解放します fnFIE_free_object( hsrc ); fnFIE_free_object( hdst ); } INT main(VOID) { // FIEライブラリの使用前に必ずコールする必要があります。 fnFIE_setup(); lap_hist_threshold(); // 終了処理 fnFIE_teardown(); return 0; }
![]() 入力画像 | ![]() 処理結果画像 |
INT FVALGAPI fnFIE_lap_hist_threshold2 | ( | FHANDLE | hSrc, | |
FHANDLE | hDst, | |||
INT * | ipThresh, | |||
INT | iEdgeFactor | |||
) |
ラプラシアンヒストグラム法による画像の2値化
画像から、2次微分絶対値の大きい画素を抽出し濃度ヒストグラムを作成し、 その後、判別分析法によって閾値を決定して、元画像を2値化します。 ニ次微分(ラプラシアン微分フィルタ)の計算は fnFIE_laplacian() を使って行います。 その際、ボーダー処理モードには F_BORDER_NONE を使用します。
画像ヒストグラムをUINTで計算するため、入力画像サイズが2^32画素以上の場合には オーバーフローの可能性が有ります。
ipThresh には各チャネルごとに決定された2値化閾値が出力されます。 画像のチャネル数分の配列が必要になるので、あらかじめ格納メモリを確保して下さい。 なお、閾値を取得する必要が無い場合には ipThresh にNULLを指定することが出来ます。
入力画像と出力画像は下記の条件をすべて満たしている必要が有ります。
[in] | hSrc | 入力画像 (type: uc8, us16, s16) |
[out] | hDst | 出力画像 (type: bin) |
[out] | ipThresh | 各チャネルの閾値 |
[in] | iEdgeFactor | 処理対象となる(2次微分最大値*iEdgeFactor(%)) 以上の微分値を持つ画素を処理対象とします。取値範囲は0~100 |
F_ERR_NONE | 正常終了 | |
F_ERR_NOMEMORY | メモリ不足 | |
F_ERR_INVALID_IMAGE | 不正な画像が渡された | |
F_ERR_INVALID_PARAM | パラメータ不正 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
// エラー処理は省略しているので注意して下さい。 #include "fie.h" #include <stdio.h> VOID lap_hist_threshold() { FHANDLE hsrc = NULL; FHANDLE hdst = NULL; INT width, height; INT threshold; // 入力画像の読み込み // 適当な画像を読み込んでください 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_BIN, 1, width, height ); //ラプラシアンヒストグラム法による画像2値化 fnFIE_lap_hist_threshold2( hsrc, hdst, &threshold, 0 ); //ラプラシアンヒストグラム法により求めたしきい値を表示します printf("しきい値 = %d\n", threshold); //結果画像を保存します fnFIE_save_png("result.png", hdst, -1); //確保した画像の領域を解放します fnFIE_free_object( hsrc ); fnFIE_free_object( hdst ); } INT main(VOID) { // FIEライブラリの使用前に必ずコールする必要があります。 fnFIE_setup(); lap_hist_threshold(); // 終了処理 fnFIE_teardown(); return 0; }
![]() 入力画像 | ![]() 処理結果画像 |
INT FVALGAPI fnFIE_kittler_threshold | ( | FHANDLE | hSrc, | |
FHANDLE | hDst, | |||
INT * | ipThresh | |||
) |
キトラー(kittler)法による画像2値化
キトラーらは、対象領域と背景の濃淡値がともに正規分布に従うという仮定のもとで、平均誤識別率に関する基準を最小とするようなしきい値選定法を提案しました。 本2値化手法はこのアルゴリズムを実装したもので、対象領域と背景の各濃淡値の分散が極端に異なる場合や、対象領域と背景の各画素数が極端に異なる場合でも妥当なしきい値が選ばれることが示されています。
画像ヒストグラムをUINTで計算するため、入力画像サイズが 画素以上の場合には オーバーフローの可能性が有ります。
ipThresh には各チャネルごとに決定された2値化閾値が出力されます。 画像のチャネル数分の配列が必要になるので、あらかじめ格納メモリを確保して下さい。 なお、閾値を取得する必要が無い場合には ipThresh にNULLを指定することが出来ます。
入力画像と出力画像は下記の条件をすべて満たしている必要が有ります。
[in] | hSrc | 入力画像 (type: uc8, us16, s16) |
[out] | hDst | 出力画像 (type: bin) |
[out] | ipThresh | 各チャネルの閾値 |
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_threshold() { FHANDLE hsrc = NULL; FHANDLE hdst = NULL; INT width, height; INT threshold; // 入力画像の読み込み // 適当な画像を読み込んでください 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_BIN, 1, width, height ); //キトラー(kittler)法による画像2値化 fnFIE_kittler_threshold(hsrc, hdst, &threshold); //キトラー(kittler)法により求めたしきい値を表示します printf("しきい値 = %d\n", threshold); //結果画像を保存します fnFIE_save_png("result.png", hdst, -1); //確保した画像の領域を解放します fnFIE_free_object( hsrc ); fnFIE_free_object( hdst ); } INT main(VOID) { // FIEライブラリの使用前に必ずコールする必要があります。 fnFIE_setup(); kittler_threshold(); // FIEライブラリの終了処理 fnFIE_teardown(); return 0; }
![]() 入力画像 | ![]() 処理結果画像 |
を定義しておきます。 今、各画素をしきい値 によって2つのクラス
と
のどちらかに分類するものとします。また、レベル
の条件付き分布
,
が平均
,分散
の正規分布に従うとします。 このとき、Bayes の公式と不等式
から、平均誤識別率は、
のように評価できます。ここで、定数項を無視すると、しきい値選択のための基準として
が得られ、この値を最小とするような値を閾値として定めます。
INT FVALGAPI fnFIE_shift_avr_threshold_ex | ( | FHANDLE | hsrc, | |
FHANDLE | hdst, | |||
INT | size_x, | |||
INT | size_y, | |||
INT | border_mode, | |||
DOUBLE | border_value | |||
) |
局所領域平均値による2値画像作成 ボーダー処理付き
各画素ごとに画素周辺の局所領域の平均値をとり、画素の濃度と平均値を比べ、 1画素単位で2値化をおこないます。周囲画素平均値以上の画素は1、未満の画素は0にします。
局所領域の縦横サイズは必ず3以上、画像縦横サイズ以下の奇数にしてください。
入力画像と出力画像は下記の条件をすべて満たしている必要が有ります。
[in] | hsrc | 入力画像 (type: uc8, us16, s16) |
[out] | hdst | 出力画像 (type: bin) |
[in] | size_x | 近傍平均エリアの横サイズ。3〜画像の幅 の範囲の奇数を設定する |
[in] | size_y | 近傍平均エリアの縦サイズ。3〜画像の高さ の範囲の奇数を設定する |
[in] | border_mode | ボーダー処理モード
|
[in] | border_value | ボーダー濃度値。 border_mode がF_BORDER_VALUEの場合のみ使用されます。 その他のモードの場合は、この値は無視されます。 |
F_ERR_NONE | 正常終了 | |
F_ERR_NOMEMORY | メモリ不足 | |
F_ERR_INVALID_IMAGE | 不正な画像が渡された | |
F_ERR_INVALID_PARAM | パラメータ不正 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
![]() 入力画像 | ![]() 処理結果画像 |
INT FVALGAPI fnFIE_shift_avr_threshold | ( | FHANDLE | hsrc, | |
FHANDLE | hdst, | |||
INT | size_x, | |||
INT | size_y | |||
) |
局所領域平均値による2値画像作成
各画素ごとに画素周辺の局所領域の平均値をとり、画素の濃度と平均値を比べ、 1画素単位で2値化をおこないます。周囲画素平均値以上の画素は1、未満の画素は0にします。 内部で使用している平均フィルタのボーダー処理モードは F_BORDER_MIRROR2 を使用します。
局所領域の縦横サイズは必ず3以上、画像縦横サイズ以下の奇数にしてください。
入力画像と出力画像は下記の条件をすべて満たしている必要が有ります。
[in] | hsrc | 入力画像 (type: uc8, us16, s16) |
[out] | hdst | 出力画像 (type: bin) |
[in] | size_x | 近傍平均エリアの横サイズ。3〜画像の幅 の範囲の奇数を設定する |
[in] | size_y | 近傍平均エリアの縦サイズ。3〜画像の高さ の範囲の奇数を設定する |
F_ERR_NONE | 正常終了 | |
F_ERR_NOMEMORY | メモリ不足 | |
F_ERR_INVALID_IMAGE | 不正な画像が渡された | |
F_ERR_INVALID_PARAM | パラメータ不正 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
// エラー処理は省略しているので注意して下さい。 #include "fie.h" VOID shift_avr_threshold() { FHANDLE hsrc = NULL; FHANDLE hdst = NULL; INT width, height; // 入力画像の読み込み // 適当な画像を読み込んでください 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_BIN, 1, width, height ); //局所領域平均値による画像2値化 fnFIE_shift_avr_threshold(hsrc, hdst, 25, 25); //結果画像を保存します fnFIE_save_png("result.png", hdst, -1); //確保した画像の領域を解放します fnFIE_free_object( hsrc ); fnFIE_free_object( hdst ); } INT main(VOID) { // FIEライブラリの使用前に必ずコールする必要があります。 fnFIE_setup(); shift_avr_threshold(); // 終了処理 fnFIE_teardown(); return 0; }
![]() 入力画像 | ![]() 処理結果画像 |
INT FVALGAPI fnFIE_shift_avr_threshold_offset | ( | FHANDLE | hsrc, | |
FHANDLE | hdst, | |||
INT | size_x, | |||
INT | size_y, | |||
INT | offset, | |||
INT | border_mode, | |||
DOUBLE | border_value | |||
) |
局所領域平均値とオフセットによる2値画像作成 ボーダー処理付き
各画素ごとに画素周辺の局所領域の平均値をとり、画素の濃度と平均値にオフセットを加算したものを比べ、 1画素単位で2値化をおこないます。周囲画素平均値にオフセットを加算した値以上の画素は1、未満の画素は0にします。
局所領域の縦横サイズは必ず3以上、画像縦横サイズ以下の奇数にしてください。
入力画像と出力画像は下記の条件をすべて満たしている必要が有ります。
[in] | hsrc | 入力画像 (type: uc8,s16,us16) |
[out] | hdst | 出力画像 (type: bin) |
[in] | size_x | 近傍平均エリアの横サイズ。3〜画像の幅 の範囲の奇数を設定する |
[in] | size_y | 近傍平均エリアの縦サイズ。3〜画像の高さ の範囲の奇数を設定する |
[in] | offset | 周囲画素平均値からのオフセット。 F_IMG_UC8 のとき ![]() ![]() |
[in] | border_mode | ボーダー処理モード
|
[in] | border_value | ボーダー濃度値。 border_mode がF_BORDER_VALUEの場合のみ使用されます。 その他のモードの場合は、この値は無視されます。 |
F_ERR_NONE | 正常終了 | |
F_ERR_NOMEMORY | メモリ不足 | |
F_ERR_INVALID_IMAGE | 不正な画像が渡された | |
F_ERR_INVALID_PARAM | パラメータ不正 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
![]() 入力画像 | ![]() 処理結果画像 オフセット0 | ![]() 処理結果画像 オフセット-40 | ![]() 処理結果画像 オフセット+40 |
INT FVALGAPI fnFIE_shift_avr_threshold_offset_mask | ( | FHANDLE | hsrc, | |
FHANDLE | hdst, | |||
FHANDLE | hmask, | |||
INT | size_x, | |||
INT | size_y, | |||
INT | offset, | |||
INT | border_mode, | |||
DOUBLE | border_value | |||
) |
局所領域平均値とオフセットによる2値画像作成 マスク付き
各画素ごとに画素周辺の局所領域の平均値をとり、画素の濃度と平均値にオフセットを加算したものを比べ、 1画素単位で2値化をおこないます。局所領域平均値にオフセットを加算した値以上の画素は1、未満の画素は0にします。
マスクにより入出力画像上の有効画素及び無効画素を指定することができます。
入力画像上の無効画素は、局所領域平均値を得る際の周辺画素から除外されます。
また出力画像上の無効画素は、出力画像の元の画素値を保持します。
マスクにはリージョンオブジェクト、または画像オブジェクトを使用することができます。
リージョンオブジェクトをマスクとして使用した場合、リージョンに含まれる画素が有効画素となります。
画像オブジェクトをマスクとして使用した場合、濃度値0の画素は無効画素、濃度値0以外の画素は有効画素となります。
マスク hmask に NULL を指定すると、入出力画像の全画素が有効画素となり fnFIE_shift_avr_threshold_offset() と同様の結果になります。
局所領域の縦横サイズは必ず3以上、入出力画像縦横サイズ以下の奇数にしてください。
入力画像と出力画像は下記の条件をすべて満たしている必要が有ります。
画像オブジェクトをマスクとして使用する場合、マスク画像は下記の条件を全て満たしている必要があります。
[in] | hsrc | 入力画像 (type: uc8,s16,us16) |
[out] | hdst | 出力画像 (type: bin) |
[in] | hmask | マスク
|
[in] | size_x | 近傍平均エリアの横サイズ。3〜画像の幅 の範囲の奇数を設定する |
[in] | size_y | 近傍平均エリアの縦サイズ。3〜画像の高さ の範囲の奇数を設定する |
[in] | offset | 周囲画素平均値からのオフセット。 F_IMG_UC8 のとき ![]() ![]() |
[in] | border_mode | ボーダー処理モード
|
[in] | border_value | ボーダー濃度値。 border_mode がF_BORDER_VALUEの場合のみ使用されます。 その他のモードの場合は、この値は無視されます。 |
F_ERR_NONE | 正常終了 | |
F_ERR_NOMEMORY | メモリ不足 | |
F_ERR_INVALID_IMAGE | 不正な画像が渡された | |
F_ERR_INVALID_OBJECT | 不正なマスクが渡された | |
F_ERR_INVALID_PARAM | パラメータ不正 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
![]() 入力画像 | マスクを使用しない場合 fnFIE_shift_avr_threshold_offset() | ||||
![]() 結果画像 | |||||
マスクを使用した場合 fnFIE_shift_avr_threshold_offset_mask() | |||||
![]() マスク画像 | ![]() 結果画像 |
INT FVALGAPI fnFIE_band_threshold_ch | ( | const FHANDLE | hsrc, | |
FHANDLE | hdst, | |||
const DOUBLE * | tlow, | |||
const DOUBLE * | thigh, | |||
INT | back_clear | |||
) |
2つの固定しきい値を用いたセグメンテーション処理
指定された画像のセグメンテーション処理をします。入力画像の各画素の値が閾値 tlow と thigh の間に入っているかどうか調べ、出力画像の同一画素に書き込みます。
fnFIE_band_threshold() との違いは、以下の通りです。
[in] | hsrc | 入力画像(type:uc8,s16,us16,double,rgbq) |
[out] | hdst | 出力画像(type:uc8,s16,us16,double,rgbq,bin) |
[in] | tlow | 閾値の下限配列 |
[in] | thigh | 閾値の上限配列 |
[in] | back_clear | 背景処理法
|
F_ERR_NONE | 正常終了 | |
F_ERR_NOMEMORY | 作業用画像が確保できない | |
F_ERR_INVALID_IMAGE | 不正な画像オブジェクトが渡された | |
F_ERR_INVALID_PARAM | 不正なパラメータが渡された
| |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
![]() 入力画像 | ![]() 処理結果画像 |
INT FVALGAPI fnFIE_band_threshold | ( | FHANDLE | hsrc, | |
FHANDLE | hdst, | |||
DOUBLE | tlow, | |||
DOUBLE | thigh | |||
) |
二つの固定しきい値を用いて2値化
指定された濃淡画像を2値化画像へ変換します。 2値化は、濃淡画像の濃度値をX、閾値をtlowとthighとしたとき、
入力画像型が F_IMG_DOUBLE 以外の場合 閾値パラメータ tlow と thigh は判定時に整数型へキャストされた後に評価されます。
また thigh は tlow 以上でなければなりません。
入力画像と出力画像は下記の条件をすべて満たしている必要が有ります。
[in] | hsrc | 入力画像ハンドル( type : uc8, s16, us16, double ) |
[out] | hdst | 出力画像ハンドル( type : bin ) |
[in] | tlow | 2値化閾値の下限 |
[in] | thigh | 2値化閾値の上限 |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_IMAGE | 不正な画像ハンドルが渡されたため異常終了した | |
F_ERR_INVALID_PARAM | パラメータ不正 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
// エラー処理は省略しているので注意して下さい。 #include "fie.h" VOID band_threshold() { FHANDLE hsrc = NULL; FHANDLE hdst = NULL; INT width, height; // 入力画像の読み込み // 適当な画像を読み込んでください 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_BIN, 1, width, height ); //2つのしきい値により画像2値化します(下限100,上限150) fnFIE_band_threshold( hsrc, hdst, 100, 150); //結果画像を保存します fnFIE_save_png("result.png", hdst, -1); //確保した画像の領域を解放します fnFIE_free_object( hsrc ); fnFIE_free_object( hdst ); } INT main(VOID) { // FIEライブラリの使用前に必ずコールする必要があります。 fnFIE_setup(); band_threshold(); // 終了処理 fnFIE_teardown(); return 0; }
![]() 入力画像 | ![]() 処理結果画像 |
INT FVALGAPI fnFIE_watershed | ( | FHANDLE | hSrc, | |
FHANDLE | hDst | |||
) |
Watershed法による領域分割
Watershed法(分水嶺法)による画像の領域分割を行います
Watershed法は、入力画像の輝度勾配を山(輝度が高い画素)と谷(輝度が低い画素)に見立て、 谷底となっている部分に水を溜めて池を作ったとき、池同士の境界線(分水嶺)となる部分を 領域の境界線とするアルゴリズムです。
(池の水位を徐々に上げていったときに、池同士がちょうどつながり合う部分と考えてもよいでしょう)
![]() 1次元でのwatershedの例(山と谷) | ![]() 1次元でのwatershedの例(境界線) |
本関数は、MP.Soille氏の著書"Morphological Image Analysis"にて紹介されている方法でWatershed法を実装をしています。 これは、注目画素に対してその周囲8近傍の画素を探索し、池同士がぶつかっていないかを確認していくというものです。
複数の物体が隣接しているような状況で2値化やブロブ解析を行うと、 それらを1つの物体として認識してしまうケースがあります。その際に本関数を適応し、 物体間の境界線を求めることで、物体同士を正しく分離することができます。
処理結果は2値画像で出力され、分割領域の境界線の画素値は1、 分割される領域の画素値は0となります。
分水嶺が幅を持つ場合は、中央付近の画素値を1としますが、 境界線の線幅は1になるとは限らず、また完全に分水嶺の中心になるとも限りません。
入力画像の画像型が F_IMG_RGBQUAD または F_IMG_RGBTRIPLE の場合には 以下のような3チャネルのUC8画像とみなして処理を行います。
このとき、入力画像のチャネル数は 1 、出力画像のチャネル数は 3 である必要があります。
入力画像、出力画像は下記の条件をすべて満たしている必要が有ります。
入力画像がF_IMG_DOUBLE、またはF_IMG_FLOATの場合、画素値にNaNが含まれていると正しく処理できません。
[in] | hsrc | 入力画像ハンドル( type : uc8, s16, us16, double, rgbq, float, rgbtri ) |
[out] | hdst | 出力画像ハンドル( type : bin ) |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_IMAGE | 不正な画像ハンドルが渡されたため異常終了 | |
F_ERR_NOMEMORY | メモリ不足によるエラー | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
![]() 入力画像 | ![]() 出力画像 |
![]() 入力画像の2値化 | ![]() ブロブ解析結果 |
![]() 入力画像の2値化と出力画像のOR | ![]() ブロブ解析結果 |
// エラー処理は省略しているので注意して下さい。 #include "fie.h" #define WIDTH 256 #define HEIGHT 128 // 二値画像を生成し、距離変換をしたのちにWatershedを実行する VOID separate_using_watershed() { FHANDLE himg = NULL; //入力画像(分離したい二値画像) FHANDLE hpart = NULL; //出力画像(境界線画像) FHANDLE hdst = NULL; //出力画像(分離後の二値画像) FHANDLE hdepth = NULL; //距離画像の保存用画像 FHANDLE htmp = NULL; //作業用画像 DOUBLE val = 0.0; //描画する円の濃度値 DPNT_T center[3]; //描画する円の中心座標 DOUBLE radius[3]; //描画する円の半径 INT i; //ループ用変数 INT ret; //エラーコード // 横256, 縦128の二値画像オブジェクトを確保 himg = fnFIE_img_root_alloc(F_IMG_BIN, 1, WIDTH, HEIGHT); // 確保した二値画像を白く(画素値1.0)初期化 ret = fnFIE_img_clear(himg, 1.0); //描画する円のパラメータ設定 center[0].x = 64; center[0].y = 64; radius[0] = 30; center[1].x = 128; center[1].y = 60; radius[1] = 40; center[2].x = 192; center[2].y = 70; radius[2] = 30; //himgに円を描画 for (i = 0; i < 3; i++) { ret = fnFIE_draw_circle(himg, &val, F_DRAW_FILL_IN, center[i], radius[i]); } //入力画像を保存(確認のため) ret = fnFIE_save_bmp("smp_watershed_before.bmp", himg); //境界線画像の領域を確保 hpart = fnFIE_img_root_alloc(F_IMG_BIN, 1, WIDTH, HEIGHT); //作業用領域を確保 htmp = fnFIE_img_root_alloc(F_IMG_US16, 1, WIDTH, HEIGHT); hdepth = fnFIE_img_root_alloc(F_IMG_UC8, 1, WIDTH, HEIGHT); //入力用の距離画像を作成 //二値画像の画素値を反転 ret = fnFIE_img_invert(himg, himg); //距離変換 ret = fnFIE_distance_transform(himg, htmp, F_DT_EUCLIDEAN_EXACT); //距離画像の画素値を反転 ret = fnFIE_img_invert(htmp, htmp); //距離画像を保存 ret = fnFIE_img_copy_ex(htmp, hdepth, 1, 0, 0); ret = fnFIE_save_bmp("smp_watershed_depth.bmp", hdepth); //Watershed実行 ret = fnFIE_watershed(htmp, hpart); //境界線画像を保存 ret = fnFIE_save_bmp("smp_watershed_partition.bmp", hpart); //境界線を用いて二値画像を分離 //出力画像を確保 hdst = fnFIE_img_root_alloc(F_IMG_BIN, 1, WIDTH, HEIGHT); //反転してた二値画像を元に戻す ret = fnFIE_img_invert(himg, himg); //境界線画像を用いて分離 ret = fnFIE_img_or(himg, hpart, hdst); //分離後の画像を保存 ret = fnFIE_save_bmp("smp_watershed_separated.bmp", hdst); //解放 fnFIE_free_object(himg); fnFIE_free_object(hpart); fnFIE_free_object(htmp); fnFIE_free_object(hdst); fnFIE_free_object(hdepth); } INT main(VOID) { // FIEライブラリの使用前に必ずコールする必要があります。 fnFIE_setup(); separate_using_watershed(); // 終了処理 fnFIE_teardown(); return 0; }
![]() 入力画像 | ![]() 距離画像(画素値反転) |
![]() 境界線画像(本関数の出力画像) | ![]() 分離画像 |