01: #ifndef __INCLUDE_CLUSTERING_H__
02: #define __INCLUDE_CLUSTERING_H__
03: 
04: #include <windows.h>
05: #include "wingui.h"
06: #include "ipcommon.h"
07: 
08: //-----------------------------------------------------------------
09: // クラスタリング
10: #define MAX_PNTS   3000         // 想定する最大構成点数
11: #define MAX_CLSTR  3000         // 想定する最大クラスタ数
12: #define KC_INITK    100         // K値の初期化数
13: #define KC_MINERR   1.0         // 移動チェック用しきい値
14: // ベクトル量子化
15: #define VQ_INITK    100         // K値の初期化数
16: #define VQ_MAXBLK   300         // 横・縦方向の最大ブロック数
17: #define VQ_BLKSZ      4         // 想定ブロックサイズ 4 x 4 画素
18: #define VQ_DIM       16         // ベクトルの次元(= 4 x 4 )
19: #define CVQ_DIM      48         // ベクトルの次元(= 4 x 4 x 3)
20: #define VQ_MINERR   5.0         // 移動チェック用しきい値
21: //-----------------------------------------------------------------
22: // 描画オプション
23: //-----------------------------------------------------------------
24: enum CLUSTER_DISP_OPTION {
25:     CLUT_DCENT=0,               // クラスタ中心のみ
26:     CLUT_DALLPOINT=1,           // クラスタ中心, 全点
27:     CLUT_DALL=2,                // クラスタ中心, 全点, クラスタまでの直線
28: };
29: //-----------------------------------------------------------------
30: // クラスタリングデータ
31: //-----------------------------------------------------------------
32: typedef struct CLUSTERING_DATA {
33:     int num_pnts;               // 点の総数
34:     int num_clstr;              // クラスタの総数
35:     int p_clstr[MAX_PNTS];    // 点が属するクラスタ番号
36:     POINT points[MAX_PNTS];     // 点の座標
37:     POINT cclstr[MAX_CLSTR];    // クラスタの代表点の座標
38: } ClutData;
39: //-----------------------------------------------------------------
40: // ベクトル量子化データ
41: //-----------------------------------------------------------------
42: typedef struct COLOR_VECTOR {
43:     BYTE d[CVQ_DIM];
44: } C_vector;
45: typedef struct VECTOR_QUANTIZE_DATA {
46:     int x_block,y_block;                 // 横, 縦方向ブロック数
47:     int b_clstr[VQ_MAXBLK][VQ_MAXBLK];   // 各ブロックの所属クラスタ番号
48:     BYTE vector[VQ_MAXBLK][VQ_MAXBLK][VQ_DIM]; // 各ブロックのベクトル
49:     BYTE main_vector[MAX_CLSTR][VQ_DIM]; // 代表ベクトル
50: } VQData;
51: typedef struct C_VECTOR_QUANTIZE_DATA {
52:     int x_block,y_block;                 // 横, 縦方向ブロック数
53:     int b_clstr[VQ_MAXBLK][VQ_MAXBLK];   // 各ブロックの所属クラスタ番号
54:     C_vector* cv;                        // 各ブロックのベクトル
55:     //BYTE vector[VQ_MAXBLK][VQ_MAXBLK][CVQ_DIM]; 
56:     BYTE main_vector[MAX_CLSTR][CVQ_DIM]; // 代表ベクトル
57: } CVQData;
58: //-----------------------------------------------------------------
59: int  obtain_points_data(LPBYTE inBuf,ClutData& cltd);
60: void shuffle_points_data(ClutData& cltd);
61: double calc_vdistance(int y,int x,int n,VQData& vqd);
62: void obtain_vector_data(LPBYTE inb,VQData& vqd);
63: double calc_c_vdistance(int y,int x,int n,CVQData& vqd);
64: void obtain_c_vector_data(LPBYTE inb,CVQData& vqd);
65: //-----------------------------------------------------------------
66: // クラスタリング
67: //-----------------------------------------------------------------
68: // NN法
69: void clustering_NNmethod(LPBYTE inBuf,int clstr_r,int dopt=CLUT_DCENT);
70: // 階層的クラスタリング
71: void clustering_Tree(LPBYTE inBuf,int clstr_r,int dopt=CLUT_DCENT);
72: // K-平均法
73: void clustering_Kmean(LPBYTE inBuf,int clstr_r,int K_number=KC_INITK,
74:                       int dopt=CLUT_DCENT);
75: //-----------------------------------------------------------------
76: // ベクトル量子化
77: //-----------------------------------------------------------------
78: double vector_quantize(LPBYTE inb,int K_number=VQ_INITK);
79: double c_vector_quantize(LPBYTE inb,int K_number);
80: 
81: #endif // __INCLUDE_CLUSTERING_H__