画像処理・実習 第一回: ガイダンス,ディジタル画像の表現
Download
Report
Transcript 画像処理・実習 第一回: ガイダンス,ディジタル画像の表現
画像処理・実習
第十回: 2値化画像(線図形化処理)
東海大学
情報理工学部情報メディア学科
濱本和彦
今回の内容
4. 2値化画像
4.4 線図形化処理
細線化
境界線追跡
線図形化処理
細線化
2値化図形から,線幅1の中心線を抽出
文字認識やパターン認識の前処理として
利用
原画像
2値化画像
細線化
線図形化処理
細線化
細線化図形に求められる特徴
中心線の線幅は1
中心線が元の図形の中心であること
切断や孔がない(連結性の保存)
不必要な「ひげ」が生じないこと
中心線が縮まないこと
交差部において歪まないこと
線図形化処理
細線化
歪み
ひげ
切断
2値化画像
細線化
歪み
線図形化処理
3×3のマスクを用いた4-連結細線化アルゴリズム
概要
左上からラスタ走査
注目点(x,y)が1-画素の時,その8近傍を調査
8近傍の1-画素の個数によって場合分けをする
ある条件判断を行い,その注目点を0-画素にするか決定(0-反転)
0-反転処理後の画像データを別配列に保存
走査終了時,0-反転の回数が0ではない場合,0-反転画像を入力画
像として繰り返し
0-反転する→幅を細くする
0-反転後,4連結を維持している事=4連結細線化
0-反転の回数が0
→もうそれ以上細くする場所はない→細線化終了
線幅1の1-画素からなる線図形ができる
線図形化処理
3×3のマスクを用いた4-連結細線化アルゴリズム
case 0 : 8近傍の1-画素の個数が0の場合
0
0
0
0
1
0
0
0
0
注目画素のみが1-画素で
周囲は0-画素
注目点は孤立点であり線
ではない
雑音と見なして0-反転する
線図形化処理
3×3のマスクを用いた4-連結細線化アルゴリズム
case 1 : 8近傍の1-画素の個数が1の場合
注目画素は端点となる
0
0
1
0
0
0
0
1
0
0
1
0
0
0
0
0
1
0
0
1
0
0
0
0
0
1
0
0
1
1
0
0
0
0
0
0
線の一部?
0-反転すると線が縮む
ひげ(雑音)?
0-反転して消す必要あり
処理回数が少ない=雑音とみなす
処理回数が多い=線とみなす
線図形化処理
3×3のマスクを用いた4-連結細線化アルゴリズム
case 2 : 8近傍の1-画素の個数が2の場合
0
0
1
0
1
0
0
1
0
0
1
0
1
0
0
0
1
0
1
0
0
0
0
0
0
1
0
1
1
1
0
0
1
0
0
0
8近傍の1-画素のマスが3マス
離れている場合
1-画素は連結している
注目点を0-反転すると線が
途切れてしまう
0-反転しない
線図形化処理
3×3のマスクを用いた4-連結細線化アルゴリズム
case 2 : 8近傍の1-画素の個数が2の場合
0
0
1
0
1
0
1
1
0
0
1
0
0
0
0
1
0
0
1
0
0
0
0
0
0
1
0
0
1
1
0
1
0
1
0
0
8近傍の1-画素のマスが2マス
離れている場合
1-画素は連結している
注目点を0-反転すると線が
途切れてしまう
0-反転しない
線図形化処理
3×3のマスクを用いた4-連結細線化アルゴリズム
case 2 : 8近傍の1-画素の個数が2の場合
1
0
1
0
1
0
0
1
0
1
1
0
0
0
0
0
0
0
0
0
0
1
0
0
0
1
1
0
1
0
0
1
0
1
0
0
8近傍の1-画素のマスが1マス
離れている場合
1-画素は連結している
注目点を0-反転すると線が
途切れてしまう or 4-連結で
なくなる
0-反転しない
線図形化処理
3×3のマスクを用いた4-連結細線化アルゴリズム
case 2 : 8近傍の1-画素の個数が2の場合
1
1
0
1
0
0
0
1
0
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
0
1
0
0
0
1
1
1
0
8近傍の1-画素のマスが隣接
している場合
注目画素は端点となる
case 1 の場合と同様の処理を
行う
線図形化処理
3×3のマスクを用いた4-連結細線化アルゴリズム
case 3 : 8近傍の1-画素の個数が3の場合
1
1
0
0
0
1
1
0
0
0
1
0
0
1
0
0
1
0
1
1
0
0
1
1
0
1
0
1
1
0
0
1
0
0
1
0
0-反転すると途切れてしまう
0-反転すると4-連結でなくなる
case 2 の場合と同様,注目点が端点になり得る場合のみ0-反転できる
(線幅2の端点または突起となるため,常に0-反転可能)
ただし,case 3 以降は,既走査部がすでに0-反転されていると状況が変わる。。
線図形化処理
3×3のマスクを用いた4-連結細線化アルゴリズム
case 3 : 8近傍の1-画素の個数が3の場合
0
1
1
1
1
1
1
1
0
1
0
0
0
1
1
0
1
0
1
1
0
1
1
0
0
0
0
0
0
0
0
0
0
1
0
0
3つの1-画素が並んでいる場合のみ0-反転を行う
全部で8パターン
既に走査した部分の検討
は既に走査した部分
0
10
10
0
1
1
既に0-反転していた → 0-反転不可
(4連結でなくなる)
0
0
0
既に0-反転していた → それでも0-反転可
残り7パターンについても考えてみよう
線図形化処理
3×3のマスクを用いた4-連結細線化アルゴリズム
case 4 : 8近傍の1-画素の個数が4の場合
2種類のパターンに分類できる
<注目画素が直線の一部>
<注目画素が端点>
1 1 1
1 1 0
1 1 1
1 1 1
0 1 0
1 1 0
0 1 1
1 1 0
0 1 0
0 0 1
0 0 0
0 0 0
0 1 0
1 0 1
0 0 0
1 1 0
1 1 1
0 1 0
0 1 1
1 1 0
0 1 0
1 0 1
1 1 1
1 0 0
0-反転すると,4-連結でなくなる,
または途切れるため,反転不可
基本的に0-反転可だか,既走査部が
0-反転済みかどうかで状況が変わる
線図形化処理
3×3のマスクを用いた4-連結細線化アルゴリズム
case 4 : 8近傍の1-画素の個数が4の場合
<注目画素が端点となる全パターン>
1 1 1
1 1 1
1 1 0
1 0 0
0 1 1
1 1 0
1 1 0
1 1 0
0 0 0
0 0 0
1 0 0
1 1 0
0 0 0
0 0 0
0 0 1
0 1 1
1 1 0
0 1 1
0 1 1
0 1 1
1 1 1
1 1 1
0 1 1
0 0 1
既に走査された部分について検討
線図形化処理
3×3のマスクを用いた4-連結細線化アルゴリズム
case 4 : 8近傍の1-画素の個数が4の場合
1
1
1
0
1
1
0
0
0
が既に0-反転していたら
注目画素を0-反転すると4-連結でなくなる
0-反転は不可
線図形化処理
3×3のマスクを用いた4-連結細線化アルゴリズム
case 4 : 8近傍の1-画素の個数が4の場合
1
1
1
0
1
1
0
0
0
が既に0-反転していたら
注目画素を0-反転すると途切れる
0-反転は不可
線図形化処理
3×3のマスクを用いた4-連結細線化アルゴリズム
case 4 : 8近傍の1-画素の個数が4の場合
1
1
1
0
1
1
0
0
0
が既に0-反転していたら
注目画素を0-反転しても連結は保持される
他の7パターンについても
考えてみましょう!
0-反転は可能
線図形化処理
3×3のマスクを用いた4-連結細線化アルゴリズム
case 5 : 8近傍の1-画素の個数が5の場合
2種類のパターンに分類できる
<3つの0-画素が不連続>
<3つの0-画素が連続>
1 1 1
1 1 0
1 1 1
1 1 1
0 1 0
1 1 0
1 1 1
1 1 0
0 1 1
0 1 1
0 0 0
1 0 0
0 1 0
1 1 1
0 0 1
1 1 0
1 1 1
0 1 0
0 1 1
1 1 0
0 1 1
1 0 1
1 1 1
1 1 0
0-反転すると,4-連結でなくなる,
または途切れるため,反転不可
基本的に0-反転可だか,既走査部が
0-反転済みかどうかで状況が変わる
線図形化処理
3×3のマスクを用いた4-連結細線化アルゴリズム
case 5 : 8近傍の1-画素の個数が5の場合
<3つの0-画素が連続となる全パターン>
1 0 0
0 0 1
1 1 1
1 1 1
1 1 0
0 1 1
0 1 1
1 1 0
1 1 1
1 1 1
0 0 1
1 0 0
0 0 0
0 1 1
1 1 1
1 1 0
1 1 1
0 1 1
1 1 1
1 1 0
1 1 1
0 1 1
0 0 0
1 1 0
既に走査された部分について検討
線図形化処理
3×3のマスクを用いた4-連結細線化アルゴリズム
case 5 : 8近傍の1-画素の個数が5の場合
1
0
0
1
1
0
1
1
1
が既に0-反転していたら
注目画素を0-反転しても連結は保持される
0-反転は可能
線図形化処理
3×3のマスクを用いた4-連結細線化アルゴリズム
case 5 : 8近傍の1-画素の個数が5の場合
1
0
0
1
1
0
1
1
1
が既に0-反転していたら
注目画素を0-反転したら途切れてしまう
他の7パターンについても
考えてみましょう!
0-反転は不可
線図形化処理
3×3のマスクを用いた4-連結細線化アルゴリズム
case 6以降は,0-反転すると孔になる可能
性が高いため処理対象から外しています。
細線化:実習
imgbinary2.hを利用します。
image_processing10.cを利用します。
細線化関数,void Thinning(void)を完成さ
せてください。
case 4とcase 5について,それぞれ残りの3
パターンを完成させてください。
細線化:実習
characters.rawを細線化しなさい。
Thinning()は,1-画素を細線化します。
characters.rawは,文字が0-画素になるので,
Inverse()を行い文字が1-画素となるようにして下さい。
2値化した後でThinning()を実行することを忘れない
ように。
case 1 と case 2 における処理回数の閾値を変更し
て画像の変化をみましょう。
lena.rawについても行ってみましょう。
細線化:実習結果
case 1,2の閾値が3の場合
ひげが目立つ
case 1,2の閾値が7の場合
ひげは多少除去されたが,
「B」において線が縮小して
しまっている。
境界線追跡
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へ
境界線追跡
実習
imgbinary3.hを利用します。
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()