2値化/セグメンテーション
[画像フィルタ]


関数

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値化を行います。周辺画素として統計値を計算する局所領域のサイズは パラメータにより変更することが出来ます。

各画素の閾値の計算は下式にしたがって行われます。

\[ T(i,j) = m(i,j) + k \cdot s(i,j) \]

ここで

  • $m(i,j)$ は注目画素 $(i,j)$ 周辺指定範囲内画素の平均値
  • $s(i,j)$ は注目画素 $(i,j)$ 周辺指定範囲内画素の標準偏差
  • $k$ はユーザ入力係数

dK パラメータは公式中の $k$ に対応します。 dK の値に制限はありませんが、-1と1の間の小数に設定することを勧めます。

iHiV パラメータは注目画素周辺の平均値、標準偏差を計算する 局所領域(ウィンドウ)のサイズを指定するパラメータです。 局所領域のサイズは縦横別々に iHiV パラメータにて指定できます。 サイズは 1〜255 の間の奇数を指定しなければいけません。 但し iHiV に共に1が指定された場合はパラメータエラーとなりますので、 必ずどちらかを3以上の値にしてください。 また、局所領域のサイズは画像のサイズより小さくなければいけません。 指定された局所領域のサイズが画像サイズよりも大きい場合には、エラーになります。 局所領域のサイズは、2値化しようとしている画像内の目標物よりも大きく設定し、 かつ、局所領域内に前景と背景の両方が入るよう設定すると良い結果が得られます。

iBrdMod はボーダー拡張処理モードを指定するパラメータです。 本関数では局所領域の情報を使って処理を行うため、ボーダー拡張処理をしないと 画像の周囲に処理できない領域が出来ます。しかし、本パラメータにてボーダー拡張処理方法を 指定すると内部でボーダー拡張処理を行うため、画像の端まで結果を得ることが出来ます。 ボーダー拡張については fnFIE_copy_border() 関数を参照してください。

入力画像と出力画像は下記の条件をすべて満たしている必要が有ります。

  • サイズ(幅・高さ)が等しい
  • チャネル数が等しい
  • 入力画像の型は F_IMG_UC8, F_IMG_S16, F_IMG_US16 のいずれか
  • 出力画像の型は F_IMG_BINである。

引数:
[in] hSrc 入力画像 (type: uc8, us16, s16)
[out] hDst 出力2値画像 (type: bin)
[in] iH 局所領域の横サイズ
( 1〜255 の奇数。但し iHiV のどちらかは3以上でなければならない)
[in] iV 局所領域の縦サイズ
( 1〜255 の奇数。但し iHiV のどちらかは3以上でなければならない)
[in] dK 計算式の係数 $k$
[in] iBrdMod ボーダー処理モード
  • F_BORDER_NONE ボーダー拡張しない
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
戻り値:
F_ERR_NONE 正常終了
F_ERR_NOMEMORY メモリ不足
F_ERR_INVALID_IMAGE 不正な画像が渡された
F_ERR_INVALID_PARAM パラメータ不正
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参照:
fnFIE_sauvola_threshold()
参考文献:
  • Zhao, M., Yang, Y. and Yan, H. "An adaptive thresholding method for binarization of blueprint images", Pattern Recognition, Vol.21, 2000, pp.927-43
  • Sezgin, M. and Sankur, B. "Survey over image thresholding techniques and qualitative performance evaluation", J. of Electronic Imaging, Vol.13(1), 2004, pp.146-65

使用例:
// エラー処理は省略しているので注意して下さい。
#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;
}
処理結果例:
book.png

入力画像

fie_binarize_niblack.png

処理結果画像

INT FVALGAPI fnFIE_sauvola_threshold ( FHANDLE  hSrc,
FHANDLE  hDst,
INT  iH,
INT  iV,
DOUBLE  dK,
DOUBLE  dR,
INT  iBrdMod 
)

局所平均値と標準偏差を用いてSauvola法による画像2値化

入力画像の注目画素の閾値を、その周辺画素の平均値と標準偏差を用いて決定し(Sauvola法)、 動的な2値化を行います。周辺画素として統計値を計算する局所領域のサイズは パラメータにより変更することが出来ます。

閾値の計算は下式にしたがって行われます。

\[ T(i,j) = m(i,j) \cdot \left [ 1 + k \cdot \left (\frac { s(i,j) }{R} - 1 \right ) \right ] \]

ここで:

  • $m(i,j)$ は注目画素 $(i,j)$ 周辺指定範囲内画素の平均値
  • $s(i,j)$ は注目画素 $(i,j)$ 周辺指定範囲内画素の標準偏差
  • $k$$R$ はユーザ入力係数

Sauvola法はNiblack法( fnFIE_niblack_threshold() )の改善手法です。 Niblack法に比べるとSauvola法は標準偏差の影響を重視し、係数 $k$ の影響も小さくなっています。

dKdR パラメータは公式中の $k$$R$ に対応します。 dR の絶対値が1より小さい場合は、パラメータ不正となります。但し、入力画像型がF_IMG_DOUBLEとF_IMG_FLOATの場合は、dR が0の場合にのみパラメータ不正となります。 その他に dKdR の値の制限は有りませんが、 dK は -1と1の間の小数に、 dR は画素値の範囲内(入力画像内の最大画素値から最小画素値の間)に設定することを勧めます。 dR の設定にお困りの場合は次の様な値をお試しください。画像の値域が0〜255の場合は128を、0〜65535の場合は32768等。

iHiV パラメータは注目画素周辺の平均値、標準偏差を計算する 局所領域(ウィンドウ)のサイズを指定するパラメータです。 局所領域のサイズは縦横別々に iHiV パラメータにて指定できます。 サイズは 1〜255 の間の奇数を指定しなければいけません。 但し iHiV に共に1が指定された場合はパラメータエラーとなりますので、 必ずどちらかを3以上の値にしてください。 また、局所領域のサイズは画像のサイズより小さくなければいけません。 指定された局所領域のサイズが画像サイズよりも大きい場合には、エラーになります。 局所領域のサイズは、2値化しようとしている画像内の目標物よりも大きく設定し、 かつ、局所領域内に前景と背景の両方が入るよう設定すると良い結果が得られます。

