ラベリング処理

ラベリング処理の例です。ラベリング処理では2値画像において連結している領域にそれぞれ番号を割り当てます。

2値画像の生成の例として、通常行われるグレイスケールの2値化の他、RGB各成分毎に2値化を行う方法等が考えられます。また、画像のn値化を行い、それぞれの濃度領域を2値化画像として扱うこともできます。

今回の処理では、通常の2値化、RGB各成分毎の2値化、n値化後の2値化、のそれぞれの2値化に対するラベリング処理を行っています。また、ラベル付けされた領域の面積(ピクセル単位)を計算し、一定以上の大きさでないと表示されないようにしています。

ラベリングされた領域には、ランダムに割り当てられた色が表示されます。

ラベリングの設定例(ilabel.cpp)
CLabeling cLabel(256,30,ncol_n);
                 256: 最大ラベル数(最高256)
                  30: 表示最小面積(省略可: default 0)
                   n: 多値化数(省略可: default 1→多値化なし)

元画像   ラベリング処理後
(R成分の2値化)
 

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

 ダウンロード

ラベリング処理(ilabel.cpp)
//-----------------------------------------------------------------
// ilabel.cpp:
//    ラベリング処理
//                Last Update: <2004/12/05 02:20:08 A.Murakami>
//-----------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include "wingui.h"
#include "ipcommon.h"
#include "binalize.h"
#include "labeling.h"
#define  NCOL_N 3
//-----------------------------------------------------------------
extern UINT iHeight,iWidth,iLength,iSize;// 高さ,幅,1ライン幅,サイズ
extern LPBYTE lpOrgBMP,lpBMP;            // 元画像, 表示画像
//-----------------------------------------------------------------
void toOrg();
void Label();
void rLabel();
void gLabel();
void bLabel();
void nLabel();
void Labeling(int bwopt=BW_NORMAL);
void nLabeling(int ncol_n);
//-----------------------------------------------------------------
// メニューへの追加内容
//-----------------------------------------------------------------
MenuInfo MI[] = {
    {"元画像",toOrg},
    {"ラベリング",Label},
    {"Rラベリング",rLabel},
    {"Gラベリング",gLabel},
    {"Bラベリング",bLabel},
    {"nラベリング",nLabel},
    {NULL,NULL}
};
//-----------------------------------------------------------------
// 元画像の表示
//-----------------------------------------------------------------
void toOrg() { CopyMemory(lpBMP,lpOrgBMP,iLength*iHeight); }
//-----------------------------------------------------------------
// ラベリング処理
//-----------------------------------------------------------------
void Label()  { Labeling(); }
void rLabel() { Labeling(BW_COLR); }
void gLabel() { Labeling(BW_COLG); }
void bLabel() { Labeling(BW_COLB); }
void nLabel() { nLabeling(NCOL_N); }
//-----------------------------------------------------------------
// ラベリング処理
//-----------------------------------------------------------------
// ラベリング
void Labeling(int bwopt)
{
    CLabeling cLabel(256,35);
    // 2値化画像の取得
    LPBYTE iLabel=GetBin(bwopt,BW_BKG_AUTO);
    // ラベリング
    cLabel.Labeling(iLabel);
    cLabel.Label_color(iLabel);
    // 後片付け
    GlobalFree(iLabel);
}
//-----------------------------------------------------------------
// n値画像のラベリング
//-----------------------------------------------------------------
void nLabeling(int ncol_n)
{
    CLabeling cLabel(256,35,ncol_n);
    // n値化画像の取得
    LPBYTE iLabel=GetNCol(ncol_n,BW_BKG_AUTO);
    // ラベリング処理
    cLabel.Labeling(iLabel);
    cLabel.nLabel_color();
    cLabel.nLabel_free();
    // 後片付け
    GlobalFree(iLabel);
}
inserted by FC2 system