本記事では二値画像の表現方法を紹介します。
さっそく見ていきましょう。
今回使用する 2 値画像は下の図です。画素の総数が 8×8 の 64 画素になります。
固定閾値法で 2 値化します。閾値を 4 として、4 より大きい値を 1、それ以外を 0 とします。
このときの出力される 2 値画像は、背景(0)が黒く、オブジェクト(1)は白くなる画像です。
本記事では、その 2 値化画像を画像 Aと呼ぶことにします。
ラベリング
ラベリングとは、画像の中にある塊りごとにラベルを付けることをいいます。
ここでは、ピクセル値に 1 があるとラベル A を与えるとします。
すると、画像 A にラベリングすると下のようになります。
今回の図では、1 つのオブジェクトにラベル A を与えました。
複数のオブジェクトがある場合は、異なるラベルを与えます。こうすると、1 つの画像に複数のオブジェクトがあることがわかります。
ラベルは、各画素値が格納されている配列やメモリとは別に用意された配列やメモリに格納されます。異なる領域に属する画素に異なるラベルを割り当てるのです。
ラングレス符号化
ラングレス符号化は、連長圧縮とも言われ、連続する同一の値を、その連なり(run)の長さ(length)を示す数字に置き換えることを言います。
画像 A の行に着目して、順番に左から順に画素を確認していきます。下の図のように、それぞれの行の連続した数値(run)の長さ(length)で表していきます。
こうすることで、少ないビット数で表現できるようになります。
背景画素値が 0、オブジェクト画素値が 1、背景画素がオブジェクトの周囲に常に存在するという 3 つの前提がわかっているならラングレスの長さだけで表せます。
また、その前提条件なしの場合では、データ中のオブジェクトを連続する値で符号化していきます。
チェーンコード化
チェーンエンコードとは、2 値画像データを符号化する手法の事を言います。また、オブジェクトと背景の境界をトラッキングし、方向に応じてエンコードします。
背景とオブジェクトの等高線(境界線)を抽出する方法は下記のステップで行います。
step1
ラングレス符号化のように左上から順にオブジェクト値 1 が出るまでスキャンしていきます。そして、画素値 1 が出たらスキャンを止めます。この画素がオブジェクトの始点となります。
step2
この始点画素を輪郭の一部として記録する。
step3
1 画素前にスキャンした画素に戻ります。(0 の画素ではなく、1 の画素) 1 回目なら step3 はスキップします。
step4
時計回りに周りのある8個の隣接画素をチェックします。画素値 1 が見つかったら、ステップ 2 に戻ります。 この step の繰り返しにとって、画素値が 1 の等高線(境界線)を抽出することができます。
等高線をエンコードしていきましょう。
下図の Chain Encoding Coding 表で、等高線を符号化していきます。
始点となる画素(座標は(3,2))から Chain Encoding Coding 表に従って符号化します。
すると、(3,2) 0, 0, 1, 2, 3, 4, 3, 5, 6, 6, 7という結果になりますね。
特徴抽出
画像処理では、特徴抽出により次元削減をします。
面積、境界長、円形度、重心の特徴を計算していきます。例は先ほどと同じ二値画像です。
面積
面積とは、オブジェクトの面積の中の画素数のことです。つまり、画素値が 1 の画素の数の個数です。この場合は、18になります。
境界の長さ
境界線の長さは、境界線上のピクセル数になりますが、矢印の個数を数えたほうがわかりやすいです。
境界線が対角線のときは、長さは 2 の平方根を掛けたものになります。
したがって、対角線の矢印は 6 個で、対角線を除いた矢印は 3 個なので、境界線の長さは √2×6+3 で 11.5 になります。
円度
円度=(境界線の長さ / 面積)の2乗
したがって、11.5 の2乗/18 で 7.35 になります。
重心
重心は、座標値の和を面積で割ったものです。
オブジェクトの座標の和を計算します。すると、(69,67)になるので面積 18 で割ると
(3.8,3.7)になります。