画像処理・実習 第一回: ガイダンス,ディジタル画像の表現

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()