クラスタリング処理によるベクトル量子化

クラスタリング処理を用いたベクトル量子化の例です。4x4の画像ブロックを一つのベクトルとして扱い(カラー画像の場合は更にx3)、それぞれのブロックを代表のクラスタへ分類していきます。今回の処理では、K-平均法により最終的なベクトル(クラスタ)の数を決定しています。

元画像   K-平均法による量子化
(ベクトル数50個)
 

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

 ダウンロード

クラスタリング処理(vec_quantize.cpp)
//-----------------------------------------------------------------
// 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);
}
inserted by FC2 system