水平線と垂直線がほぼ接触している画像から、長方形だけを取得するには:
- バイナリに変換します (つまり、すべての行は白で、残りは黒です)
- バイナリ膨張を実行します(ここでは、ソース画像の白いピクセルに接触する、またはソース画像の白いピクセルであるすべてのピクセルを白にします。接触は直線のみです(したがって、各ピクセルは左、右、上のピクセルに「接触」します)その下)これは「4-connected」と呼ばれます
- 両端の間のギャップが幅 2 ピクセルよりも大きい場合は、手順 3 を数回繰り返しますが、それほど頻繁ではありません。
- スケルトン操作を実行します (ここでは、出力イメージのすべてのピクセルを黒にします。ソース イメージの白ピクセルが少なくとも 1 つの黒ピクセルに接触し、(ソース イメージの) 白ピクセルがすべて互いに接触している場合です。もう一度タッチします。 4-connectedness で定義されています。以下のサンプルを参照してください。
- 繰り返した後に画像が変化しなくなるまで、手順 4 を繰り返します (すべての白いピクセルは線の端またはコネクタです)。
これにより、少し運が良ければ、最初に太い太い線のボックスが表示され、画像全体に太い太いアーティファクトが残ります (手順 3 の後)。次に、ステップ 5 の後、すべての太い太いアーティファクトが削除されますが、すべてのボックスは残ります。 . 最良の結果を得るには、ステップ 3 で繰り返し回数を微調整する必要があります。画像の形態学に興味があるなら、これは私が受講した非常に優れた入門コースの本です。
サンプル: (0=黒、1=白、各 3x3 ブロックの中心にあるピクセルが考慮され、入力は左、出力は右)
011 => 011
011 => 001 all other white pixels touch, so eliminate
011 => 011
010 => 010
010 => 010 top pixel would become disconnected, so leave
010 => 010
010 => 010
010 => 000 touches only one white pixel, so remove
000 => 000
010 => 010
111 => 111 does not touch black pixels, leave
010 => 010
010 => 010
011 => 011 other pixels do not touch. so leave
000 => 000