画像処理のための高速ラベリングソフト +α


高速ラベリングアプリケーションソフト        (2010/05/05)

画像データ上の対象物を識別する方法として、ラベリング処理があります。ラベリングとは、画像上から対象物
を構成する塊毎に固有の番号を付ける処理です。事前のラベル付けで、様々な処理が容易に行える様になります。
基本概念を理解したい場合は、"Let's begin の ・画像処理事始”(ツールのソースを含む) を参照下さい。
二値データのラベリング処理を行います。二値のラベリングでは、データを0と0以外の2値として処理します。
0は対象外、0以外が対象で、その値は意識しません。 多値データに対するラベリングとでは概念が大きく
異なり、多値データのラベリングでは、値0も一つの有効な値として処理されます。 概多値ラベリング処理では、
入力データを32ビットの符号なしデータとして扱うので、4,294,967,296 種類の構成要素の識別が可能です。
通常のカラー画像(RGB各8ビット)は、16,777,216 の値しか取れないので、32ビットデータに包括されます。
Voxelのラベリング:3次元の多値データを対象とした、高速ラベリング処理(6連結、18連結、26連結)

md5sum: f59160fa150bf8c06408d80789c5c41a CrystApp.zip 現在配布を停止
代替手段として2値データ用の4連結、8連結のラベリング処理の簡易実装版を用意しました。
画像処理事始labeling4labeling(C言語のソースとWindowsの実行形式)を参照して下さい。


はじめに

コンピューター画像処理では、画像データから対象物を特定し特徴量を計算しますが、時間のかかる処理
が多いのも事実です。処理速度の改善のために、事前に対象物に識別番号(ラベリング)をふっておく事は
効果が見込めますが、この識別番号を割り当てるラベリング処理自体に時間がかかってしまう事も多々有
ります。 また、構成画素数の多い画像では、ラベリング処理の完了までの時間が長くなり、期待する時間
内で処理が完了せず、実質的に利用できないケースも発生します。
この問題の解決用に高速ラベリングツールを提供します。 今回のツールは、入力用の画像フォーマット
として、BMPファイル形式(8|24|32 ビット無圧縮形式のBMPファイル)を採用しています。また、
入力可能な画像の大きさに制限を設けています。画像を構成する画素の総数が、144,000,000以下の
ファイルしか受け付けません。
 これは、A4を1200 dpi で取り込んだ画像、又は12,000x12,000画素
の画像に相当しますので、制限はあるものの利用に支障のない大きさだと考えています。 テスト用の
12,000x12,000 画素の24ビット形式のBMPファイルでも、400MB を超えてしまいます。 また、ラベリング
データは、1画素分が32ビットなので、処理結果のファイルは 500MB を超えてしまいます。
提供するソフトは、12,000x12,000 画素で 400,000 個以上の対象物 を含むテスト用の画像の処理を、
1分以内 (ラベリング処理は2秒弱) で完了しますので、ラベリング性能の高さが分かると思います。
このソフトは、処理時間のほとんどを、画像の読み込みと、ラベリングデータの書き出しに費やしています。
(テスト環境は、WindowsXP SP3、CPUは、Core 2 E7200 2.53GHz、MEM 4G、HDD AHCI接続 3G )

12,000 x 12,000 PIXEL の BMP  ファイルに対するラベリング処理の速度に関して言えば、同一
のソフトが、i7-3770T 2.5 GHz 32G Mem Windows 8 環境では、 600msec 以下で処理できます。
ソフトの修正が無くともCPUの性能向上が著しいので、簡単に 3倍以上に高速化されます。


画像に関して

画像は画素(Pixel) を単位に構成され、横方向と縦方向に画素を並べていく事で、画像が構成されます。
また、画素は個別の色情報を持っています。通常は、R、G、B 系が用いられ、R、G、B 各要素に、8ビット
の大きさが割り当てれれています。  8ビットの符号無しデータとして扱われ、0~255までの256諧調
を表現出来ます。  R、G、B それぞれが独自に256諧調の情報を持つので、使用できる色の総数は、
16777216 色(256*256*256) となります。
1画素が32ビット(RGB各8ビット+8ビットの予約部)の形式を標準形式として使用します。

