ラベリング処理の例です。ラベリング処理では2値画像において連結している領域にそれぞれ番号を割り当てます。
2値画像の生成の例として、通常行われるグレイスケールの2値化の他、RGB各成分毎に2値化を行う方法等が考えられます。また、画像のn値化を行い、それぞれの濃度領域を2値化画像として扱うこともできます。
今回の処理では、通常の2値化、RGB各成分毎の2値化、n値化後の2値化、のそれぞれの2値化に対するラベリング処理を行っています。また、ラベル付けされた領域の面積(ピクセル単位)を計算し、一定以上の大きさでないと表示されないようにしています。
ラベリングされた領域には、ランダムに割り当てられた色が表示されます。
CLabeling cLabel(256,30,ncol_n); 256: 最大ラベル数(最高256) 30: 表示最小面積(省略可: default 0) n: 多値化数(省略可: default 1→多値化なし) |
元画像 | ラベリング処理後 (R成分の2値化) |
|
実行ファイルのダウンロード: labeling.exe
//----------------------------------------------------------------- // 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); } |