本文へスキップ

連結数と細線化アルゴリズムをTypeScriptで実装する【画像処理100本ノック】

3
AIで生成された記事

概要

Q.61〜65では二値図形のつながり方を数え、形を壊さずに輪郭画素を削る細線化へ進みます。 画素の値だけでなく、近傍画素の接続関係を扱うトポロジー寄りの処理です。

連結数(Q.61、Q.62)

注目画素の周囲8画素を順にたどり、背景から前景へ切り替わる回数を数えます。

連結数 局所形状の例
0 孤立点または内部
1 端点
2 通常の線
3以上 分岐点

Q.61は4連結、Q.62は8連結の考え方で周囲とのつながりを分類します。前景と背景のどちらを 4連結にするかで、斜めに接する画素の解釈が変わります。

基本的な細線化(Q.63)

細線化は、図形の連結性を保つ条件を満たす境界画素だけを削除し、変化がなくなるまで反復します。 すべての境界画素を同時に消すのではなく、削除候補を一度記録してからまとめて反映します。

Hilditch法(Q.64)

Hilditch法では、近傍の前景数、連結数、削除済み候補との関係など複数の条件を確認します。 線を短くしたり分断したりしない「単純点」だけを削除することが中心です。

Zhang-Suen法(Q.65)

Zhang-Suen法は削除方向の異なる2つのサブ反復を交互に行います。上下左右の特定の積が0になる 条件を入れ替えることで、一方向だけが偏って削られるのを防ぎます。

実装時の注意

反復処理には「削除された画素が0なら終了」という収束判定を入れます。また、走査中に入力を 書き換えないことが重要です。更新タイミングが変わると、同じアルゴリズムでも走査順に依存した 結果になります。

接続性を数える

細線化では、対象画素を削除しても前景のつながりが変わらないかを近傍パターンから判定します。 8近傍を円周順に並べ、背景から前景へ切り替わる回数を数えることで、端点、線上、分岐点を 区別できます。単に近傍の前景数だけで削除すると、線が途中で切れる可能性があります。

4近傍の前景と8近傍の背景を組み合わせるなど、前景・背景の接続規則を同時に考える必要があります。 細線化は「線を細くするフィルタ」というより、トポロジーを保ったまま削除可能な画素を反復して 取り除く処理です。

収束とテスト

各サブ反復では削除候補をマークするだけにし、全画素の判定後にまとめて削除します。削除数が0に なれば収束です。念のため最大反復回数も設けると、条件ミスによる無限ループを防げます。

1画素幅の線、2画素幅の線、輪、T字分岐を入力にし、線が消えないこと、輪が切れないこと、 分岐数が保たれることを確認すると実装の回帰テストになります。

おすすめの記事

最新の記事

著者について

404

s-yoshiki

ただの備忘録です。

※外部送信に関する公表事項