此処では、画面上の黒い部分を背景部、背景以外の部分(0以外の部分)を対象物とします。 


ソフトに関して

アプリケーションソフトは、以下の3つのプログラム(バイナリー形式)から構成されています。
Labeling.exe
lineprofile.exe
Label2colorBMP.exe


また、以下のファイル(Cのソースコード付きサンプルソフト)が同胞されています。
Clipping Clipping.exe: 指定値以下を輝度0に置き換える(オプションで 2値化可能)
Clipping.c: C 言語 のソースコード
Clipping.txt: 使用方法
LogicalOperation bmp32lop.exe BMP(32Bit)ファイル間で論理演算 (&,|,~,^)をするプログラム
bmp32lop.c: C 言語 のソースコード
bmp32lop.txt: 使用方法
Measurement measurement.exe: 対象物の面積、重心の算出、擬似カラーBMPファイルの作成
measurement.c: C 言語 のソースコード
measurement.txt: 使用方法
rmLargeObj rmLargeObj.exe: 指定画素以上の対象物を削除するプログラム
rmLargeObj.c: C 言語 のソースコード
rmLargeObj.txt: 使用方法
rmSmallObj rmSmallObj.exe: 指定画素以下の対象物を削除するプログラム
rmSmallObj.c: C 言語 のソースコード
rmSmallObj.txt: 使用方法
showBMPh showBMPh.exe BMPファイルのヘッダー部の情報をコンソール出力するプログラム
showBMPh.c: C 言語 のソースコード
showBMPh.txt: 使用方法


Labeling.exe

Labeling exe は、8ビット、24ビット又は32ビットのBMPファイルを読み込み、画像中の対象物に8連結
の連結性解析を行って、識別用の番号(ラベリング)を付与します。
対象物とは、画像の縁か、輝度0(背景)の画素で囲まれた境域を指します。通常は2画素以上の画素の
塊として、出現しますのでその構成画素に同一の番号を割り付けます。対象物を構成する画素の明るさは
特定されません。背景(輝度0)以外の画素は全て、対象物を構成する要素であると認識します。
それぞれの対象物には、異なる番号(ラベリング)を割り当てます。同一の対象物を表す画素には同じ番号
を異なる対象物には、異なる番号を付ける事で、画素に対応したラベル値(ラベリングされた値)を知れば、
どの対象物を構成する画素であるかを容易に判断できるようになります。

ここで提供するプログラムには、読み込む画像の大きさに制限が設けられています。
画像を構成する画素数が、144,000,000 画素 (12,000x12,000相当の画像、A4を1200 dpi で取り込んだ画像) 
以下しか扱えません。また、動作環境は、Windows XP SP3 日本語 32ビットで、MEM: 4G, HDD: AHCI 接続
されていることを想定しています。 (CPUは、Core 2 Duo E7200 @2.5GHz 以上を推奨します)
ミッドレンジのパソコンを使用した場合でも、ラベリングの処理時間は、対象物の数が 400,000以上
の 12,000x12,000の画像で、2秒程度です。 高速ラベリング処理 天体データ” を参照の事
このプログラムは、GPUの性能を必要としませんが、同胞されている表示用のツールの使用時には、
ミドルクラス以上のGPUを搭載したグラフィックカードを使用してください。
注意事項
提供バージョンのラベリングソフトは、読み込んだ画像を、内部で次の式によりグレー画像に変換して、輝度
評価を行っています。  出力画素(グレー画像) = (0.299 * R成分 + 0.587 * G成分 + 0.114 * B成分)
この計算上、カラー画像としては、輝度が 0 (R、G、Bの値が全て 0 )でない場合でも、グレー画像では 0
(背景)となってしまう場合がある事をご理解しご利用下さい。

読み込んだ画像を濃淡画像に変換してから、輝度の評価を行っていた仕様を変更し、0 、(R,G,B) =
(0,0,0) のみを背景とします。 この仕様変更に伴い、本来削除されていた、輝度が (3,0,0)、(0,1,0)、
(0,0,8) ...の低輝度の画素が、新たにラベリングの対象に加わります。
背景(輝度 0)と、対象物(輝度 0 以外)を分離する前処理(カラー画像)では、変更の考慮が必要です。