iBrdMod はボーダー拡張処理モードを指定するパラメータです。 本関数では局所領域の情報を使って処理を行うため、ボーダー拡張処理をしないと 画像の周囲に処理できない領域が出来ます。しかし、本パラメータにてボーダー拡張処理方法を 指定すると内部でボーダー拡張処理を行うため、画像の端まで結果を得ることが出来ます。 ボーダー拡張については fnFIE_copy_border() 関数を参照してください。

入力画像、平均値画像と出力画像は下記の条件をすべて満たしている必要が有ります。

  • サイズ(幅・高さ)が等しい
  • チャネル数が等しい
  • 入力画像の型は F_IMG_UC8, F_IMG_S16, F_IMG_US16, F_IMG_FLOAT, F_IMG_DOUBLE のいずれか
  • 出力画像の型は F_IMG_BIN である

引数:
[in] hSrc 入力画像 (type: uc8, us16, s16, float, double)
[out] hDst 出力2値画像 (type: bin)
[in] iH 局所領域の横サイズ
( 1〜255 の奇数。但し iHiV のどちらかは3以上でなければならない)
[in] iV 局所領域の縦サイズ
( 1〜255 の奇数。但し iHiV のどちらかは3以上でなければならない)
[in] dK 計算式の $k$
[in] dR 計算式の $R$ ( 絶対値が1以上の値。但し、double,float型の場合は0以外 )
[in] iBrdMod ボーダー処理モード
  • F_BORDER_NONE ボーダー拡張しない
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
戻り値:
F_ERR_NONE 正常終了
F_ERR_NOMEMORY メモリ不足
F_ERR_INVALID_IMAGE 不正な画像が渡された
F_ERR_INVALID_PARAM パラメータ不正
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参照:
fnFIE_niblack_threshold()
参考文献:
  • Sauvola, J. & Pietikainen, M. "Adaptive document image binarization", Pattern Recognition, Vol33, 2000, pp.225-236
  • Sezgin, M. & Sankur, B. "Survey over image thresholding techniques and qualitative performance evaluation", J. of Electronic Imaging, Vol.13(1), 2004, pp.146-165

使用例:
// エラー処理は省略しているので注意して下さい。
#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;
}
処理結果例:
book.png

入力画像

fie_binarize_sauvola.png

処理結果画像

INT FVALGAPI fnFIE_background_remove_threshold ( FHANDLE  hSrc,
FHANDLE  hDst,
INT  iH,
INT  iV 
)

[非推奨]局所メディアン値をバックグランドとして除去して得られた画像を判別分析法で2値化

非推奨:
本関数は後方互換性のために残されています。 新規の開発では fnFIE_background_remove_threshold2() を使用し、本関数は使用しないでください。
入力画像のメディアン値を背景輝度として使用し、その背景輝度を除去した画像に対して 判別分析法を行って2値化します。メディアン値を求める局所領域のサイズは パラメータにより変更することが出来ます。

iHiV パラメータは注目画素周辺のメディアン値を計算する 局所領域(ウィンドウ)のサイズを指定するパラメータです。 局所領域のサイズは縦横別々に iHiV パラメータにて指定できます。 サイズは 1〜253 の間の奇数を指定しなければいけません。 但し iHiV に共に1が指定された場合はパラメータエラーとなりますので、 必ずどちらかを3以上の値にしてください。 また、局所領域のサイズは画像のサイズより小さくなければいけません。 指定された局所領域のサイズが画像サイズよりも大きい場合には、エラーになります。 局所領域のサイズは、2値化しようとしている画像内の目標物よりも大きく設定し、 かつ、局所領域内に前景と背景の両方が入るよう設定すると良い結果が得られます。

入力画像のボーダー拡張処理モードは指定できません。 関数内部にて F_BORDER_MIRROR2 を使ってボーダー拡張を行っています。 ボーダー拡張については fnFIE_copy_border() 関数を参照してください。

入力画像、平均値画像と出力画像は下記の条件をすべて満たしている必要が有ります。

  • サイズ(幅・高さ)が等しい
  • チャネル数が等しい
  • 入力画像の型は F_IMG_UC8
  • 出力画像の型は F_IMG_BIN

引数:
[in] hSrc 入力画像 (type: uc8 )
[out] hDst 出力2値画像 (type: bin)
[in] iH メディアンフィルタのフィルタ横サイズ
( 1〜253 の奇数。但し iHiV のどちらかは3以上でなければならない)
[in] iV メディアンフィルタのフィルタ縦サイズ
( 1〜253 の奇数。但し iHiV のどちらかは3以上でなければならない)
戻り値:
F_ERR_NONE 正常終了
F_ERR_NOMEMORY メモリ不足
F_ERR_INVALID_IMAGE 不正な画像が渡された
F_ERR_INVALID_PARAM パラメータ不正
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参照:
fnFIE_medianMxN(), fnFIE_discrimination_threshold()
参考文献:
  • Hutchison, L. A. D. & Barrent, W. A. "Fast Registration of Tabular Document Images Using the Fourier-Mellin Transform", Proceedings of the First Internation Workshop on Document Image Analysis for Libraries, 2004
  • Ahmad, M. O. and Sundararajan, D., "A Fast Algorithm for Two-Dimensional Median Filtering", IEEE Trans. on Circ. and Sys., Vol. Cas-34, No.11, pp. 1364-74, 1987(11)

使用例:
// エラー処理は省略しているので注意して下さい。
#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;
}
処理結果例:
book.png

入力画像

fie_binarize_background_remove_threshold.png

処理結果画像

INT FVALGAPI fnFIE_background_remove_threshold2 ( FHANDLE  hSrc,
FHANDLE  hDst,
INT  iH,
INT  iV 
)

局所メディアン値をバックグランドとして除去して得られた画像を判別分析法で2値化

