本ブローブ解析ライブラリは、画像の幅、高さ共に 65535 以下の2値画像を 解析可能です。但し
fnFIE_measure_execute() にて offset値を0以外に設定する場合には、 下記の制限が発生します。offsetを付加した画像の座標範囲、
- offset.x ≦ x ≦ (offset.x + (画像の幅) - 1)
- offset.y ≦ y ≦ (offset.y + (画像の高さ) - 1)
が、それぞれ
- -65534 ≦ x ≦ 65534
- -65534 ≦ y ≦ 65534
を満たしていなければなりません。
これらの関係を図示すると、下図のようになり、 解析領域は、図の赤で示す領域の中に入っている必要があります。
本ブローブ解析ライブラリでは、解析時に前景色のみを解析するか、 又は前景色と背景色の両方を解析するかを選択することが出来ます。 (
F_MEASURE_PARAMS の
color_mode を参照。) 通常は前景と背景両方を解析するモードを設定することを推奨しますが、 処理時間に対する要求が厳しく、且つ前景のみ解析出来れば良い場合は、 前景のみの解析モードとすることで、処理時間の短縮を図ることが出来ます。
但し前景のみの解析モード(単色解析モード)の場合、背景を解析しないため親子関係を構築しません(下図)。 そのため、親子関係を利用する一部の特徴量は計算することが出来ないため注意してください。 (どの特徴量が計算不能かどうかは 特徴量 の表と各計算関数のドキュメントを参照)
Fig. 解析色モードによる親子関係の違い
本ブローブ解析ライブラリでは、解析対象領域(画像)の外側には、 ブローブ番号0番の背景色ブローブが広がっていると定義しています。(下図参照)
この領域の外側と連結する背景色ブローブを「背景ブローブ」と呼び、 特殊な扱いをします。背景ブローブはブローブ番号が必ず0番になります。 背景ブローブが1画素も存在していない時でも、0番ブローブは 背景を指す番号として存在し、この場合は0番はヌル領域を指し示します。 また親子関係において、0番ブローブは必ずツリーの最上位となります。
但し、解析対象色の設定(F_MEASURE_PARAMS の color_mode )で、 前景色のみを解析するよう設定した場合は、 0番ブローブは存在するものの、常にヌル領域となります。
上図は解析対象色に前景=白、背景=黒を指定したときの例です。 このとき、青で示した領域は、解析領域の外側の0番ブローブと 連結していると見なせるため、0番ブローブとなります。
連結条件とは、ある画素とその近傍にある画素が同一ブローブに属しているかどうかを決定する条件です。 本ブローブ解析ライブラリでは、画素の連結条件として、4連結と8連結を選択する事が出来ます。 4近傍の画素に対して連結をさせる場合を4連結、8近傍の画素に対して連結をさせる場合を8連結と呼びます。
例えば、下図の黒画素について考えると、4連結の場合は5個のブローブとなり、 8連結の場合は、1個のブローブとなります。
連結条件の設定は fnFIE_measure_execute() 実行時に F_MEASURE_PARAMS の neighborhood にて行います。 解析対象色の設定(F_MEASURE_PARAMS の color_mode )で、 前景と背景の両方を解析するよう設定した場合、前景の連結条件と、背景の連結条件は逆になります。 つまり、前景の連結条件として4連結を指定した場合、背景の連結条件は8連結に。 逆に、前景の連結条件として8連結を指定した場合、背景の連結条件は4連結になります。
この事は、下図の真ん中(青部)のブローブについて考えれば、何故そうしなければいけないのか自明です。
白を4連結として考えると、上図青部は赤部と連結しないことになるため、 青部は緑部の子供にならなければ矛盾します。ということは、緑部(つまり黒)は8連結でなければなりません。 逆に白を8連結として考えると、上図青部は赤部と連結することになるため、 緑部は青部と赤部を合わせたブローブの子供にならなければ矛盾します。ということは、 緑部(つまり黒)は4連結でなければなりません。
- 参照:
- fnFIE_measure_execute(), F_MEASURE_PARAMS
親子関係とは、ブローブの幾何的な位置関係を木構造にて表したものです。 あるブローブAがあったときに、このブローブAの穴ブローブをブローブAの子供と呼びます。 逆に、この穴ブローブから見たブローブAを親と呼びます。 また、同じ階層にあるブローブ同士は兄弟と呼びます。
上図において、1,2,3 はそれぞれ兄弟ブローブです。 また、1,2,3の親は0であり、0の子供は 1,2,3 です。
全てのブローブにはブローブ番号が割り振られており、この番号によるリンクによって親子関係の木構造は取得できます。 但し、全てのリンクは1対1の関係で表されるため、親から子への関係など1対多の関係を取得する際には リンクをたどって行くことになります。各リンクの取得には、次の関数をそれぞれ利用します。
上図のブローブ例でのリンクを表したのが下図です。
fnFIE_measure_get_child() で取得される子供リンクは1番目の子供となります。 全ての子供を取得するには
fnFIE_measure_get_child() で1番目の子供を取得した後、 その子供の兄弟を
fnFIE_measure_get_sibling_next() 又は
fnFIE_measure_get_sibling_back() にて 辿っていくことで取得します。また、兄弟リンクは双方向循環リストになっており、 リンクをたどっていくと自分に戻ってきます。 なお、兄弟の順番、及び、親からリンクされる子供(=兄弟のうちどのブローブが親から子としてリンクされるか) には特別の意味は無く、処理の都合によって決定されるものです。
また、全てのブローブは背景の子供か又はその子孫になるため、 親子関係の木構造のルートは必ず0番ブローブになります。 0番が背景以外のブローブに割り当てられる事はないため、 0番から順に親子関係の木構造を辿っていけば全てのブローブを参照できます。 背景の項でも述べたとおり、背景が1画素も存在していない場合や、 解析対象色の設定(F_MEASURE_PARAMS の color_mode )で前景のみ を解析対象とするよう設定した場合でも、0番ブローブは存在するため、 この事は成り立ちます。
解析対象色の設定(F_MEASURE_PARAMS の color_mode )で前景のみ を解析対象とするよう設定した場合は、全てのブローブは0番の子供となります。
fnFIE_measure_continue() を使用する場合は、無効ブローブが現れます。 無効ブローブとは、元々有効ブローブとして存在していたブローブが、
fnFIE_measure_continue() によって追加された部分によって 他のブローブに連結するなどして無くなってしまったブローブのことを言います。 あるブローブが有効ブローブか無効ブローブかどうかを調べるためには、
fnFIE_measure_get_is_valid() 関数を使用します。 無効ブローブは親子関係の木構造から切り離されるため
fnFIE_measure_get_parent() などの リンク取得関数でリンクを取得することは出来ません(エラーになる)。 また、特徴量も取得することは出来ず、取得しようとした場合はエラーになります。
解析後のブローブに対して後処理を行いたい場合は、 そのブローブのリージョンを取得して処理を行います。 (
fnFIE_measure_get_region() を参照 ) 濃淡特徴量を取得したい場合も、ブローブの領域をリージョンオブジェクトとして 取得し、それを使用して処理を行います。
本ブローブ解析ライブラリで取得可能なブローブの特徴量は下表の通りです。
- 内部保存:計算済み特徴量値を保存しておくかどうか。 結果値を保存する特徴量では、同一ブローブに対する計算が再実行されたときに、 前回の計算結果値をそのまま返すため、2回目以降は処理時間が短くてなる。
- 単色解析:単色解析モード時に計算できるかどうか。 詳細は 解析対象色 を参照してください。