#ifndef __INCLUDE_CLUSTERING_H__ #define __INCLUDE_CLUSTERING_H__ #include #include "wingui.h" #include "ipcommon.h" //----------------------------------------------------------------- // クラスタリング #define MAX_PNTS 3000 // 想定する最大構成点数 #define MAX_CLSTR 3000 // 想定する最大クラスタ数 #define KC_INITK 100 // K値の初期化数 #define KC_MINERR 1.0 // 移動チェック用しきい値 // ベクトル量子化 #define VQ_INITK 100 // K値の初期化数 #define VQ_MAXBLK 300 // 横・縦方向の最大ブロック数 #define VQ_BLKSZ 4 // 想定ブロックサイズ 4 x 4 画素 #define VQ_DIM 16 // ベクトルの次元(= 4 x 4 ) #define CVQ_DIM 48 // ベクトルの次元(= 4 x 4 x 3) #define VQ_MINERR 5.0 // 移動チェック用しきい値 //----------------------------------------------------------------- // 描画オプション //----------------------------------------------------------------- enum CLUSTER_DISP_OPTION { CLUT_DCENT=0, // クラスタ中心のみ CLUT_DALLPOINT=1, // クラスタ中心, 全点 CLUT_DALL=2, // クラスタ中心, 全点, クラスタまでの直線 }; //----------------------------------------------------------------- // クラスタリングデータ //----------------------------------------------------------------- typedef struct CLUSTERING_DATA { int num_pnts; // 点の総数 int num_clstr; // クラスタの総数 int p_clstr[MAX_PNTS]; // 点が属するクラスタ番号 POINT points[MAX_PNTS]; // 点の座標 POINT cclstr[MAX_CLSTR]; // クラスタの代表点の座標 } ClutData; //----------------------------------------------------------------- // ベクトル量子化データ //----------------------------------------------------------------- typedef struct COLOR_VECTOR { BYTE d[CVQ_DIM]; } C_vector; typedef struct VECTOR_QUANTIZE_DATA { int x_block,y_block; // 横, 縦方向ブロック数 int b_clstr[VQ_MAXBLK][VQ_MAXBLK]; // 各ブロックの所属クラスタ番号 BYTE vector[VQ_MAXBLK][VQ_MAXBLK][VQ_DIM]; // 各ブロックのベクトル BYTE main_vector[MAX_CLSTR][VQ_DIM]; // 代表ベクトル } VQData; typedef struct C_VECTOR_QUANTIZE_DATA { int x_block,y_block; // 横, 縦方向ブロック数 int b_clstr[VQ_MAXBLK][VQ_MAXBLK]; // 各ブロックの所属クラスタ番号 C_vector* cv; // 各ブロックのベクトル //BYTE vector[VQ_MAXBLK][VQ_MAXBLK][CVQ_DIM]; BYTE main_vector[MAX_CLSTR][CVQ_DIM]; // 代表ベクトル } CVQData; //----------------------------------------------------------------- int obtain_points_data(LPBYTE inBuf,ClutData& cltd); void shuffle_points_data(ClutData& cltd); double calc_vdistance(int y,int x,int n,VQData& vqd); void obtain_vector_data(LPBYTE inb,VQData& vqd); double calc_c_vdistance(int y,int x,int n,CVQData& vqd); void obtain_c_vector_data(LPBYTE inb,CVQData& vqd); //----------------------------------------------------------------- // クラスタリング //----------------------------------------------------------------- // NN法 void clustering_NNmethod(LPBYTE inBuf,int clstr_r,int dopt=CLUT_DCENT); // 階層的クラスタリング void clustering_Tree(LPBYTE inBuf,int clstr_r,int dopt=CLUT_DCENT); // K-平均法 void clustering_Kmean(LPBYTE inBuf,int clstr_r,int K_number=KC_INITK, int dopt=CLUT_DCENT); //----------------------------------------------------------------- // ベクトル量子化 //----------------------------------------------------------------- double vector_quantize(LPBYTE inb,int K_number=VQ_INITK); double c_vector_quantize(LPBYTE inb,int K_number); #endif // __INCLUDE_CLUSTERING_H__