横線と縦線のある画像があります。実際、この画像はBBCのWebサイトを水平線と垂直線に変換したものです。私の問題は、画像内のすべての長方形を見つけられるようにしたいということです。すべての長方形を見つけるためのコンピュータープログラムを作成したいと思います。誰もがこれを行う方法を知っているか、開始する方法についてのアイデアを提案していますか?このタスクは私にとって視覚的な長方形を見つけるのは簡単ですが、プログラムとしてどのように説明するかわかりません。
画像はBBCのウェブサイトです http://www.bbc.co.uk/
これに更新して、BBC Webサイトの画像を水平線と垂直線に変換するコードを書きました。問題は、これらの線が隅で完全に合わないことと、完全に長方形を形成しないことです。ありがとう!
Opencv (cで記述された画像処理およびコンピュータービジョンライブラリ)は、ハフ変換(単純なハフ変換は画像内の行を検出しますが、一般化されたものはより複雑なオブジェクトを検出します)の実装があるため、開始。角が閉じている長方形の場合は、cornerHarrisなどの角検出器が役立ちます。
私はopencvで提供されているhoughlinesデモを実行しました。ここに、指定した画像の結果があります(検出された行は赤でマークされています):
(ソース: splintec.com )
一般化されたハフ変換 を探していると思います。
コンピュータービジョンには、一般化 ハフ変換 と呼ばれるアルゴリズムがあり、問題を解決できる可能性があります。このアルゴリズムを実装したオープンソースコードがあるはずです。検索するだけです。
これがノイズのない画像(画面のビデオではない)だとすると、単純な塗りつぶしアルゴリズムの1つが機能するはずです。ギャップを閉じるために、イメージに対して膨張/収縮を実行する必要がある場合があります。
線を見つける通常の方法はハフ変換です(次に直角に線を見つけます)Opencvが最も簡単な方法です。
この質問を見てください OpenCVオブジェクト検出-中心点
水平線と垂直線がほぼ接触している画像から、長方形だけを取得するには:
これにより、少し運が良ければ、最初に太い太い線でボックスが表示され、画像全体に太い脂肪のアーティファクトが残ります(ステップ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
カラーピクセルに到達するまで左から右に繰り返し、次に修正された塗りつぶしアルゴリズムを使用します。アルゴの詳細情報 フラッドフィル@ウィキ
別のアプローチは、画像上の任意の色のピクセルを見つけて、
while(pixel under current is colored)
{
lowest pixel coordinate = pixel under current
current = pixel under
}
その後、上向きに同じことを行います。今、あなたは単一の行を定義しました。次に、線の端を使用して、線を長方形にほぼ一致させます。ピクセルが完全でない場合は、何らかのしきい値を設定できます。
塗りつぶしは機能しますが、エッジ追跡アルゴリズムの修正を使用することもできます。
あなたがしていること:2D配列(または他のd2データ構造体)を作成します-各行は画面上の水平ピクセルラインを表し、各列は垂直ラインを表します
左から右にすべてのピクセルを反復処理し、色付きのピクセルを見つけたら、その座標を配列に追加します
配列を繰り返し処理してラインを見つけ、それぞれの開始ピクセルと終了ピクセルを格納します(異なるデータ構造)
各線の始点が左/上のピクセルであることを知っているので、4本の線が長方形を構成しているかどうかを簡単に確認できます。