このコマンドは、CUIベースで使用するように設計されていますので、"コマンド プロンプト" 等を起動して、
以下の様に入力してください。  Output_LabelingFileName には、拡張子が自動的に付加されます。

Labeling.exe  Input_FileName  [Output_LabelingFileName]

         Input_FileName:       BMP file. (8|24|32 Bit no compression format.)
         Output_LabelFileName: Output_LabelingFileName.cfg
                               Output_LabelingFileName.lbl

         Default OutputFileName: labelingCryst.cfg, labelingCryst.lbl


Labeling.exeを実行すると以下の、2つのファイルが作成されます。
                     各ファイルの詳細は、"ラベリンファイルの構成" を参照してください。

labelingCryst.cfg ラベリングデータファイルの補助情報を記録したファイル。
ラベルデータファイルの幅(biWidth)と高さ(biHeight)が格納されています。
BMP(32ビットカラー)のヘッダー形式を流用していますので、
BMPファイルにアクセスする手順で内容を読む事が出来ます。
BITMAPFILEHEADER + BITMAPINFOHEADER
labelingCryst.lbl 1画素分の大きさ は、32ビット符号無し整数(unsigned int) で4バイトです。
このラベルデータが画像の 幅*高さ 個 連続して格納されています。
ラベリング処理用の入力画像の BMP ファイルのヘッダー中の biHeight 
の符号と cfg ファイル中の biHeight の符号が同じ場合は、画像の座標
とラベリングデータの座標は一致しています。異なる場合は上下が反転
しています。

lineprofile.exe

lineprofile exe は、BMP ファイルの表示用ツールです。BMPファイルを読み込んで表示するだけでは無く
マウスで指定された画素に対して、ラインプロファイル (X軸方向、Y軸方向の 輝度データの折れ線グラフ)
を表示します。 また、指定されたポイントの座標値と輝度も合わせて表示します。ディスプレイの解像度や、
表示しているファイルの名前、ファイルサイズも表示されます。
Label2colorBMP.exe がラベルデータから作成した擬似カラーBMPファイルを表示させ、Labeling.exeが対象
物に割り当てたラベル番号を直接確認できます。 表示ウインドウの右下部では、表示されている画像の
選択された座標の値を unsigned int として、表示します。と同時に、その値を擬似カラー変換した時の値と
その値が擬似カラー変換された値だと仮定して、逆変換し元のラベルデータの値を算出して表示します。

画像のサイズが表示域より大きい場合、表示域内の画像はマウスの左ボタンをクリックしドラックすることで
スクロールさせる事が出来ます。またヘアラインカーサは、キーボードの矢印キーを使って移動させる事が
可能です。表示させる画像ファイルの指定方法は、起動時に引数で与える (explorer から、ファイルをプロ
グラムアイコンにドラック&ロップすることも含む)、画像表示画面にBMPファイルをドラック&ドロップする
事で行います。
動作環境は、Windows XP SP3 日本語 32ビット環境で、HDDはAHCI 接続されていることを想定しています。
(GPUは、Geforce 8500 GT 以上を推奨します)

"lineprofile.exe の使い方の詳細" を参照してください
 
lineprofile.exe  [BMP_fileName]

         BMP_fileName:  表示対象のBMPファイル名

 

Label2colorBMP.exe

Label2colorBMP exe は、Labeling.exe が作成した、ラベリングファイルを読み込み、ラベル値を
擬似カラーデータに変換し、BMPファイルとして出力します。擬似カラー変換する時に隣接したラベル番号
には、大きく色の異なった値を割り当てますので、画像を見た時に容易に識別できます。
lineprofile.exe を使って画像を表示させた場合は、擬似カラーデータを逆変換し、ラベル値を知る事が
出来ます。 変換用の関数を以下に示します。
引数無し起動時のディフォルト のファイル名は、labelingCryst で、labelingCryst.cfg,
labelingCryst.lbl が処理対象のファイルとなり、PseudoColor.bmp として出力します。


Label2colorBMP.exe  [Labeling_fileName [Output_BMPfileName]]

         Labeling_fileName:  
