この画像の四角形を認識する方法は?
-
08-07-2019 - |
質問
画像に水平線と垂直線があります。実際、この画像は、水平線と垂直線に変換されたBBC Webサイトです。 私の問題は、画像内のすべての長方形を見つけたいということです。すべての長方形を見つけるためのコンピュータープログラムを作成します。 誰もこれを行う方法を知っていますか、開始方法に関するアイデアを提案しますか?このタスクは、人間として視覚的な四角形を見つけるのは私にとって簡単ですが、プログラムとしてどのように記述するかはわかりません。
画像はBBCのWebサイトです http://www.bbc.co.uk/
これに更新して、BBCウェブサイトの画像を水平線と垂直線に変換するコードを書きました。問題は、これらの線が角で完全に合わず、時には完全に長方形を形成しないことです。ありがとう!
解決
Opencv (cで記述された画像処理およびコンピュータービジョンライブラリ)には、ハフ変換(単純なハフ変換は画像内の線を見つけますが、一般化されたものはより複雑なオブジェクトを見つけます。角が閉じている長方形には、cornerHarrisなどの角検出器もあります。
opencvで提供されているhoughlinesデモを実行しましたが、これが提供した画像の結果です(検出された行は赤でマークされています)。
(ソース: splintec.com )
他のヒント
一般化されたハフ変換を探していると思います。
コンピュータービジョンには、一般化されたハフ変換と呼ばれるアルゴリズムがあります。 。このアルゴリズムを実装したオープンソースコードがあるはずです。ただ検索してください。
合理的にノイズのない画像(画面のビデオではない)であると仮定すると、単純な塗りつぶしアルゴリズムの1つが機能します。ギャップを埋めるために、画像に対して膨張/収縮を実行する必要がある場合があります。
線を見つける通常の方法は、ハフ変換です(その後、直角に線を見つけます) Opencvが最も簡単な方法です。
この質問をご覧ください OpenCVオブジェクト検出-センターポイント
カラーピクセルに達するまで左から右に繰り返し、修正された塗りつぶしアルゴリズムを使用します。アルゴの詳細情報 @wikiの洪水塗りつぶし
別のアプローチは、画像上の任意の色のピクセルを見つけて、それを使用することです
while(pixel under current is colored)
{
lowest pixel coordinate = pixel under current
current = pixel under
}
次に同じことを行います。 これで、1行を定義しました。次に、行の終わりを使用して、行を長方形に近似一致させます。それらがピクセル完璧でない場合、何らかの種類のしきい値を設定できます。
塗りつぶしが機能するか、エッジ追跡アルゴリズムの修正を使用できます。
あなたがすることは: 2d配列(またはその他のd2データ構造体)を作成します-各行は画面上の水平ピクセル線を表し、各列は垂直線を表します
左から右にすべてのピクセルを反復処理し、色付きのピクセルが見つかったら、その座標を配列に追加します
配列を反復して行を見つけ、それぞれの開始ピクセルと終了ピクセルを保存します(異なるデータ構造)
各行の先頭がその左/上のピクセルであることを知っているので、長方形を構成する4行があるかどうかを簡単に確認できます
あなたが持っている画像から取得するには、長方形にちょうど触れるほぼ水平および垂直の線で:
- バイナリに変換(つまり、すべての行 白、残りは黒)
- バイナリ拡張を実行します(ここでは、ソース画像の白いピクセル、またはソース画像の白いピクセルです。タッチはまっすぐです(したがって、各ピクセルはその左、右、上、下のピクセルを「タッチ」します)これは「4連結」と呼ばれます;
- 両端の間隔が2ピクセルよりも大きい場合は手順3を数回繰り返しますが、あまり頻繁ではありません!
- スケルトン操作を実行します(ここで、出力画像のすべてのピクセルが少なくとも1つの黒いピクセルに触れるソース画像の白いピクセルであり、それが触れる(ソース画像の)白いピクセルがすべて互いに接触している場合、再度、4連結性で定義されたタッチ。以下のサンプルを参照してください。
- 繰り返しても画像が変わらなくなるまでステップ4を繰り返します(すべての白いピクセルはラインエンドまたはコネクタです)
これは、少し運が良ければ、最初に太い太い線のボックスを表示し、画像全体に太い太いアーティファクトを残し(ステップ3の後)、次にステップ5の後、太い太いアーティファクトをすべて削除します。すべてのボックスが残ります。最良の結果を得るには、手順3で繰り返し回数をtweekする必要があります。画像の形態に興味がある場合は、の本ですとても良い入門コースでした。
サンプル:(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