ラベリング処理プログラムは、高速で画像上の対象物に1以上の重複しない個別の番号を、割り当て
ていくプログラムです。 入力画像用のBMPの縁か画素の輝度が 0 (背景画像)によって囲まれた画像
の領域を対象物として認識し、対象物毎に異なる番号を割り当てます。
画像は、画素と呼ばれる最小単位から構成されています。 各画素は、輝度或いは色を表す情報を
持っています。 このプログラムでは、 0 の値を(輝度としても色としも 0 )持ってい画素を背景画素
とし、それ以外の値を持っている画素を、対象物或いは対象物をを構成する画素とします。
(自身の周りが全て背景の画素を孤立点と呼びますが、多くの場合この画素は、対象物を表すのでは
なく、ノイズ等のゴミデータと考えられます。)
対象物の画像は、通常2画素以上で構成されていますので、同一の対象物を構成する画素には、同じ
番号をラベリング処理では割り当てます。
この処理により、画像上の任意の対象物が固有の番号により識別可能になります。
"CrystApp.zip" は現在配布を中止しています。
同等の "Tutorial.zip" を Tutorial のリンクからダウンロードして下さい。
tutorial の開始時には、ディレクトリ内に以下のファイルがコピーされます。
[.]
[..]
bmp32lop.exe
clipping.exe
Label2colorBMP.exe Labeling.exe
lineprofile.exe
measurement.exe
rmLargeObj.exe
rmSmallObj.exe
sample.bmp
sample2.bmp
showBMPh.exe
STAGE1、showBMPh.exe で、ファイルヘッダーの情報を確認します。
(BMPファイルと、.cfg ファイルが対象です)
>
showBMPh.exe
sample.bmp
'sample.bmp': File size 3513656 Byte
-- BITMAPFILEHEADER -- (14 Byte)
unsigned short 2byte
"BM"
bfType
= 0x4D42
unsigned long 4byte
※1
bfSize
= 3513656
unsigned short 2byte 0 Fixed
bfReserved1 = 0
unsigned short 2byte 0 Fixed
bfReserved2 = 0
unsigned long 4byte
※2
bfOffBits = 54
※1 ファイルサイズ[byte]
※2 ファイル先頭から画像データまでのオフセット[byte]
-- BITMAPINFOHEADER -- (40 Byte)
unsigned long 4byte 40 byte
biSize
= 40
long
4byte 画像の幅
biWidth
= 1219
long ※3
4byte 画像の高
biHeight
= 960
unsigned short 2byte 1 Fixed
biPlanes
= 1
unsigned short 2byte
※4
biBitCount = 24
unsigned long 2byte
※5
biCompression = 0
unsigned long 4byte
※6
biSizeImage = 3513602
long
4byte H解像度 biXPelsPerMeter = 2834
long
4byte V解像度 biYPelsPerMeter = 2834
unsigned long 4byte
※7
biClrUsed =
0
unsigned long 4byte 重要色数
biClrImportant = 0
※3 正数:画像の上部のデータから行単位で順に格納されている
負数:画像の下部のデータから行単位で順に格納されている
1行分のデータは必ず4バイト境界に配置される。足りない場合はダミーデータを置く
biSizeImage = abs(biHeight) * (biWidth + 1行分を4の整数倍にする補完データ数)
※4 色ビット数[bit] 1, 4, 8, (16), 24, 32
※5 圧縮形式 0, 1, 2, 3 圧縮形式 が 0 の場合、画像データサイズ 0でも良い
0 - BI_RGB(無圧縮)
1 - BI_RLE8(Run-Length-Encoded 8bits/pixel)
2 - BI_RLE4(Run-Length-Encoded 4bits/pixel)
3 - BI_BITFIELDS
※6 画像データサイズ[byte]
無圧縮なら 0 でも良い
※ 水平解像度[dot/m]、垂直解像度[dot/m] 0
の場合もある
※7 格納パレット数[使用色数]
biClrImporant:使用色中で特に重要な色数
biClrImporant: 0[全て重要] or n≦biClrUsed 先頭から n は重要な色
>
%SystemRoot%\system32\mspaint.exe
sample.bmp |
1画素が 24 ビットで構成された無圧縮の BMPファイルです。
画像の幅(biWidth) は 1219 画素
画像の高(biHeight) は 960 画素
である事が、確認できます。
ラベルデータの補助ファイル(.cfg)では、biBitCountの値は、必ず 32 ビットになります。
3,513,656 sample.bmp
STAGE2、
Labeling.exe で、指定されたBMPファイル中の対象物にラベリング(ユニークな番号)付けします。
>
Labeling.exe
sample.bmp sample
Labeling Done! 542 objects were found.
File 'sample.lbl' is being written.
File 'sample.cfg' is being written.
> copy
/B sample.cfg + sample.lbl sample_direct.bmp
sample.cfg
sample.lbl
1 個のファイルをコピーしました。
> %SystemRoot%\system32\mspaint.exe
sample_direct.bmp |
画像が小さく、対象物の数も少ないので、処理は瞬間で終わります。
ラベルデータが完了すると画像中に見つかった対象物の数を表示します。
出力ファイル名の指定があるので、ラベルデータを sample.cfg、sample.lbl
として書き出します。
3,513,656 sample.bmp
54 sample.cfg
4,680,960 sample.lbl
4,681,014 sample_direct.bmp
sample.cfg、sample.lbl
をバイナリーデータとして結合させます。 .cfg ファイルは、BMPのヘッダー部と互換のファイルなので
結合すると、見かけ上はBMPファイルとして扱う事が出来ます。しかし、データは画像情報では無い事に注意してください。
STAGE3、
Label2colorBMP で、ラベルデータを擬似カラー情報に変換し、BMPファイルとして出力します
>
Label2colorBMP.exe
sample sample_PC.bmp
>
%SystemRoot%\system32\mspaint.exe
sample_PC.bmp |
sample.cfg、sample.lbl
から、擬似カラー化された BMPファイル
sample_PC.bmp が生成されました。
54 sample.cfg
4,680,960 sample.lbl
4,681,014 sample_PC.bmp
STAGE4、
lineprofile.exe で、sample_direct.bmp
と sample_PC.bmp を表示させます
sample_direct.bmp と sample_PC.bmp
上の同じ対象物をマウスの左ボタンでクリックします。
sample_direct.bmp の、
右下
の unsigned int 項目には、ラベル番号(429)
が表示され、label2pseudo: には擬似カラー化する時の R,G,B
の値
0x00E020C0
[(R,G,B,) = (0xE0,0x20,0xC0)] が表示されます。
sample_PC.bmp 右下
の unsigned int 項目には、擬似カラーの色割り当て
、0x00E020C0
が表示され、pseudo2pseudo:
の値
(429)は、元のラベル番号が表示されます。 ラベルデータと擬似カラー間で、相互変換が可能なことが確認できました。
STAGE5、
Labeling.exe が作成したラベルデータから、対象物の面積と重心を計算します。
ラベルデータから擬似カラー画像を作成し、重心の場所をプロットした結果をBMPファイルで保存
>
measurement.exe
sample sample_measur01
|
sample.cfg、sample.lbl
から、ラベル番号、面積、重心座標を計測した結果を
sample_measur01.txt
に保存します。
ラベルデータを擬似カラー化し、重心位置をプロットした画像を、
BMPファイル
sample_measur01.bmp
に保存します。
54 sample.cfg
4,680,960 sample.lbl
4,681,014 sample_measur01.bmp
35,772 sample_measur01.txt
STAGE6、ラベルデータから、指定された大きさ(250)以下の対象物を削除します。
Labeling.exe が sample.bmp から作成したラベリングデータ sample を使用します
新しいラベルデータから擬似カラー画像を作成し、処理の結果を表示します
>
rmSmallObj.exe
250 sample sample_rm_small
>
%SystemRoot%\system32\mspaint.exe
sample_rm_small.bmp
|
sample.cfg、sample.lbl
から、指定された値(250)以下の面積の対象物のラベル番号を 0 (背景)にする事で削除します。
処理した結果を
sample_rm_small (sample_rm_small.cfg,
sample_rm_small.lbl) に
保存します。
処理後のラベルデータを擬似カラー化し、BMPファイル
sample_rm_small.bmp
に保存します。
54 sample.cfg
4,680,960 sample.lbl
35,772 sample_measur01.txt
4,681,014 sample_rm_small.bmp
54 sample_rm_small.cfg
4,680,960 sample_rm_small.lbl
STAGE7、指定画素以下の対象物を除去したラベルデータから、続けて指定された大きさ(4000)以上の面積を
持つ対象物を削除します。
rmSmallObj
が作成したラベリングデータ sample_rm_small
を使用します
新しいラベルデータから擬似カラー画像を作成し、処理の結果を表示します
>
rmLargeObj.exe
4000 sample_rm_small sample_rm_small_large
>
%SystemRoot%\system32\mspaint.exe
sample_rm_small_large |
sample_rm_small.cfg、sample_rm_small.lbl
から、指定された値(4000)以上の面積の対象物のラベル番号を 0 (背景)に
する事で削除します。
処理した結果を
sample_rm_small_large
(sample_rm_small_large.cfg, sample_rm_small_large.lbl) に
保存します。
処理後のラベルデータを擬似カラー化し、BMPファイル
sample_rm_small_large.bmp
に保存します。
35,772 sample_measur01.txt
54 sample_rm_small.cfg
4,680,960 sample_rm_small.lbl
4,681,014 sample_rm_small_large.bmp
54 sample_rm_small_large.cfg
4,680,960 sample_rm_small_large.lbl
STAGE8、指定画素を除去したラベルデータを使用して再計測を行います。必要な対象物だけの結果が得られます
rmSmallObj
+rmLargeObj
が作成したラベリングデータ sample_rm_small_large
を使用します
>
measurement.exe
sample_rm_small_large sample_measur02
>
%SystemRoot%\system32\mspaint.exe sample_measur02.bmp |
sample_rm_small_large.cfg、sample_rm_small_large.lbl
から、ラベル番号、面積、重心座標を計測した結果を
sample_measur02.txt
に保存します。
ラベルデータを擬似カラー化し、重心位置をプロットした画像を、BMPファイル
sample_measur02.bmp
に保存します。
54 sample_rm_small_large.cfg
4,680,960 sample_rm_small_large.lbl
4,681,014 sample_measur02.bmp
25,278 sample_measur02.txt
画像処理を使って画面から花の部分を抽出する処理を行います
sample2.bmp
の画像から 花の部分を抽出したいのですが、単純に閾値を設定しただけでは、上手く
抜き出せません。
対象外の部分が含まれたり、花の部分に虫食いの様に選択できない場所が発生したりしてしまいます。
これを前述の方法を用いて、上手く対象物を抜き出す処理を行います。
|
STAGE9、花とそれ以外が最も良く分離できる値として150を指定します。単純にクリッピングした画像と
二値化した画像の両方を作成します。
clipping.exe
は画素データの値が指定された値以下の場合、画素データの 値を 0 にします。 また、-b(2値化オプション)が
指定された場合では、指定された値以上の画素は、全て白(R,G,B: 255,255,255)に置き換えます。
0
又は 255
の2値(どちらかの値)になります。
2,250,056 sample2.bmp
3,000,054 sample2_clip.bmp
3,000,054 sample2_clipBW.bmp
花の大部分は綺麗に抽出したが、細かい不要な部分が有ったり、花の一部が虫食い状態です。
ここで、細かい不要な部分は花に比べて十分小さい事が判りますし、虫食い部分(穴:ホール)は、
必ず花の内部にあることが判ります。
花の部分だけを抽出するには、
1、細かい不要な部分は、各部分の面積を出し、指定値以下を削除する
2、ホールは、対象物と背景を入れ替え、本当の背景(最大対象物)を削除する事で、特定できる。
3、花の部分とホールの部分を結合させれば、欲しい花だけの部分が選択されるので、元の画像
からこの部分を再度抜き出せば、所望する部分が得られる
|
技術的補足
ここでは簡易的に最大画素を背景としましたが、本来の定義では、反転画像中の対象物で画像の縁に
接しているものが背景部分になりますので、画像の周囲を探査して、接続している対処物のラベル番号
をリストアップし、ラベルデータから削除します。削除後残った対象物が、穴の部分になります。
対象物の包括関係は、自分自身が接している背景の属性により知る事が出来ます。
たとえは、見つけ出した穴の部分にマイナスのラベル番号を与えます。対象物が属している背景を調べ
ると、0 の値を持つ背景のみに接している場合と、 0 の値と負の値を持つ背景に接している場合と、
負の値を持つ背景(複数の値の場合もある)のみに接している場合に分けられます。
0 の値を持つ背景のみに接している場合は、内包物を持たないシンプルな対象物です。
負の値を持つ背景のみに接している場合は、その対象物は、他の対象物の内包物です。
0 の値と負の値を持つ背景に接する場合は、内部に穴を持ち内包物を持つ可能性のある対象物です。
シンプルな対象物以外の場合、自分が接している穴(複数個の可能性有り)のチエーンリストを作成し
ておくと、このチエーンリストを検索する事で、簡単に包括関係を知る事が出来ます。
(穴を見つける場合は、4連結のラベリング処理を行ってください)
|
STAGE10、Labeling.exe
で、クリッピング処理した画像中の対象物に、ラベリング処理を行う
ラベリングデータから、measurement.exe
を使って各対象物の面積を計算する
計測結果をノートパッド使って確認します
>
Labeling.exe sample2_clip.bmp sample2_clip
Labeling Done! 34 objects were found.
File 'sample2_clip.lbl' is being written.
File 'sample2_clip.cfg' is being written.
> measurement.exe
sample2_clip sample2_clip_measur01
> %SystemRoot%\system32\notepad.exe
sample2_clip_measur01.txt
|
ラベル番号: 1 面積: 86483画素, 重心の座標:( 707, 243)
ラベル番号: 4 面積: 131618画素, 重心の座標:( 307, 434)
ラベル番号: 6 面積: 93画素, 重心の座標:( 500, 232)
画素数の大きな2つの対象物は、上手く抽出された花の部分で、その他の対象物の中で一番大きな値が、93画素です。
93画素以下の対象物は花以外なので、これらの対象物は削除対象となります。 (きりの良い100を指定値にします)
54 sample2_clip.cfg
3,000,000 sample2_clip.lbl
3,000,054 sample2_clip_measur01.bmp
2,244 sample2_clip_measur01.txt
STAGE11、計測結果から、100 画素以下の対象物を削除すればよい事がわかりましたので、sample2_clip
から、100画素以下の対象物を削除します。同時に削除処理済みのBMP画像を作成します
>
rmSmallObj.exe 100 sample2_clip
sample2_clip_rm_small
|
画面上の2つの対象物(花の部分)以外の全ての対象物が削除されました。
54 sample2_clip.cfg
3,000,000 sample2_clip.lbl
2,244 sample2_clip_measur01.txt
3,000,054 sample2_clip_rm_small.bmp
54 sample2_clip_rm_small.cfg
3,000,000 sample2_clip_rm_small.lbl
STAGE12、元画像から、花の部分を抜き出す為のマスク画像を作成します 既に確定している花の部分と
花の内部にある虫食い(穴)の部分併せれば、花の全体部分に相当します
穴の部分を抜き出す為に、 花の部分と背景の反転画像を作成します
穴の画像に対して、ラベリング処理を行います
穴画像のラベリングデータから計測を行い削除する背景の大きさを特定します
>
clipping.exe
-b 0 sample2_clip_rm_small.bmp sample2h.bmp
>
bmp32lop.exe
sample2hi.bmp
= not sample2h.bmp
operation code: '~'.
>
Labeling.exe
sample2hi.bmp sample2hi
Labeling Done! 276 objects were found.
File 'sample3i.lbl' is being written.
File 'sample3i.cfg' is being written.
>
measurement.exe
sample2hi sample2hi_measur01
> %SystemRoot%\system32\notepad.exe sample2hi_measur01.txt
|
bmp32lop.exe
を使って論理演算を行います。not(ビット反転) する事で、対象物と背景が入れ替わります。
反転処理を行ったので、本来の背景も対象物となってしまっています。今回は、一番大きな対象物が
背景なので、(穴の部分は、遥かに小さい)各対象物の面積を出し、穴の部分より大きな面積を持って
いる対象物を削除してしまいます。(一番大きな対象物が削除できれば良い)
元画像と今作成したマスク画像間で and(論理積)をとると、対象の花の部分のみが抜き出せます。
3,000,054 sample2_clip_rm_small.bmp
3,000,054 sample2h.bmp
3,000,054 sample2hi.bmp
3,000,000 sample2hi.lbl
54 sample2hi.cfg
18,216 sample2hi_measur01.txt
3,000,054 sample2hi_measur01.bmp
STAGE13、反転画像から、100000
画素以上(本当の背景部分)の対象物を削除すれば良いので削除
します(穴の部分が残ります) 削除済みのラベルデータの擬似カラーBMP画像を保存します
元画像から、ホールの部分を抜き出す為のマスク画像を作成します
花の部分とホールの部分を結合したマスク画像を作成します
ラベルデータから、背景部分を削除し、対象物を2値化します。 2値化したデータは、マスク画像として、
元の画像から特定場所を抜き出すのに使用します。
rmLargeObj.exeにより、背景部を削除し、穴の部分だけの画像を作成します。 続けて、作成した画像から、
clipping.exe コマンドにより、2値化された画像を作ります。 -b オプションと 0 を指定することで、対処物
の部分は、全て 255 [(R,G,B)=(255,255,255)] の値になります。
bmp32lop.exe
により、最初に抽出した花の部分と、今抽出した穴の分を合わせて新しいマスク用画像を
作成します。(2つの画像間の論理和を取ると画像の結合が出来ます)
3,000,054 sample2h.bmp
3,000,000 sample2hi.lbl
54 sample2hi.cfg
54 sample2hi_rm_large.cfg
3,000,000 sample2hi_rm_large.lbl
3,000,054 sample2hi_rm_large.bmp
3,000,054 sample2hhole.bmp
3,000,054 sample2hmask.bmp
STAGE14、このマスク画像と元画像間で論理演算(and)を行うことで、対象の場所を抜き出せます
入力画像が 24ビット形式のBMPファイルで、
bmp32lop.exe がサポートしていないので、
clipping.exe で 32ビット
BMPファイルに変換します。(-b オプションを付けない事) 本来なら、
bmp32lop.exe が各種のフォーマットをサポート
すべきですが、サンプルのプログラムとして用意しているので、単純な処理以外は割愛されています。
元画像と作成したマスク画像間で、論理積をとる論理演算を行います。 元画像中の花の部分が抜き出されます。
2,250,056 sample2.bmp
3,000,054 sample2hmask.bmp
3,000,054 sample2_bmp32.bmp
3,000,054 sample2_flower.bmp
以上でチュートリアルは、終了します。
後は、各自で実際に動かしてみて動作を理解してください。
バッチファイルは、コピーしたファイルや、途中で生成したデータを全て削除して終了します。
データの確認をしたい場合は、"以上でチュートリアルは、終了します" のメッセージが
表示されましたら、'Control+C' を入力して、バッチファイルを強制終了してください。
|
少しは、画像処理らしい部分もありましたが、ここでは提供するツールの使い方の説明がメインの
内容なので、本来の画像処理とは異なります。 今回提供するツールを使用すれば、ラベリング
された画像データを扱う処理をもっと手軽に利用する手助けになるのではないかと考えております。
ダウンロード頂いた、CrystApp.zip の中の、
tutorial.batを見て頂けばもう少し判り易いかも
知れません。 ご意見やお問い合わせは、
vision@cryst.tv
まで宜しくお願いします。
最後になりましたが、皆様のお役に立てれば幸いです。