ラベルデータファイル .cfg、.lbl の2種類
                        .lbl は、ラベルデータの実体
                        .cfg は、縦横の大きさ等の補助情報

         Output_BMPfileName: 処理結果の出力用BMPファイル名


ラベルデータを擬似カラーデータに変換する 擬似カラーデータをラベルデータに変換する
unsigned int int2PseudoColor(unsigned int v)
{register unsigned int r=0, g=0, b=0 ;
    if( (v&0x00ffffff) == 0 ) return 0 ;
    if( v & 0x000001 ) b |= 0x80 ;
    if( v & 0x000002 ) g |= 0x80 ;
    if( v & 0x000004 ) r |= 0x80 ;
    if( v & 0x000008 ) b |= 0x40 ;
    if( v & 0x000010 ) g |= 0x40 ;
    if( v & 0x000020 ) r |= 0x40 ;
    if( v & 0x000040 ) b |= 0x20 ;
    if( v & 0x000080 ) g |= 0x20 ;
    if( v & 0x000100 ) r |= 0x20 ;
    if( v & 0x000200 ) b |= 0x10 ;
    if( v & 0x000400 ) g |= 0x10 ;
    if( v & 0x000800 ) r |= 0x10 ;
    if( v & 0x001000 ) b |= 0x08 ;
    if( v & 0x002000 ) g |= 0x08 ;
    if( v & 0x004000 ) r |= 0x08 ;
    if( v & 0x008000 ) b |= 0x04 ;
    if( v & 0x010000 ) g |= 0x04 ;
    if( v & 0x020000 ) r |= 0x04 ;
    if( v & 0x040000 ) b |= 0x02 ;
    if( v & 0x080000 ) g |= 0x02 ;
    if( v & 0x100000 ) r |= 0x02 ;
    if( v & 0x200000 ) b |= 0x01 ;
    if( v & 0x400000 ) g |= 0x01 ;
    if( v & 0x800000 ) r |= 0x01 ;
    return (r <<16) | (g << 8) | b ;
}
unsigned int pseudoColor2Int(unsigned int v)
{register unsigned int c=0 ;
    if( (v&0x00ffffff) == 0 ) return 0 ;
    if ((v&0x00800000)) c|= 0x00000004 ;
    if ((v&0x00400000)) c|= 0x00000020 ;
    if ((v&0x00200000)) c|= 0x00000100 ;
    if ((v&0x00100000)) c|= 0x00000800 ;
    if ((v&0x00080000)) c|= 0x00004000 ;
    if ((v&0x00040000)) c|= 0x00020000 ;
    if ((v&0x00020000)) c|= 0x00100000 ;
    if ((v&0x00010000)) c|= 0x00800000 ;
    if ((v&0x00008000)) c|= 0x00000002 ;
    if ((v&0x00004000)) c|= 0x00000010 ;
    if ((v&0x00002000)) c|= 0x00000080 ;
    if ((v&0x00001000)) c|= 0x00000400 ;
    if ((v&0x00000800)) c|= 0x00002000 ;
    if ((v&0x00000400)) c|= 0x00010000 ;
    if ((v&0x00000200)) c|= 0x00080000 ;
    if ((v&0x00000100)) c|= 0x00400000 ;
    if ((v&0x00000080)) c|= 0x00000001 ;
    if ((v&0x00000040)) c|= 0x00000008 ;
    if ((v&0x00000020)) c|= 0x00000040 ;
    if ((v&0x00000010)) c|= 0x00000200 ;
    if ((v&0x00000008)) c|= 0x00001000 ;
    if ((v&0x00000004)) c|= 0x00008000 ;
    if ((v&0x00000002)) c|= 0x00040000 ;
    if ((v&0x00000001)) c|= 0x00200000 ;
    return c ;
}

   

Clipping.exe

Clipping exe は、 8|24|32ビット形式の BMP ファイルを読み込み、指定された値以下の輝度の画素を
輝度0に置き換え、32ビット形式のBMP ファイルとして保存します。 OS2 形式の BMP ファイルは対象外。

カラー画像は内部で、濃淡画像に変換後、輝度評価を行います。
変換方式:   出力画素(濃淡画像) = (0.299 * R成分 + 0.587 * G成分 + 0.114 * B成分)

