クラスタリング処理を用いたベクトル量子化の例です。4x4の画像ブロックを一つのベクトルとして扱い(カラー画像の場合は更にx3)、それぞれのブロックを代表のクラスタへ分類していきます。今回の処理では、K-平均法により最終的なベクトル(クラスタ)の数を決定しています。
元画像 | K-平均法による量子化 (ベクトル数50個) |
|
実行ファイルのダウンロード: vec_quantize.exe
//----------------------------------------------------------------- // vec_quantize.cpp: // クラスタリング手法によるベクトル量子化 // Last Update: <2004/12/22 22:36:23 A.Murakami> //----------------------------------------------------------------- #include <stdio.h> #include <windows.h> #include "wingui.h" #include "ipcommon.h" #include "clustering.h" //----------------------------------------------------------------- void toOrg(); void VQ(); void C_VQ(); //----------------------------------------------------------------- // メニューへの追加内容 //----------------------------------------------------------------- MenuInfo MI[] = { {"元画像",toOrg}, {"ベクトル量子化",VQ}, {"ベクトル量子化(カラー)",C_VQ}, {NULL,NULL} }; //----------------------------------------------------------------- // 初期化 //----------------------------------------------------------------- void IP_init(){} //----------------------------------------------------------------- // 元画像の表示 //----------------------------------------------------------------- void toOrg() { CopyMemory(lpBMP,lpOrgBMP,iLength*iHeight); } //----------------------------------------------------------------- // ベクトル量子化 //----------------------------------------------------------------- void VQ() { double comp_rate; TCHAR msg[512]; // 濃淡画像の取得 LPBYTE iGray=GetGray(COLOR_GRAY); comp_rate = vector_quantize(iGray,10); //-------------------------------------------------- // iGray: 入力/表示画像 // 10: K-number(K個の初期クラスタを与える) //-------------------------------------------------- // 表示用 GrayToColor(iGray,lpBMP); // 後片付け GlobalFree(iGray); sprintf(msg,"圧縮率: %f[%]",comp_rate); MessageBox(NULL,msg,0,0); } // カラー画像用 void C_VQ() { double comp_rate; TCHAR msg[512]; comp_rate = c_vector_quantize(lpBMP,50); //-------------------------------------------------- // lpBMP: 入力/表示画像 // 50: K-number(K個の初期クラスタを与える) //-------------------------------------------------- sprintf(msg,"圧縮率: %f[%]",comp_rate); MessageBox(NULL,msg,0,0); } |