入力画像のメディアン値を背景輝度として使用し、その背景輝度を除去した画像に対して 判別分析法を行って2値化します。メディアン値を求める局所領域のサイズは パラメータにより変更することが出来ます。

iHiV パラメータは注目画素周辺のメディアン値を計算する 局所領域(ウィンドウ)のサイズを指定するパラメータです。 局所領域のサイズは縦横別々に iHiV パラメータにて指定できます。 サイズは 1〜253 の間の奇数を指定しなければいけません。 但し iHiV に共に1が指定された場合はパラメータエラーとなりますので、 必ずどちらかを3以上の値にしてください。 また、局所領域のサイズは画像のサイズより小さくなければいけません。 指定された局所領域のサイズが画像サイズよりも大きい場合には、エラーになります。 局所領域のサイズは、2値化しようとしている画像内の目標物よりも大きく設定し、 かつ、局所領域内に前景と背景の両方が入るよう設定すると良い結果が得られます。

入力画像のボーダー拡張処理モードは指定できません。 関数内部にて F_BORDER_MIRROR2 を使ってボーダー拡張を行っています。 ボーダー拡張については fnFIE_copy_border() 関数を参照してください。

入力画像、平均値画像と出力画像は下記の条件をすべて満たしている必要が有ります。

  • サイズ(幅・高さ)が等しい
  • チャネル数が等しい
  • 入力画像の型は F_IMG_UC8
  • 出力画像の型は F_IMG_BIN

引数:
[in] hSrc 入力画像 (type: uc8 )
[out] hDst 出力2値画像 (type: bin)
[in] iH メディアンフィルタのフィルタ横サイズ
( 1〜253 の奇数。但し iHiV のどちらかは3以上でなければならない)
[in] iV メディアンフィルタのフィルタ縦サイズ
( 1〜253 の奇数。但し iHiV のどちらかは3以上でなければならない)
戻り値:
F_ERR_NONE 正常終了
F_ERR_NOMEMORY メモリ不足
F_ERR_INVALID_IMAGE 不正な画像が渡された
F_ERR_INVALID_PARAM パラメータ不正
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参照:
fnFIE_medianMxN(), fnFIE_discrimination_threshold2()
参考文献:
  • Hutchison, L. A. D. & Barrent, W. A. "Fast Registration of Tabular Document Images Using the Fourier-Mellin Transform", Proceedings of the First Internation Workshop on Document Image Analysis for Libraries, 2004
  • Ahmad, M. O. and Sundararajan, D., "A Fast Algorithm for Two-Dimensional Median Filtering", IEEE Trans. on Circ. and Sys., Vol. Cas-34, No.11, pp. 1364-74, 1987(11)

使用例:
// エラー処理は省略しているので注意して下さい。
#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;
}
処理結果例:
book.png

入力画像

fie_binarize_background_remove_threshold2.png

処理結果画像

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にキャストした後に判定が行われます。

入力画像と出力画像は下記の条件をすべて満たしている必要が有ります。

  • サイズ(幅・高さ)が等しい
  • チャネル数が等しい
  • 入力画像の型はF_IMG_UC8, F_IMG_S16, F_IMG_US16, F_IMG_DOUBLE のいずれか
  • 出力画像の型はF_IMG_BIN

引数:
[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 ライセンスエラー、または未初期化エラー
参考文献:
  • Henry S. Warren, jr. "ハッカーのたのしみ",Chap.7, pp. 107, 株式会社星雲社,2005年6月1日初版

使用例
// エラー処理は省略しているので注意して下さい。
#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;
}


処理結果例:
book.png

入力画像

fie_binarize.png

処理結果画像

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 不正なパラメータが渡された
  • dTLow 、または dTHigh が入力画像のダイナミックレンジを越えている
  • dTLow > dTHigh
F_ERR_INVALID_IMAGE 各画像のサイズが違う、不正な画像が渡された \ 画像サイズの横縦いずれかが3以下, 或いは (2^16 - 1) 以上
F_ERR_NOMEMORY メモリ不足
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参考文献:
  • 1. Linda G. Shapiro and George Stockman, "Computer vision", Prentice Hall, Mar. 2000, pp.69-78
  • 2. Robert M. Haralick and Linda G. Shapiro, "Computer and robot vision", Addison-Wesley Pub. Company, Jun. 1992, Vol. I, pp37-48
  • 3. Kesheng Wu, Ekow Otoo and Arie Shoshani, Optimizing Connected Component Labeling Algorithms, Proc. of SPIE Medical Imaging Conf., 2005.

INT FVALGAPI fnFIE_ptile_threshold ( FHANDLE  hSrc,
FHANDLE  hDst,
INT *  ipThresh,
INT  iRate 
)

Pタイル法による画像2値化

2値画像中の画素の割合が指定された割合になるしきい値を算出して、画像を2値化します。 入力画像のヒストグラムを作成して、輝度値が小さいほうからみて最初に指定した割合を 超える輝度値をしきい値とします。

画像ヒストグラムをUINTで計算するため、入力画像サイズが2^32画素以上の場合には オーバーフローの可能性が有ります。

ipThresh には各チャネルごとに決定された2値化閾値が出力されます。 画像のチャネル数分の配列が必要になるので、あらかじめ格納メモリを確保して下さい。 なお、閾値を取得する必要が無い場合には ipThresh にNULLを指定することが出来ます。

入力画像と出力画像は下記の条件をすべて満たしている必要があります。

  • サイズ(幅・高さ)が等しい
  • チャネル数が等しい
  • 入力画像の型はF_IMG_UC8, F_IMG_S16, F_IMG_US16 のいずれか
  • 出力画像の型はF_IMG_BIN

引数:
[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;
}
処理結果例:
book.png

入力画像

fie_binarize_ptile.png

処理結果画像

INT FVALGAPI fnFIE_discrimination_threshold ( FHANDLE  hSrc,
FHANDLE  hDst,
INT *  ipThresh 
)

[非推奨]判別分析法による画像2値化

