画像処理・実習 第一回:

画像処理・実習
第十回: 2値化画像(線図形化処理)
東海大学
情報理工学部情報メディア学科
濱本和彦
今回の内容
4. 2値化画像

4.4 線図形化処理

境界線追跡(理論解説と実習)
境界線追跡
2値画像の境界線(輪郭線)を1-画素,線
幅1で抽出します。
4-連結を抽出する方法と,8-連結を抽出す
る方法があります。
パターンマッチング,チェーンコード表現に
よる情報圧縮などに利用されます。
境界線追跡
4-連結のアルゴリズム
ラスタ走査しながら始点を探します。
1-画素かつ左隣が0-画素の場所が外側境界の
始点となります。
左隣は既に0-画素と分かっている(既調査)ので,
それ以外の3箇所の4-連結画素について,反時計
周りに画素値を調査します。
まず,下の画素を調査します。
1-画素なので連結しています。境界線の一部と
判断してチェックします。
チェックした画素を対象画素として調査を続けます。
上の画素は既調査なので,残りの4-連結画素を
左隣から反時計回りに調査します。
まず左隣を調査します。
0-画素なので,次に下の画素を調査します。
1-画素なので境界線の一部と判断してチェック
します。
境界線追跡
4-連結のアルゴリズム
この処理を繰り返します。
この画素について考えましょう。
上の画素が既調査なので,左,下,右,の順で
画素を調査します。
右の画素が1-画素であり連結していると分かる
ので,この画素を境界線としてチェックします。
次に,この画素について考えます。
左側が既調査なので,下,右,上,の順で画素を
調査します。
右の画素が1-画素であり連結していると分かる
ので,この画素を境界線としてチェックします。
この処理を繰り返します。
チェックした画素が始点と一致したら終了です。
チェックしていない点の中から,次の始点を探しま
す(未チェックの1-画素,左右どちらかが0-画素)。
右が0-画素の場合,内側境界の始点になります。
境界線追跡
プログラム解説
code 0 の場合
左側が既調査
[ i, j ]
既調査点から反時計方向,つまり
下の画素を調査
下の画素が0-画素の場合
「下は既調査,右を調査」→code 2へ
境界線追跡
プログラム解説
code 0 の場合
左側が既調査
[ i, j ]
既調査点から反時計方向,つまり
下の画素を調査
下の画素が1-画素の場合
下の画素は境界線上の点としてチェック
その画素を着目点として次の連結を調査
「上は既調査,左を調査」→code 6へ
境界線追跡
プログラム解説
code 0
code 2
code 4
code 6
[ i, j ]
[ i, j ]
[ i, j ]
[ i, j ]
既調査:左側
調査点:下側
既調査:下側
調査点:右側
既調査:右側
調査点:上側
既調査:上側
調査点:左側
0-画素の時
code 2へ
1-画素の時
境界としてチェック
着目点を変更
code 6へ
0-画素の時
0-画素の時
0-画素の時
code 4へ
code 6へ
code 0へ
1-画素の時
1-画素の時
1-画素の時
境界としてチェック
着目点を変更
code 0へ
境界としてチェック
着目点を変更
code 2へ
境界としてチェック
着目点を変更
code 4へ
境界線追跡
実習
void Boundary_tracking(void)を利用しま
す。この関数の中で,境界線追跡そのもの
は,void chase(int i, int j, int code) で行っ
ています。( i, j )は始点です。
関数chase()において,codeが4と6の場合
についてコーディングしてください。
これを利用して,characters.rawの2値化
画像について境界線追跡を行いなさい。
境界線追跡
実習:結果
境界線追跡
演習4.4 8-連結境界線追跡
code 0
code 1
code 2
code 3
code 1
code 5
code 4
code 2
code 6
code 5
code 3
code 7
code 6
code 4
code 0
code 7
code 5
code 1
code 6
code 2
code 7
code 3
code 0
code 4
既調査
調査点
調査点が0-画素の時
調査点が1-画素の時
既調査
調査点
調査点が0-画素の時
調査点が1-画素の時
境界線追跡
実習:8-連結境界線追跡
void Boundary_tracking8(void)と,void
chase8(int i, int j, int code) を利用します。
関数chase8()において,codeが4~7の場
合についてコーディングしてください。
これを利用して,characters.rawの2値化
画像について境界線追跡を行いなさい。
4-連結による結果と比較しなさい。
境界線追跡
実習:結果(4-連結境界と8-連結境界の比較)
4-連結境界線
8-連結境界線
境界線追跡
実習:結果(4-連結境界と8-連結境界の比較)
4-連結境界線
8-連結境界線
境界線追跡
実習:プログラムの改善
このアルゴリズムでは,着目点の周りが全て0画素だった場合(つまり着目点が孤立点の場合),
1-画素を永久に探し続ける無限ループに陥り処
理が終了しません。
(特に,Lenaの様な自然画像でそうなります。)
chase8c()はこれを改善したものです。リストを完
成しなさい。
Boundary_tracking8c()を利用して実行し,
lena.rawの境界線追跡を行いなさい。
境界線追跡
実習:lena.rawの結果
Fixed_threshold() (しきい値128)で2値化して
境界線追跡した結果
境界線追跡
実習:他の方法で境界線抽出を実現する
微分処理をして輪郭を抽出し,その結果を2値化
し,細線化をすることにより,線幅1の境界線を
抽出することが出来ます。
微分にSobel(),2値化にFixed_threshold(),細
線化にThinning()を用いて,characters.rawの
境界線を求め,Boundary_tracking8()と比較し
なさい。
境界線追跡
実習:2つの方法の比較
Boundary_tracking()
の結果
Sobel()
↓
Fixed_threshold()
↓
Thinning()