2値化画像処理のお勉強(8)
やりたいこと
2値画像処理について学ぶ
教科書
二値化
参考:画像処理(二値化)
2値化
2値化は文字をファックスで送る場合やOCRによって文字認識を行う場合などに必要となる処理である。
以下に2値化の方法を示す。
p-タイル法
画像中の文字の占める領域の画素数が文字の大きさと撮影条件からあらかじめ予測できる場合に、予測された画素数に応じてしきい値を決める手法。未知画像には適さない。
モード法
山と山の間の谷の底をしきい値とする。谷の底を自動かつ安定に検出するためにノイズ除去が必要。
参考:画像処理(二値化)
判別分析法
分離度が大きくなるようにしきい値を決める。
分離度:クラス間分散とクラス内分散の比で定義される
参考: C++でOpenCVを使って判別分析法(大津の2値化)を自作してみる | ITハット
連結性
参考:
輪郭追跡
参考: 2値画像の基本処理と計測 - メディア情報処理 - アットウィキ
輪郭追跡手順
ラスタスキャンで画素が変化する場所を探索
右回りに黒を探索
見つかった黒画素に移動。追跡済みの場合は終了でそうでない場合は一つ前に戻る。
輪郭追跡の応用
チェインコード
文字認識
参考: 文字認識 | 文字認識の技術水準について | メディアドライブ
収縮・膨張処理
収縮:背景、穴に接する対象の画素を一回りはぎ取る処理。連結性を保持しない処理。
膨張:背景、穴に接する対象の画素に画素を一回り加える処理。連結成分同士が繋がる時があり、こちらも連結性を保持しない処理。
クロージング:同じ回数だけ膨張して収縮する処理。画像の小さな穴を除くことができる。
→
オープニング:同じ回数だけ収縮して膨張する処理。画像の小さな連結成分を除くことができる。
→
参考:膨張・収縮・オープニング・クロージング 画像処理ソリューション
収縮・膨張処理の応用例
画像信号を背景とパターン部分に2値化したのち、膨張・収縮処理を繰り返し行い、ノイズを除去したうえで比較し、欠陥を検出する方式などがある。
ラスタスキャンによるラベリング
二値化画像処理された画像において、白の部分(または黒の部分)が連続した画素に同じ番号を割り振る処理を ラベリングと言います。
通常、同じ番号ごとの面積(画素数)や幅、高さなどの特徴量を求めて欠陥検査や分類処理などに用いられます。
ラベリングには、二値化された画像の縦、横方向に連続している部分を同じラベルにする4連結と、 縦、横、斜め方向に連続している部分を同じラベルにする8連結との2種類の処理があります。
2値化画像
4連結を用いたラベリング
8連結を用いたラベリング
輪郭追跡による距離変換画像
2値画像における対象物の各々に対し、その画像から最も近い背景画素に至る距離を求めてその画素の濃度値とする変換を距離変換という。この変換により得られる画像を距離変換画像という。
[f:id:robonchu:2018050122
形状特徴パラメータ
2値化画像中の連結成分は形状の特徴量によって分類できる。その特徴を数値化したものを形状特徴パラメータと呼ぶ。
重心
外接長方形
面積
周囲超
オイラー数
モーメント特徴
参考:Re - ImageJで学ぶ!: 第24回 2値画像の形状解析で学ぶ!
距離
市街地距離(4近傍距離)
チェス盤距離(8近傍距離)
参考: クラスター分析の手法①(概要) | データ分析基礎知識
ベクトル化処理
細線化処理:連結成分の連結性を保存したまま画素を削る処理を繰り返す
細線化された2値画像の画素は特徴点である端点、分岐点、通過点の3種類に分類される。
参考: パターン認識の前処理に必要な二値画像の細線化:CodeZine(コードジン)
細線化手法
ラスタスキャンを行い、注目画像を中心に3x3の画素値のパターンを観測し、注目画素が以下3つの条件を満たすとき、白画素にする
境界上にある黒画素であること
白画素に変更しても連結性が保存されること
端点でないこと
画素値の更新方法として以下の2つがある
逐次法:更新した画像をそのまま使い,次処理に移る
並列法:消去可能かどうかを検証する検証用画像と,画素値の更新を行う更新用画像を別々に持ち,更新用画像に結果を反映していきます.そして,全画素の処理が終了したら,更新用画像を,次処理の検証用画像とする
細線の特徴点抽出
細線化処理によって、端点、分岐点、孤立点、通過点の特徴点に分類する。特徴点と特徴点に区切られた画素列をセグメントという。
2分割法
セグメントを線分近似しCADシステムで扱える線分の始終点の座標列に変換することをベクトル化と呼ぶ。
線分近似でよく用いられる再帰的な分割法である2分割法の手順を以下に示す。
画素列の始点終点を繋いだ直線に対して、各画素からの距離を計算する
最大距離があるしきい値以下の場合、その直線を線分として採用。そうでない場合、その画素で画素列を分割し分割された画素列で前の手順から再帰的に繰り返す。
画素列の分割がなくなれば終了。
参考: 【C++】細線化した画像のセグメント分割 - Qiita
角点検出
画素を結ぶ線分のなす角度が小さい時に角点とし、画素列を分割する。この方法を用いると角点を線分の始終点にできるが、なめらかに曲がっている曲線に対して精度よく線分近似できない。
そのため、角点を検出して分割点とした後、分割点を2分割法で線分近似する方法が用いられる。
ベクトル化の応用例
人手で作った地図データから、自動で画像データをベクトル化し、家屋を検出するなど手間を省略するシステムなどがある。
所感
2値化画像の処理ひとつとっても奥が深い。。。