画像処理・実習 第十回: 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()
© Copyright 2024 ExpyDoc