質問

画像に水平線と垂直線があります。実際、この画像は、水平線と垂直線に変換されたBBC Webサイトです。 私の問題は、画像内のすべての長方形を見つけたいということです。すべての長方形を見つけるためのコンピュータープログラムを作成します。 誰もこれを行う方法を知っていますか、開始方法に関するアイデアを提案しますか?このタスクは、人間として視覚的な四角形を見つけるのは私にとって簡単ですが、プログラムとしてどのように記述するかはわかりません。

画像はBBCのWebサイトです http://www.bbc.co.uk/


これに更新して、BBCウェブサイトの画像を水平線と垂直線に変換するコードを書きました。問題は、これらの線が角で完全に合わず、時には完全に長方形を形成しないことです。ありがとう!

役に立ちましたか?

解決

Opencv (cで記述された画像処理およびコンピュータービジョンライブラリ)には、ハフ変換(単純なハフ変換は画像内の線を見つけますが、一般化されたものはより複雑なオブジェクトを見つけます。角が閉じている長方形には、cornerHarrisなどの角検出器もあります。

opencvで提供されているhoughlinesデモを実行しましたが、これが提供した画像の結果です(検出された行は赤でマークされています)。 alt text
(ソース: splintec.com

他のヒント

一般化されたハフ変換を探していると思います。

コンピュータービジョンには、一般化されたハフ変換と呼ばれるアルゴリズムがあります。 。このアルゴリズムを実装したオープンソースコードがあるはずです。ただ検索してください。

合理的にノイズのない画像(画面のビデオではない)であると仮定すると、単純な塗りつぶしアルゴリズムの1つが機能します。ギャップを埋めるために、画像に対して膨張/収縮を実行する必要がある場合があります。

線を見つける通常の方法は、ハフ変換です(その後、直角に線を見つけます) Opencvが最も簡単な方法です。

この質問をご覧ください OpenCVオブジェクト検出-センターポイント

問題にはいくつかの異なるアプローチがあります。 形態学的画像処理ツールを使用します.mmorph.com / "rel =" nofollow noreferrer ">これ。 " rectangle"を定義する柔軟性があります。 「完全に閉鎖」されていないものでも(フィルアルゴリズムが失敗する場所)。

もう1つの可能性は、機械学習アプローチを使用することです。前のような定義駆動型よりも駆動型です。アルゴリズムにいくつかの「例」を与える必要があります。長方形とは何か、そして最終的に学習します(バイアスとエラー率で) 。

カラーピクセルに達するまで左から右に繰り返し、修正された塗りつぶしアルゴリズムを使用します。アルゴの詳細情報 @wikiの洪水塗りつぶし

別のアプローチは、画像上の任意の色のピクセルを見つけて、それを使用することです

while(pixel under current is colored)
{
  lowest pixel coordinate = pixel under current
  current = pixel under
}

次に同じことを行います。 これで、1行を定義しました。次に、行の終わりを使用して、行を長方形に近似一致させます。それらがピクセル完璧でない場合、何らかの種類のしきい値を設定できます。

塗りつぶしが機能するか、エッジ追跡アルゴリズムの修正を使用できます。

あなたがすることは: 2d配列(またはその他のd2データ構造体)を作成します-各行は画面上の水平ピクセル線を表し、各列は垂直線を表します

左から右にすべてのピクセルを反復処理し、色付きのピクセルが見つかったら、その座標を配列に追加します

配列を反復して行を見つけ、それぞれの開始ピクセルと終了ピクセルを保存します(異なるデータ構造)

各行の先頭がその左/上のピクセルであることを知っているので、長方形を構成する4行があるかどうかを簡単に確認できます

あなたが持っている画像から取得するには、長方形にちょうど触れるほぼ水平および垂直の線で:

  1. バイナリに変換(つまり、すべての行 白、残りは黒)
  2. バイナリ拡張を実行します(ここでは、ソース画像の白いピクセル、またはソース画像の白いピクセルです。タッチはまっすぐです(したがって、各ピクセルはその左、右、上、下のピクセルを「タッチ」します)これは「4連結」と呼ばれます;
  3. 両端の間隔が2ピクセルよりも大きい場合は手順3を数回繰り返しますが、あまり頻繁ではありません!
  4. スケルトン操作を実行します(ここで、出力画像のすべてのピクセルが少なくとも1つの黒いピクセルに触れるソース画像の白いピクセルであり、それが触れる(ソース画像の)白いピクセルがすべて互いに接触している場合、再度、4連結性で定義されたタッチ。以下のサンプルを参照してください。
  5. 繰り返しても画像が変わらなくなるまでステップ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    
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top