パターン分類:クラスタリング処理

クラスタリング処理の例です。今回の例ではグレースケールの画像中から白点を検出し、白点をそれぞれのクラスタに分類しています。

クラスタリングの手法は様々ですが、今回はNN(Nearest Neighbour)法、階層的クラスタリング、K-平均法の例題を取り上げています。

NN法は最も近い距離にあるクラスタにパターンを分類していく手法で、距離がしきい値以上であると新規のクラスタとしてパターンを分類します。

階層的クラスタリングでは、最も近い距離にあるクラスタを次々に併合していき、最小距離がしきい値を越えると処理を終了します。

K-平均法では、初期にランダムなK個のパターンをクラスタとして設定、各パターンをクラスタに分類後、クラスタの中心位置を計算し、初期の中心位置と分類後の距離が一致、もしくはしきい値内なら処理を終了します。

以上のように、各クラスタリング手法ともしきい値の設定により分類の精度等が変わります。

分類される点は(x,y)の2次元座標ですが、1次元や多次元のパターン分類にもクラスタリングを応用する事ができます。プログラム上では、距離の計算や位置の指定等を変更するのみで計算が可能となります。

元画像   クラスタリング処理後
(G成分/階層的クラスタリング)
 

実行ファイルのダウンロード: ip_clstr.exe

 ダウンロード

クラスタリング処理(ip_clstr.cpp)
//-----------------------------------------------------------------
// ip_clstr.cpp:
//     パターン分類: クラスタリング手法
//                Last Update: <2004/12/22 22:19:09 A.Murakami>
//-----------------------------------------------------------------
#include <stdio.h>
#include <windows.h>
#include "wingui.h"
#include "ipcommon.h"
#include "clustering.h"
//-----------------------------------------------------------------
#define CLSTR_R 20 // クラスタ半径
//-----------------------------------------------------------------
void toOrg();
void NNmethod();
void Tree();
void Kmean();
//-----------------------------------------------------------------
// メニューへの追加内容
//-----------------------------------------------------------------
MenuInfo MI[] = {
    {"元画像",toOrg},
    {"Clustering(NN)",NNmethod},
    {"Clustering(Tree)",Tree},
    {"Clustering(K-mean)",Kmean},
    {NULL,NULL}
};
//-----------------------------------------------------------------
// 初期化
//-----------------------------------------------------------------
void IP_init(){}
//-----------------------------------------------------------------
// 元画像の表示
//-----------------------------------------------------------------
void toOrg() { CopyMemory(lpBMP,lpOrgBMP,iLength*iHeight); }
//-----------------------------------------------------------------
// NN法によるクラスタリング
//-----------------------------------------------------------------
void NNmethod()
{
    // 濃淡画像の取得
    LPBYTE iGray=GetGray(COLOR_G); //GetGray();
    clustering_NNmethod(iGray,CLSTR_R,CLUT_DALL);
    //--------------------------------------------------
    //    iGray: 入力/表示画像
    // CLSTR_R: 初期クラスタ半径,
    // 表示オプション:
    //        CLUT_DALL: クラスタ中心, 全パターン,
    //                   クラスタ-パターン間の距離の表示
    //       CLUT_DCENT: クラスタ中心のみ表示
    //   CLUT_DALLPOINT: クラスタ中心, 全パターンの表示
    //--------------------------------------------------
    // 表示用
    GrayToColor(iGray,lpBMP);
    // 後片付け
    GlobalFree(iGray);
}
//-----------------------------------------------------------------
// 階層的クラスタリング
//-----------------------------------------------------------------
void Tree()
{
    // 濃淡画像の取得
    LPBYTE iGray=GetGray(COLOR_G);
    clustering_Tree(iGray,CLSTR_R,CLUT_DCENT);
    //--------------------------------------------------
    //    iGray: 入力/表示画像
    // CLSTR_R: 最小クラスタ間距離
    //--------------------------------------------------
    // 表示用
    GrayToColor(iGray,lpBMP);
    // 後片付け
    GlobalFree(iGray);
}
//-----------------------------------------------------------------
// K-平均法によるクラスタリング
//-----------------------------------------------------------------
void Kmean()
{
    // 濃淡画像の取得
    LPBYTE iGray=GetGray(COLOR_G);
    clustering_Kmean(iGray,CLSTR_R,50,CLUT_DCENT);
    //--------------------------------------------------
    //    iGray: 入力/表示画像
    // CLSTR_R: 初期クラスタ半径
    //      50: K-number(K個の初期クラスタを与える)
    //--------------------------------------------------
    // 表示用
    GrayToColor(iGray,lpBMP);
    // 後片付け
    GlobalFree(iGray);
}
inserted by FC2 system