32

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

画像はこちらの BBC ウェブサイトhttp://www.bbc.co.uk/


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

4

9 に答える 9

24

Opencv (image processing and computer vision library written in c) has implementation for hough transform (the simple hough transform find lines in an image, while the generalized one finds more complex objects) so that could be a good start. For the rectangles which do have closed corners there are also corner detectors such as cornerHarris which can help.

I ran the houghlines demo provided with opencv and here's the result on the image you gave (detected lines marked in red): alt text
(source: splintec.com)

于 2009-12-22T22:57:52.360 に答える
10

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

于 2009-11-30T02:23:19.530 に答える
4

コンピュータ ビジョンには、一般化されたハフ変換と呼ばれるアルゴリズムがあり、問題を解決できる可能性があります。このアルゴリズムを実装したオープン ソース コードが必要です。それを検索するだけです。

于 2009-11-30T07:24:23.397 に答える
3

それが適度にノイズのない画像(画面のビデオではない)であると仮定すると、単純なフラッドフィルアルゴリズムの1つが機能するはずです。ギャップを埋めるために、画像に対して拡張/侵食を実行する必要がある場合があります。

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

この質問を見てくださいOpenCVオブジェクト検出-中心点

于 2009-11-30T02:06:53.197 に答える
2

あなたの問題にはいくつかの異なるアプローチがあります。このような形態学的画像処理ツールを使用します。「正確に閉じていない」もの(塗りつぶしアルゴリズムが失敗する場合)でも「長方形」を定義する柔軟性があります。

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

于 2009-11-30T02:07:47.553 に答える
1

カラーピクセルに当たるまで左から右に繰り返し、修正されたフラッドフィルアルゴリズムを使用します。アルゴフラッドフィル@ウィキの詳細

于 2009-11-30T01:31:20.280 に答える
1

別のアプローチは、画像上の任意の色のピクセルを見つけて、

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

次に、同じことを上向きに行います。これで、uは1行を定義しました。次に、線の端を使用して、線を長方形に近似します。それらがピクセルパーフェクトでない場合は、ある種のしきい値を設定できます。

于 2009-11-30T01:42:50.903 に答える
1

フラッド フィルが機能するか、エッジ トラッキング アルゴリズムの変更を使用できます。

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

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

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

各線の始まりが左/上のピクセルであることがわかっているので、4 つの線が長方形を構成しているかどうかを簡単に確認できます。

于 2009-11-30T01:48:40.707 に答える
1

水平線と垂直線がほぼ接触している画像から、長方形だけを取得するには:

  1. バイナリに変換します (つまり、すべての行は白で、残りは黒です)
  2. バイナリ膨張を実行します(ここでは、ソース画像の白いピクセルに接触する、またはソース画像の白いピクセルであるすべてのピクセルを白にします。接触は直線のみです(したがって、各ピクセルは左、右、上のピクセルに「接触」します)その下)これは「4-connected」と呼ばれます
  3. 両端の間のギャップが幅 2 ピクセルよりも大きい場合は、手順 3 を数回繰り返しますが、それほど頻繁ではありません。
  4. スケルトン操作を実行します (ここでは、出力イメージのすべてのピクセルを黒にします。ソース イメージの白ピクセルが少なくとも 1 つの黒ピクセルに接触し、(ソース イメージの) 白ピクセルがすべて互いに接触している場合です。もう一度タッチします。 4-connectedness で定義されています。以下のサンプルを参照してください。
  5. 繰り返した後に画像が変化しなくなるまで、手順 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    
于 2009-12-07T22:54:34.340 に答える