非推奨:
本関数は後方互換性のために残されています。 新規の開発では fnFIE_discrimination_threshold2() を使用し、本関数は使用しないでください。
あるしきい値によって、ヒストグラムを2クラスに分割した場合の、 クラス間分散が最大になるしきい値kを算出し、各チャネル画像を2値化します。 この方法は、判別分析法 又は 大津の方法 と呼ばれます。 アルゴリズムは下記の通りです。

クラス内分散

\[ \sigma_W^2 = \frac{n_1\sigma_1^2+n_2\sigma_2^2}{n_1+n_2} \]

クラス間分散

\[ \sigma_B^2 = \frac{n_1\left(\mu_1-\mu_T\right)^2 + n_2\left(\mu_2-\mu_T\right)^2}{n_1+n_2} \]

但し、

  • $\mu_1$$\mu_2$ 各クラスの輝度平均値
  • $\sigma_1^2$$\sigma_2^2$ 各クラスの輝度分散値
  • $n_1$$n_2$ 各クラスの画素数
  • $\mu_T$ 全画素の輝度平均値

otsu.png

とするときに、 $ \sigma_B^2 / \sigma_W^2 $ を最大とするように閾値を定めます。

画像ヒストグラムをUINTで計算するため、入力画像サイズが2^32画素以上の場合には オーバーフローの可能性が有ります。

ipThresh には各チャネルごとに決定された2値化閾値が出力されます。 画像のチャネル数分の配列が必要になるので、あらかじめ格納メモリを確保して下さい。 なお、閾値を取得する必要が無い場合には ipThresh にNULLを指定することが出来ます。

入力画像と出力画像は下記の条件をすべて満たしている必要が有ります。

  • サイズ(幅・高さ)が等しい
  • チャネル数が等しい
  • 入力画像の型はF_IMG_UC8, F_IMG_S16, F_IMG_US16 のいずれか
  • 出力画像の型はF_IMG_BIN

引数:
[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;
}
処理結果例:
book.png

入力画像

fie_binarize_discrimination.png

処理結果画像

INT FVALGAPI fnFIE_discrimination_threshold2 ( FHANDLE  hSrc,
FHANDLE  hDst,
INT *  ipThresh 
)

判別分析法による画像2値化

あるしきい値によって、ヒストグラムを2クラスに分割した場合の、 クラス間分散が最大になるしきい値kを算出し、各チャネル画像を2値化します。 この方法は、判別分析法 又は 大津の方法 と呼ばれます。 アルゴリズムは下記の通りです。

クラス内分散

\[ \sigma_W^2 = \frac{n_1\sigma_1^2+n_2\sigma_2^2}{n_1+n_2} \]

クラス間分散

\[ \sigma_B^2 = \frac{n_1\left(\mu_1-\mu_T\right)^2 + n_2\left(\mu_2-\mu_T\right)^2}{n_1+n_2} \]

但し、

  • $\mu_1$$\mu_2$ 各クラスの輝度平均値
  • $\sigma_1^2$$\sigma_2^2$ 各クラスの輝度分散値
  • $n_1$$n_2$ 各クラスの画素数
  • $\mu_T$ 全画素の輝度平均値

otsu.png

とするときに、 $ \sigma_B^2 / \sigma_W^2 $ を最大とするように閾値を定めます。

画像ヒストグラムをUINTで計算するため、入力画像サイズが2^32画素以上の場合には オーバーフローの可能性が有ります。

ipThresh には各チャネルごとに決定された2値化閾値が出力されます。 画像のチャネル数分の配列が必要になるので、あらかじめ格納メモリを確保して下さい。 なお、閾値を取得する必要が無い場合には ipThresh にNULLを指定することが出来ます。

入力画像と出力画像は下記の条件をすべて満たしている必要が有ります。

  • サイズ(幅・高さ)が等しい
  • チャネル数が等しい
  • 入力画像の型はF_IMG_UC8, F_IMG_S16, F_IMG_US16 のいずれか
  • 出力画像の型はF_IMG_BIN

引数:
[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;
}
処理結果例:
book.png

入力画像

fie_binarize_discrimination2.png

処理結果画像

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 を使用します。

濃度値があまりにも高い、または低い場合、しきい値として適当でないため、 入力画像のうち、処理を行う濃度値の範囲を制限しています。 処理対象になる画素の濃度値は下記の通りです。

  • UCHAR: 10 ~ 250
  • SHORT: -32758 ~ 32757
  • USHORT: 10 ~ 65525 また、入力画像の全画素(1チャネル分)がすべて処理範囲外の場合はF_ERR_INVALID_IMAGEを返します。

画像ヒストグラムをUINTで計算するため、入力画像サイズが2^32画素以上の場合は オーバーフローの可能性が有ります。

ipThresh には各チャネルごとに決定された2値化閾値が出力されます。 画像のチャネル数分の配列が必要になるので、あらかじめ格納メモリを確保しておいて下さい。 なお、閾値を取得する必要が無い場合には ipThresh にNULLを指定することが出来ます。

入力画像と出力画像は下記の条件をすべて満たしている必要が有ります。

  • サイズ(幅・高さ)が等しい
  • サイズ(幅・高さ)がいずれも3以上
  • チャネル数が等しい
  • 入力画像の型はF_IMG_UC8, F_IMG_S16, F_IMG_US16 のいずれか
  • 出力画像の型はF_IMG_BIN

引数:
[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 ライセンスエラー、または未初期化エラー
参照:
fnFIE_sobel()
使用例:
// エラー処理は省略しているので注意して下さい。
#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;
}
処理結果例:
book.png

入力画像

fie_binarize_gradient.png

処理結果画像

INT FVALGAPI fnFIE_lap_hist_threshold ( FHANDLE  hSrc,
FHANDLE  hDst,
INT *  ipThresh,
INT  iEdgeFactor 
)

[非推奨]ラプラシアンヒストグラム法による画像の2値化

