多値化
[画像フィルタ]


関数

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 が指定された場合にはこの値は使用されません)
  • 0 : 出力値は、注目クラスタの Mean-Shift 収束値の平均を四捨五入した値
  • 1 : 出力値は、入力画像 hsrc における画像タイプの濃度値範囲を num_discrimination で分割する際の等間隔値
戻り値:
F_ERR_NONE 正常終了
F_ERR_NOMEMORY メモリ不足
F_ERR_INVALID_IMAGE 画像オブジェクト異常
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参考文献:
  • D. Comaniciu and P. Meer, "Mean Shift: A Robust Approach Toward Feature Space Analysis," IEEE Trans. on Pattern Analysis and Machine Intelligence, vol.24, no.5, pp.603-619, 2002.
  • 岡田和典. "ミーンシフトの原理と応用". コンピュータビジョン最先端ガイド2. 八木 康史 他 編著 アドコムメディア株式会社. 2010. pp.61-89
処理結果例(bandwidth = 5, union_thresh = 0.05):
book.png

入力画像(type:uc8)

fie_multithresh_meanshift_mode0.png

結果画像(dst_mode = 0)

fie_multithresh_meanshift_mode1.png

結果画像(dst_mode = 1)

注意:
本関数では、内部で画像ヒストグラムの取得を行っています。
画像ヒストグラムを UINT で計算するため、入力画像サイズが $ 2^{32} $ 画素以上の場合にはオーバーフローの可能性が有ります。
参照:
fnFIE_meanshift_filter

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が指定された場合にはこの値は使用されません)
  • 0:出力値は、入力画像 hsrc のヒストグラムについて、得られたしきい値 thresh の各区間に存在する値の重み付き平均値
  • 1:出力値は、入力画像 hsrc における画像タイプの濃度値範囲を num_discrimination で分割する際の等間隔値
戻り値:
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;
}
処理結果例(5値化):
book.png

入力画像(type:uc8)

fie_multithresh5_discrimination_wm.png

  処理結果画像(dst_mode =0)

fie_multithresh5_discrimination_eq.png

  処理結果画像(dst_mode =1)

得られたしきい値に対しては、次のように多値化画像を作成しています。
入力画像の濃度最小値を min, 最大値を maxとし、この画像に対して n値化を行う場合、 入力画像の濃度値を$X$,対応する多値化後の値をval[i]$(i=0 \ldots n)$とすると、
      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
	
となります。
注意:
  • 画像ヒストグラムをUINTで計算するため、入力画像サイズが $ 2^{32} $ 画素以上の場合には オーバーフローの可能性が有ります。
  • 出力パラメータ hdstthresh には、必要がない場合には NULL 指定が可能ですが、両方同時にNULL を指定すると F_ERR_INVALID_PARAM を返します。
  • 本関数は動的計画法を用いて高速化を行っていますが、場合によっては秒以上の処理時間が掛かることがございます。 本アルゴリズムの計算量については多値化の分割数を$N$, 濃度の範囲を$L$としますと、$ NL^{2} $ のオーダーになります。 これは例えば、256階調の画像に対して 1(ms)掛かる状況下で 65536階調の画像を処理した場合、理論的には$(\frac{65536}{256})^{2} = 65536(ms) $掛かることを表しています。 特に 16ビット画像(type:us16,s16)を用いて 3値化以上の処理を行う場合にはご注意ください。
参照:
fnFIE_discrimination_threshold
参考文献:
  • パターン認識‐理論と応用 (行動計量学シリーズ) p75 大津 展之, 関田 巌, 栗田 多喜夫(著) 出版社: 朝倉書店 (1996/07) ISBN-10: 4254126522, ISBN-13: 978-4254126525

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が指定された場合にはこの値は使用されません)
  • 0:出力値は、入力画像 hsrc のヒストグラムについて、thresh の各区間に存在する値の重み付き平均値
  • 1:出力値は、入力画像 hsrc における画像タイプの濃度値範囲を num_discrimination で分割する際の等間隔値
戻り値:
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;
}
処理結果例(5値化):
book.png

入力画像(type:uc8)

fie_multithresh5_kittler_wm.png

  処理結果画像(dst_mode =0)

fie_multithresh5_kittler_eq.png

  処理結果画像(dst_mode =1)

得られたしきい値に対しては、次のように多値化画像を作成しています。
入力画像の濃度最小値を min, 最大値を maxとし、この画像に対して n値化を行う場合、 入力画像の濃度値を$X$,対応する多値化後の値をval[i]$(i=0 \ldots n)$とすると、
      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
	
となります。
注意:
  • 画像ヒストグラムをUINTで計算するため、入力画像サイズが $ 2^{32} $ 画素以上の場合には オーバーフローの可能性が有ります。
  • 出力パラメータ hdstthresh には、必要がない場合には NULL 指定が可能ですが、両方同時にNULL を指定すると F_ERR_INVALID_PARAM を返します。
  • 本関数は動的計画法を用いて高速化を行っていますが、場合によっては秒以上の処理時間が掛かることがございます。 本アルゴリズムの計算量については多値化の分割数を$N$, 濃度の範囲を$L$としますと、$ NL^{2} $ のオーダーになります。 これは例えば、256階調の画像に対して 1(ms)掛かる状況下で 65536階調の画像を処理した場合、理論的には$(\frac{65536}{256})^{2} = 65536(ms) $掛かることを表しています。 特に 16ビット画像(type:us16,s16)を用いて 3値化以上の処理を行う場合にはご注意ください。
参照:
fnFIE_kittler_threshold
参考文献:
  • パターン認識‐理論と応用 (行動計量学シリーズ) 大津 展之, 関田 巌, 栗田 多喜夫(著) 出版社: 朝倉書店 (1996/07) ISBN-10: 4254126522, ISBN-13: 978-4254126525


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