輝度に0を指定した場合、入力ファイルが8|24のビット形式の BMPファイルの場合は、32ビット形式の
BMP ファイルに変換されて保存されます。 (輝度の変更は無く、出力ファイルの形式が変更される)
-b オプションが指定された場合は、画素のデータ(R,G,B,A)を、(0,0,0,0) か (255,255,255,0) の2値に変換
します。

clipping  [-b] number  Input_BMPfileName output_BMP_fileName

         -b:                 二値化オプション
         number:             閾値 10進数での指定
         Input_BMPfileName:  処理対象のBMPファイル名
         Output_BMPfileName: 処理結果の出力用BMPファイル名

 

bmp32lop.exe

bmp32lop exe は、 32ビット形式の BMP ファイル間で AND、OR、EXOR、の論理演算処理を行い。
結果を新しい BMP ファイルとして保存します。  単項演算の NOT(全ビット反転)も可能です。
( 8 | 24 ビットのBMPファイルは、使用できませんので、Clipping.exe で形式変換して下さい)

bmp32lop.exe dist.bmp = NOT src.bmp
  or
bmp32lop.exe dist.bmp = src1.bmp OPE src2.bmp

         OPE: and, or, exor の3種類 (32ビット無圧縮形式の BMP のみが使用可能)
                   AND 演算処理:  dist.bmp = src1.bmp & src2.bmp
                    OR 演算処理:  dist.bmp = src1.bmp | src2.bmp
                  EXOR 演算処理:  dist.bmp = src1.bmp ^ src2.bmp

         src1.bmp、 src2.bmp:  処理対象の入力 用BMPファイル名
         dist.bmp:       処理結果の出力用BMPファイル名


measurement.exe

measurement exe は、Labeling.exe が作成したラベリング情報を読み込み、対象物の
面積と重心を算出します。 計測結果自体は、"processed.txt"に記録されます。
ラベル情報は、擬似カラーに変換されて、BMP ファイル("processed.bmp")として保存されます。
保存される BMPファイルには、計測された重心が '+' で表示されます。
出力ファイル名は、利用者が指定することも可能です。

面積や重心の求め方
    面積の求め方:
     ラベリング処理により、各対象物にはそれぞれ固有の番号が割り当てられている。
     識別番号が付いた画素を、各識別番号毎に数をカウントして行く事で、その対象物を
     構成する総画素数が求まる。この総画素数が、それぞれの対象物の面積に相当する。

    重心の求め方:
     重心の求め方は非常に単純で、重心のX座標は対象物の各画素のX座標を積算し、
     対象物を構成する総画素数割れば良い。 同様に重心のY座標は対象物の各画素
     のY座標を積算し、対象物を構成する総画素数割れば良い。
     整数演算をすると、端数が切り捨てられてしまうので、対象物を構成する画素の
     実際の重心より、原点寄りの画素の位置が重心として算出される。
     精度が要求される時は、実数(float/double)として処理をする。

また、周辺画素には量子化誤差が含まれているので、本来なら考慮する必要性があります。

引数無し起動時のディフォルト のファイル名は、 labelingCryst で、labelingCryst.cfg,
labelingCryst.lblが処理対象のファイルとなります。

measurement.exe  [Labeling_fileName [Output_FileName]]
Labeling_fileName: ラベルデータファイル .cfg、.lbl の2種類
                   .lbl は、ラベルデータの実体
                   .cfg は縦横の大きさ等の補助情報
                   ディフォルトの入力ファイル名は、labelingCryst
                          labelingCryst.cfg
                          labelingCryst.lbl

Output_FileName:  出力ファイル名の指定。デフォルト名は、processed
                          processed.bmp  処理結果の BMP ファイル名
                          processed.txt  計測結果の格納ファイル名


rmLargeObj.exe

rmLargeObj exe は、Labeling.exe が作成した、ラベリングファイル形式のデータを読み込み、
指定された画素以上の対象物を削除した、新たなラベリングファイルと、対象物を擬似カラー表示した
BMP ファイルを作成します。

rmLargeObj.exe number  [Labeling_fileName [Output_FileName]] 

