web-dev-qa-db-ja.com

この画像で長方形を認識する方法は?

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

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


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

31
Phil

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

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

22
elijah

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

9
rlbond

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

4
ppan

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

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

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

3
Martin Beckett

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

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

2
Davide

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

  1. バイナリに変換します(つまり、すべての線が白で、残りは黒です)。
  2. Binary dilation を実行します(ここで、ソースイメージの白いピクセルに触れるすべてのピクセル、またはソースイメージの白いピクセルを白にします。タッチは直線のみです(つまり、各ピクセルはピクセルに「触れます」左、右、上、下)これは「4接続」と呼ばれます
  3. 端の間のギャップが2ピクセルより広い場合は、ステップ3を数回繰り返しますが、あまり頻繁ではありません。
  4. スケルトン操作を実行します(ここで、ソースイメージの白いピクセルが少なくとも1つの黒いピクセルに触れる場合、出力イメージのすべてのピクセルを黒にし、それが(ソースイメージ内で)触れる白いピクセルはすべて互いに触れます。もう一度タッチします。 4接続で定義されています。以下のサンプルを参照してください。
  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    
1
jilles de wit

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

1
data

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

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

その後、上向きに同じことを行います。今、あなたは単一の行を定義しました。次に、線の端を使用して、線を長方形にほぼ一致させます。ピクセルが完全でない場合は、何らかのしきい値を設定できます。

1
data

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

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

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

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

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

1
Zepee