非推奨:
本関数は後方互換性のために残されています。 新規の開発では fnFIE_lap_hist_threshold2() を使用し、本関数は使用しないでください。
画像から、2次微分絶対値の大きい画素を抽出し濃度ヒストグラムを作成し、 その後、判別分析法によって閾値を決定して、元画像を2値化します。 ニ次微分(ラプラシアン微分フィルタ)の計算は fnFIE_laplacian() を使って行います。 その際、ボーダー処理モードには F_BORDER_NONE を使用します。

画像ヒストグラムをUINTで計算するため、入力画像サイズが2^32画素以上の場合には オーバーフローの可能性が有ります。

ipThresh には各チャネルごとに決定された2値化閾値が出力されます。 画像のチャネル数分の配列が必要になるので、あらかじめ格納メモリを確保して下さい。 なお、閾値を取得する必要が無い場合には ipThresh にNULLを指定することが出来ます。

入力画像と出力画像は下記の条件をすべて満たしている必要が有ります。

  • サイズ(幅・高さ)が等しい
  • サイズ(幅・高さ)がいずれも3以上
  • チャネル数が等しい
  • 入力画像の型はF_IMG_UC8, F_IMG_S16, F_IMG_US16 のいずれか
  • 出力画像の型はF_IMG_BIN

引数:
[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 ライセンスエラー、または未初期化エラー
参照:
fnFIE_laplacian()
使用例:
// エラー処理は省略しているので注意して下さい。
#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;
}
処理結果例:
book.png

入力画像

fie_binarize_laplacian.png

処理結果画像

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を指定することが出来ます。

入力画像と出力画像は下記の条件をすべて満たしている必要が有ります。

  • サイズ(幅・高さ)が等しい
  • サイズ(幅・高さ)がいずれも3以上
  • チャネル数が等しい
  • 入力画像の型はF_IMG_UC8, F_IMG_S16, F_IMG_US16 のいずれか
  • 出力画像の型はF_IMG_BIN

引数:
[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 ライセンスエラー、または未初期化エラー
参照:
fnFIE_laplacian()
使用例:
// エラー処理は省略しているので注意して下さい。
#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;
}
処理結果例:
book.png

入力画像

fie_binarize_laplacian2.png

処理結果画像

INT FVALGAPI fnFIE_kittler_threshold ( FHANDLE  hSrc,
FHANDLE  hDst,
INT *  ipThresh 
)

キトラー(kittler)法による画像2値化

キトラーらは、対象領域と背景の濃淡値がともに正規分布に従うという仮定のもとで、平均誤識別率に関する基準を最小とするようなしきい値選定法を提案しました。 本2値化手法はこのアルゴリズムを実装したもので、対象領域と背景の各濃淡値の分散が極端に異なる場合や、対象領域と背景の各画素数が極端に異なる場合でも妥当なしきい値が選ばれることが示されています。

画像ヒストグラムをUINTで計算するため、入力画像サイズが $ 2^{32} $ 画素以上の場合には オーバーフローの可能性が有ります。

ipThresh には各チャネルごとに決定された2値化閾値が出力されます。 画像のチャネル数分の配列が必要になるので、あらかじめ格納メモリを確保して下さい。 なお、閾値を取得する必要が無い場合には ipThresh にNULLを指定することが出来ます。

入力画像と出力画像は下記の条件をすべて満たしている必要が有ります。

  • サイズ(幅・高さ)が等しい
  • チャネル数が等しい
  • 入力画像の型はF_IMG_UC8, F_IMG_S16, F_IMG_US16 のいずれか
  • 出力画像の型はF_IMG_BIN

引数:
[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;
}
処理結果例:
book.png

入力画像

fie_binarize_kittler.png

処理結果画像

アルゴリズムについて
アルゴリズムは下記の通りです。 各画素が区間 $[1,L]$ の範囲の濃淡値$ i $をもつような画像を考えます。 このとき、画像の濃淡値の分布は、ヒストグラム $\{h(i) \vert i=1,\ldots,L\}$ で与えられます。 ここで、$h(i)$ はその画像に濃淡値$ i $があらわれる頻度を表します。 これを全画素数$N=\sum_{i=1}^L h(i)$ で正規化して、正規化ヒストグラムを $\{p(i) = h(i)/N\}$ とします。
また、正規化ヒストグラムに対して、2つの累計量(レベル$k$までの濃淡分布の0,1次モーメント)

