画像データ上の対象物を識別する方法として、ラベリング処理があります。ラベリングとは、画像上から対象物
を構成する塊毎に固有の番号を付ける処理です。事前のラベル付けで、様々な処理が容易に行える様になります。
基本概念を理解したい場合は、
"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連結)
アプリケーションソフトは、以下の3つのプログラム(バイナリー形式)から構成されています。
また、以下のファイル(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ファイル