Labeling_fileName: ラベルデータファイル .cfg、.lbl の2種類
                   .lbl は、ラベルデータの実体
                   .cfg は、縦横の大きさ等の補助情報
                   ディフォルトの入力ファイル名は、labelingCryst
                          labelingCryst.cfg
                          labelingCryst.lbl

Output_FileName:  出力ファイル名の指定。デフォルト名は、rmLargeObj
                          rmLargeObj.bmp  処理結果の BMPファイル名
                          rmLargeObj.cfg  
                          rmLargeObj.lbl 

rmSmallObj.exe

rmSmallObj exe は、Labeling.exe が作成した、ラベリングファイル形式のデータを読み込み、
指定された画素以下の対象物を削除した、新たなラベリングファイルと、対象物を擬似カラー表示した
BMP ファイルを作成します。

rmSmallObj.exe number  [Labeling_fileName [Output_FileName]] 

Labeling_fileName: ラベルデータファイル .cfg、.lbl の2種類
                   .lbl は、ラベルデータの実体
                   .cfg は、縦横の大きさ等の補助情報
                   ディフォルトの入力ファイル名は、labelingCryst
                          labelingCryst.cfg
                          labelingCryst.lbl

Output_FileName:  出力ファイル名の指定。デフォルト名は、rmLargeObj
                          rmLargeObj.bmp  処理結果の BMPファイル名
                          rmLargeObj.cfg  
                          rmLargeObj.lbl 


showBMPh.exe

showBMPh exe は、 BMPファイルから、ヘッダー情報を読み込み出力するプログラム。
WINDOWS 形式の BMP ファイルのみをサポート (OS2形式はサポートしません)

ラベリングデータ(.cfg)や、BMPファイルの確認用のツールとして使用します。

showBMPh.exe  Data_File [Data_File ...]
Data_File: 確認対象のファイル  BMPファイル 又は .cfgファイル




プログラムを利用した処理の実例

1、高速ラベリング処理 天体データ  (別ページ)

2、チュートリアル  (別ページ)




連結性に関する補足

基準点と近傍点
     
     
     
4連結
     
     
     
8連結
     
     
     
真ん中が、
現在の処理の起点
上下左右の4ヶ所が評価対象
オレンジ色の部分の4点が対象
下左右と斜め方向の上下
ピンク色の部分8点が対象

4連結接続している例

     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
隣接する8画素において、上下左右の何れかの場所で接している場合。
8連結での接続とは、 隣接する8画素の何れか一箇所以上の場所と接している場合。


補足資料

1A BMPファイルの構成

1B ラベルファイルの構成

画像データとラベルデータの処理用サンプルプログラム(C言語)の実施例
旧プログラム用の変換ツールを含む)

テスト用データ  
    evaluation.zip  277,398,911 Byte md5sum: 2b82d1e8fc1520d980d0c08cc671f76f
     テスト用画像    1.bmp, 2.bmp, 3.bmp
     ラベリングデータ   1.cfg, 1.lbl,     2.cfg, 2.lbl,     3.cfg, 3.lbl
     擬似カラー化画像   1_l2c.bmp, 2_l2c.bmp, 3_l2c.bmp

天体データの処理例で使用しているテストデータ  
     
24ビットのBMPファイル(celestial.zip)

3次元の多値データを対象とした、高速ラベリング処理(6連結、18連結、26連結)


最後に

画像処理で対象物がラベリングされている事により、効率的 に次段の処理を進める事が多くありますが、この
ラベリング処理自体が時間のかかる処理であったり、巨大な画像を処理の対象に出来ない場合があったりし、
強力な手段であるにもかかわらず、十分に活用されているか疑問の余地がありました。

今回、高速で処理が可能なラベリングプログラムを提供する事で、画像処理の可能性が広がる事を期待して
おります。 ダウンロード頂いた、CrystApp.zip の中には、もう少し詳しいチュートリアルが同胞されています
ので併せてご確認下さい。 tutorial.bat を起動して頂ければ、簡単に見る事が出来ます。
また、ご意見やお問い合わせは、vision@cryst.tv まで宜しくお願いします。

最後になりましたが、皆様のお役に立てれば幸いです。





go to TopPage go to CategoryTop