\begin{eqnarray*}{ \omega(k) &=& \sum_{i=1}^k p(i) \\ \mu(k) &=& \sum_{i=1}^k ip(i) \end{eqnarray*}{

を定義しておきます。 今、各画素をしきい値 $ k $ によって2つのクラス $ C_1 $$ C_2 $ のどちらかに分類するものとします。また、レベル$ i $の条件付き分布 $ f(i\vert C_j)$ , $ (j=1,2) $ が平均 $\mu_j(k)$ ,分散 $ \sigma_j^2(k) $ の正規分布に従うとします。 このとき、Bayes の公式と不等式 $ p \ge 1 + \log(p) (\ 0 \le p \le 1) $ から、平均誤識別率は、

\begin{eqnarray*}{ P_e &=& 1 - \sum_{i=1}^k f(C_1\vert i)p(i) - \sum_{i=k+1}^L f(C_2\vert i)p(i) \\ &\le& 1 - \sum_{i=1}^k [1+\log f(C_1\vert i)]p(i) - \sum_{i=k+1}^L [1+\log f(C_2\vert i)]p(i) \\ &=& \omega_1(k)\log(\frac{\sigma_1(k)}{\omega_1(k)}) + \omega_2(k)\log(\frac{\sigma_2(k)}{\omega_2(k)}) \\ & & + \frac{1}{2}(1+\log(2\pi)) + \sum_{i=1}^L p(i)\log(p(i)) \end{eqnarray*}{

のように評価できます。ここで、定数項を無視すると、しきい値選択のための基準として

\[ J(k) = \omega_1(k)\log(\frac{\sigma_1(k)}{\omega_1(k)}) + \omega_2(k)\log(\frac{\sigma_2(k)}{\omega_2(k)}) \]

が得られ、この値を最小とするような値を閾値として定めます。

参考文献:
  • パターン認識‐理論と応用 (行動計量学シリーズ) p89 大津 展之, 関田 巌, 栗田 多喜夫(著) 出版社: 朝倉書店 (1996/07) ISBN-10: 4254126522 ISBN-13: 978-4254126525

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以上、画像縦横サイズ以下の奇数にしてください。

入力画像と出力画像は下記の条件をすべて満たしている必要が有ります。

  • サイズ(幅・高さ)が等しい
  • サイズ(幅・高さ)が近傍平均のエリアサイズより大きいこと
  • チャネル数が等しい
  • 入力画像の型はF_IMG_UC8, F_IMG_S16, F_IMG_US16 のいずれか
  • 出力画像の型はF_IMG_BIN

引数:
[in] hsrc 入力画像 (type: uc8, us16, s16)
[out] hdst 出力画像 (type: bin)
[in] size_x 近傍平均エリアの横サイズ。3〜画像の幅 の範囲の奇数を設定する
[in] size_y 近傍平均エリアの縦サイズ。3〜画像の高さ の範囲の奇数を設定する
[in] border_mode ボーダー処理モード
  • F_BORDER_NONE ボーダー拡張しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[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 ライセンスエラー、または未初期化エラー
処理結果例:
book.png

入力画像

fie_binarize_shift_average.png

処理結果画像

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以上、画像縦横サイズ以下の奇数にしてください。

入力画像と出力画像は下記の条件をすべて満たしている必要が有ります。

  • サイズ(幅・高さ)が等しい
  • サイズ(幅・高さ)が近傍平均のエリアサイズより大きいこと
  • チャネル数が等しい
  • 入力画像の型はF_IMG_UC8, F_IMG_S16, F_IMG_US16 のいずれか
  • 出力画像の型はF_IMG_BIN

引数:
[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;
}
処理結果例:
book.png

入力画像

fie_binarize_shift_average.png

処理結果画像

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にします。

  • オフセットを0に設定すると fnFIE_shift_avr_threshold_ex() と同様の結果になります。
  • オフセットを負の値に設定すると、周囲画素より顕著に暗い画素だけを黒にするフィルタになります。
  • オフセットを正の値に設定すると、周囲画素より顕著に明るい画素だけを白にするフィルタになります。

局所領域の縦横サイズは必ず3以上、画像縦横サイズ以下の奇数にしてください。

入力画像と出力画像は下記の条件をすべて満たしている必要が有ります。

  • サイズ(幅・高さ)が等しい
  • サイズ(幅・高さ)が近傍平均のエリアサイズより大きいこと
  • チャネル数が等しい
  • 入力画像の型は F_IMG_UC8, F_IMG_S16, F_IMG_US16
  • 出力画像の型は F_IMG_BIN

引数:
[in] hsrc 入力画像 (type: uc8,s16,us16)
[out] hdst 出力画像 (type: bin)
[in] size_x 近傍平均エリアの横サイズ。3〜画像の幅 の範囲の奇数を設定する
[in] size_y 近傍平均エリアの縦サイズ。3〜画像の高さ の範囲の奇数を設定する
[in] offset 周囲画素平均値からのオフセット。 F_IMG_UC8 のとき $ -255 \le offset \le 255 $ それ以外の時 $ -65535 \le offset \le 65535 $
[in] border_mode ボーダー処理モード
  • F_BORDER_NONE ボーダー拡張しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[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 ライセンスエラー、または未初期化エラー
処理結果例:
fie_shift_avr_threhsold_offset_src.png

入力画像

fie_shift_avr_threhsold_offset_0.png

処理結果画像 オフセット0

fie_shift_avr_threhsold_offset_minus.png

処理結果画像 オフセット-40

fie_shift_avr_threhsold_offset_plus.png

処理結果画像 オフセット+40

参照:
fnFIE_shift_avr_threshold_ex()

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以上、入出力画像縦横サイズ以下の奇数にしてください。

入力画像と出力画像は下記の条件をすべて満たしている必要が有ります。

  • サイズ(幅・高さ)が等しい
  • サイズ(幅・高さ)が近傍平均のエリアサイズより大きいこと
  • チャネル数が等しい
  • 入力画像の型は F_IMG_UC8, F_IMG_S16, F_IMG_US16
  • 出力画像の型は F_IMG_BIN

画像オブジェクトをマスクとして使用する場合、マスク画像は下記の条件を全て満たしている必要があります。

  • 入出力画像とサイズ(幅・高さ)が等しい
  • チャネル数は 1
  • マスク画像の型は F_IMG_BIN

引数:
[in] hsrc 入力画像 (type: uc8,s16,us16)
[out] hdst 出力画像 (type: bin)
[in] hmask マスク
  • リージョン
  • マスク画像 (type: bin)
[in] size_x 近傍平均エリアの横サイズ。3〜画像の幅 の範囲の奇数を設定する
[in] size_y 近傍平均エリアの縦サイズ。3〜画像の高さ の範囲の奇数を設定する
[in] offset 周囲画素平均値からのオフセット。
F_IMG_UC8 のとき $ -255 \le offset \le 255 $ それ以外の時 $ -65535 \le offset \le 65535 $
[in] border_mode ボーダー処理モード
  • F_BORDER_NONE ボーダー拡張しない
  • F_BORDER_ZERO 0埋めモード
  • F_BORDER_VALUE 一定値モード
  • F_BORDER_CONTINUOUS 端延長モード
  • F_BORDER_REPEAT 繰り返しモード
  • F_BORDER_MIRROR1 反転モード1
  • F_BORDER_MIRROR2 反転モード2
[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 ライセンスエラー、または未初期化エラー
処理結果例:
画像中央に輝度値の高い領域があるような入力画像に対し、輝度値の高い領域をマスクして処理を行った結果と、 マスクを使用せずに処理を行った結果を示します。
マスクを使用しない場合の処理結果では輝度値の高い領域の影響によりその周辺に黒画素が発生しますが、 マスクを使用することにより影響を防ぐことができます。

fie_shift_avr_thresh_offs_msk_src.png

入力画像

    マスクを使用しない場合
fnFIE_shift_avr_threshold_offset()
   
fie_shift_avr_thresh_offs_no_msk_dst.png

結果画像

 
マスクを使用した場合
fnFIE_shift_avr_threshold_offset_mask()
fie_shift_avr_thresh_offs_msk_msk.png

マスク画像

 
fie_shift_avr_thresh_offs_msk_dst1.png

結果画像

TIPS:
本関数では出力画像上でマスクされている領域については、元の画素値を保持します。
出力画像上でマスクされている領域を白(または黒)としたい場合には、本関数を呼び出す前に出力画像全面を白(または黒)でクリアして下さい。
参照:
fnFIE_shift_avr_threshold_offset()

INT FVALGAPI fnFIE_band_threshold_ch ( const FHANDLE  hsrc,
FHANDLE  hdst,
const DOUBLE *  tlow,
const DOUBLE *  thigh,
INT  back_clear 
)

2つの固定しきい値を用いたセグメンテーション処理

指定された画像のセグメンテーション処理をします。入力画像の各画素の値が閾値 tlowthigh の間に入っているかどうか調べ、出力画像の同一画素に書き込みます。

fnFIE_band_threshold() との違いは、以下の通りです。

  • 閾値をチャネル毎に指定でき、全てのチャネルで条件を満たした場合に画素を出力する
  • 出力画像として、2値画像だけではなく、入力画像と同じ型・同じチャネル数の画像を指定できる
  • 出力画像として2値画像を指定する場合、1チャネルである必要がある
  • 背景の処理法を指定できる
入出力画像
入出力画像は以下の条件を満たしている必要があります。
  • 出力画像が入力画像と同じ画像型である場合
    • 入出力画像のサイズ(幅・高さ)が等しい
    • 入出力画像のチャネル数が等しい
    • 入出力画像の画像型は F_IMG_UC8, F_IMG_S16, F_IMG_US16, F_IMG_DOUBLE, F_IMG_RGBQUAD のいずれか
    • 入出力画像の型が F_IMG_RGBQUAD の場合、チャネル数は1のみ指定可能
  • 出力画像の型が入力画像と異なる型である場合
    • 入出力画像のサイズ(幅・高さ)が等しい
    • 出力画像は F_IMG_BIN 1チャネルである
    • 入力画像の画像型は F_IMG_UC8, F_IMG_S16, F_IMG_US16, F_IMG_DOUBLE, F_IMG_RGBQUAD のいずれか
    • 入力画像の型が F_IMG_RGBQUAD の場合、チャネル数は1のみ指定可能
閾値パラメータ
閾値パラメータ tlowthigh は入力画像のチャネル数と画像型に応じた要素数の配列です。 必要な要素数以上の配列を指定してください。
  • 入力画像に F_IMG_RGBQUAD を指定する場合、画像のチャネル数は必ず1になりますが、必要な要素数は3です。配列の先頭からR,G,Bの順に閾値を指定します。
  • 入力画像に F_IMG_RGBQUAD 以外を指定する場合、必要な要素数はチャネル数と同一です。配列の先頭から各チャネルに対応する閾値を指定します。
入力画像型が F_IMG_DOUBLE 以外の場合 閾値パラメータ tlowthigh は判定時に整数型へキャストされた後に評価されます。
また thightlow 以上でなければなりません。
閾値による判定と出力画像に書き込む画素値
  • 入力画像に F_IMG_UC8, F_IMG_S16, F_IMG_US16, F_IMG_DOUBLE を指定する場合
    全てのチャネルで閾値を満たした場合に条件が満たされたとして画素を出力します。
    入力画像のチャネルc座標(x,y)における濃度値をS(x,y,c), 出力画像のチャネルc座標(x,y)における濃度値をD(x,y,c),チャネルcの閾値をtlow[c],thigh[c],入力画像の保持するチャネル数をnとしたとき、
    (tlow[0] <= S(x,y,0) && thigh[0] >= S(x,y,0)) &&
    (tlow[1] <= S(x,y,1) && thigh[1] >= S(x,y,1)) &&
    ... &&(tlow[n-1] <= S(x,y,n-1) && thigh[n-1] >= S(x,y,n-1))
    の場合に条件が満たされたとし、 D(x,y,c) = S(x,y,c) とします。
  • 入力画像に F_IMG_RGBQUAD を指定する場合
    r,g,b 全てで閾値を満たした場合に条件が満たされたとして画素を出力します。
    ( tlow[0] <= S(x,y).rgbRed && thigh[0] >= S(x,y).rgbRed )&&
    ( tlow[1] <= S(x,y).rgbGreen && thigh[1] >= S(x,y).rgbGreen )&&
    ( tlow[2] <= S(x,y).rgbBlue && thigh[2] >= S(x,y).rgbBlue )
出力画像に書き込む画素値
  • 閾値の条件を満たした場合
    • 出力画像が F_IMG_BIN の場合、条件を満たしたピクセルと同じ座標の画素を1にします。
    • 出力画像が F_IMG_UC8, F_IMG_S16, F_IMG_US16, F_IMG_DOUBLE の場合、条件を満たしたピクセルと同じ座標の画素を出力画像の全てのチャネルで入力画像と同じ値にします。
    • 出力画像が F_IMG_RGBQUAD の場合、条件を満たしたピクセルと同じ座標の画素で rgbRed, rgbGreen, rgbBlue のメンバを入力画像と同じ値にし、rgbReservedを0にします。
  • 条件を満たさない場合、出力画像の全てのチャネルで以下の処理をします。
    • back_clear が TRUE
      0 を書き込みます。
    • back_clear が FALSE
      元の値を保持します。
引数:
[in] hsrc 入力画像(type:uc8,s16,us16,double,rgbq)
[out] hdst 出力画像(type:uc8,s16,us16,double,rgbq,bin)
[in] tlow 閾値の下限配列
[in] thigh 閾値の上限配列
[in] back_clear 背景処理法
  • TRUE 閾値の指定範囲外になる画素は0クリア
  • FALSE 閾値の指定範囲外になる画素は出力先の元々の値を保持
戻り値:
F_ERR_NONE 正常終了
F_ERR_NOMEMORY 作業用画像が確保できない
F_ERR_INVALID_IMAGE 不正な画像オブジェクトが渡された
F_ERR_INVALID_PARAM 不正なパラメータが渡された
  • 閾値がNULL
  • 閾値の大小が逆転している
  • 入出力画像の形式が合わない
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
処理結果例:
以下の結果は、全てのチャネル(0,1,2)の濃度が 64〜255 に該当する画素を切り出す処理の結果です。
palette_rgb.png

入力画像

fie_binarize_band_threshold_ch.png

処理結果画像

INT FVALGAPI fnFIE_band_threshold ( FHANDLE  hsrc,
FHANDLE  hdst,
DOUBLE  tlow,
DOUBLE  thigh 
)

二つの固定しきい値を用いて2値化

指定された濃淡画像を2値化画像へ変換します。 2値化は、濃淡画像の濃度値をX、閾値をtlowとthighとしたとき、

  • tlow <= X && thigh >= X: 1
  • tlow > X || thigh < X: 0
    となります。

入力画像型が F_IMG_DOUBLE 以外の場合 閾値パラメータ tlowthigh は判定時に整数型へキャストされた後に評価されます。

また thightlow 以上でなければなりません。

入力画像と出力画像は下記の条件をすべて満たしている必要が有ります。

  • サイズ(幅・高さ)が等しい
  • 入力画像及び出力画像のチャネル数が等しい
  • 入力画像の型はF_IMG_UC8, F_IMG_S16, F_IMG_US16, F_IMG_DOUBLE のいずれか
  • 出力画像の型はF_IMG_BIN

引数:
[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 ライセンスエラー、または未初期化エラー
参考文献:
  • Henry S. Warren, jr. "ハッカーのたのしみ",Chap.7, pp. 107, 株式会社星雲社,2005年6月1日初版

使用例:
// エラー処理は省略しているので注意して下さい。
#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;
}
処理結果例:
book.png

入力画像

fie_binarize_band_threshold.png

処理結果画像

INT FVALGAPI fnFIE_watershed ( FHANDLE  hSrc,
FHANDLE  hDst 
)

Watershed法による領域分割

Watershed法(分水嶺法)による画像の領域分割を行います

Watershed法は、入力画像の輝度勾配を山(輝度が高い画素)と谷(輝度が低い画素)に見立て、 谷底となっている部分に水を溜めて池を作ったとき、池同士の境界線(分水嶺)となる部分を 領域の境界線とするアルゴリズムです。
(池の水位を徐々に上げていったときに、池同士がちょうどつながり合う部分と考えてもよいでしょう)

fie_watershed_1dImage.png

1次元でのwatershedの例(山と谷)

fie_watershed_1dImage2.png

1次元でのwatershedの例(境界線)

本関数は、MP.Soille氏の著書"Morphological Image Analysis"にて紹介されている方法でWatershed法を実装をしています。 これは、注目画素に対してその周囲8近傍の画素を探索し、池同士がぶつかっていないかを確認していくというものです。

複数の物体が隣接しているような状況で2値化やブロブ解析を行うと、 それらを1つの物体として認識してしまうケースがあります。その際に本関数を適応し、 物体間の境界線を求めることで、物体同士を正しく分離することができます。

処理結果は2値画像で出力され、分割領域の境界線の画素値は1、 分割される領域の画素値は0となります。
分水嶺が幅を持つ場合は、中央付近の画素値を1としますが、 境界線の線幅は1になるとは限らず、また完全に分水嶺の中心になるとも限りません。

入力画像の画像型が F_IMG_RGBQUAD または F_IMG_RGBTRIPLE の場合には 以下のような3チャネルのUC8画像とみなして処理を行います。

  • ch = 0 : 赤成分(R)
  • ch = 1 : 緑成分(G)
  • ch = 2 : 青成分(B)

このとき、入力画像のチャネル数は 1 、出力画像のチャネル数は 3 である必要があります。

入力画像、出力画像は下記の条件をすべて満たしている必要が有ります。

  • サイズ(幅・高さ)が等しい
  • 入力画像の型はF_IMG_UC8, F_IMG_S16, F_IMG_US16, F_IMG_DOUBLE, F_IMG_RGBQUAD, F_IMG_FLOAT, F_IMG_RGBTRIPLEのいずれか
  • 出力画像の型はF_IMG_BIN
  • 入力画像の型がF_IMG_RGBQUAD, F_IMG_RGBTRIPLEの場合、入力画像のチャネル数は1, 出力画像のチャネル数は3
  • 入力画像の型がF_IMG_RGBQUAD, F_IMG_RGBTRIPLE以外の場合、チャネル数が等しい

入力画像が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 ライセンスエラー、または未初期化エラー
参考文献:
  • MP.Soille "Morphological Image Analysis(Second Edition)",Chap.9, pp. 268-277, Springer; 2nd Corrected ed. 2004. Corr. 2nd printing 2004版 (2003/1/17)

処理結果例:
fie_watershed_in.png

入力画像

fie_watershed_result.png

出力画像

適応例:
入出力画像は、"処理結果例"と同じです。
fie_watershed_in_bin.png

入力画像の2値化

fie_watershed_in_blob.png

ブロブ解析結果

fie_watershed_or.png

入力画像の2値化と出力画像のOR

fie_watershed_or_blob.png

ブロブ解析結果

使用例
// エラー処理は省略しているので注意して下さい。
#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;
}
上記の使用例により得られる画像:
fie_watershed_smp_watershed_before.bmp

入力画像

fie_watershed_smp_watershed_depth.bmp

距離画像(画素値反転)

fie_watershed_smp_watershed_partition.bmp

境界線画像(本関数の出力画像)

fie_watershed_smp_watershed_separated.bmp

分離画像


Documentation copyright © 2009-2024 FAST Corporation.
Generated on Fri Aug 9 16:38:47 2024 for FIEライブラリ by doxygen 1.5.6-FASTSP-p2