画像処理:画像内の四角い看板を検出する方法は?


14

携帯電話を使用してキャプチャした画像から四角形の看板を検出するにはどうすればよいですか?長方形のような形状を検出するにはどうすればよいですか?角丸長方形(形状コーナーの代わりに角丸)?

私はopencv.wrapperを使用していますが、それは初めてです。

ありがとう。

サンプルは次のとおりです。 代替テキストhttp://www.freeimagehosting.net/uploads/b03442fd36.png

代替テキストhttp://www.freeimagehosting.net/uploads/e6b36040e8.png

ノイズとそこに多くの線があるため、看板の境界線がどれであるかを判断できません。ハフ変換後に線の境界を見つけることができます。私は閉じ込められています...この種のシナリオでは...

これは携帯電話のカメラから撮影した2枚の生写真です

代替テキストhttp://www.freeimagehosting.net/uploads/6dbd613edf.jpg 代替テキストhttp://www.freeimagehosting.net/uploads/720da20080.jpg

看板を出すために画像をどのように処理できるかを知るには、アドバイスが必要ですか?

どうもありがとうございました


2
キーワード:opencv、ハフ変換複製:stackoverflow.com/questions/1817442 stackoverflow.com/questions/2068013

うん、FTWをハフ変換!

しかし、画像にノイズがありますどのように看板の境界であるかを見つけることができます

@ xabi123:ハフ変換、しきい値、読み出し境界

1
サンプル画像を共有できますか?

回答:


7

どちらの画像にも、探しているサインとは何の関係もない多くの行が含まれています。そして、これらの線のいくつかは実際に必要な線よりも長い/高いコントラストを持っているので、エッジ線の検出(例えば、ハフ変換の使用またはコントラストを水平/垂直に合計すること)は動作しません。

しかし、あなたが探しているサインには、他の特徴があります。

  • 背景にサインが(ほぼ)一定の明るさを持っている
  • 画像の比較的広い領域を占める
  • 画像の中央付近です

したがって、コントラストの低い大きな接続領域を探しています。Mathematicaで概念実証アルゴリズムをハッキングしました。(私はOpenCVの専門家ではありませんが、OpenCVの機能を知っていれば、それぞれについて説明します。)

まず、ガウス微分フィルターを使用して、各ピクセルの勾配の大きさを検出します。ガウス微分フィルターは広い開口部(この場合は11x11ピクセル)を持っているため、ノイズに非常に敏感です。次に、勾配画像をmean = 1に正規化して、両方のサンプルに同じしきい値を使用できるようにします。

src = Import["http://www.freeimagehosting.net/uploads/720da20080.jpg"];
pixels = ImageData[ColorConvert[src, "Grayscale"]];
gradient = Sqrt[GaussianFilter[pixels, 5, {1, 0}]^2 + GaussianFilter[pixels, 5, {0, 1}]^2];
gradient = gradient/Mean[Flatten[gradient]];

OpenCV実装:sepFilter2D実際のフィルタリングに使用できますが、明らかに、カーネルのフィルター値を自分で計算する必要があります

結果は次のようになります。

勾配の大きさ

この画像では、標識の背景は暗く、標識の境界線は明るいです。そのため、この画像を2値化して、暗い連結成分を探すことができます。

binaryBorders = Binarize[Image[gradient], 0.2];
sign = DeleteBorderComponents@ColorNegate[binaryBorders];
largestComponent = SortBy[ComponentMeasurements[sign, {"Area", "ConvexVertices"}][[All, 2]], First][[-1, 2]];

OpenCVの実装:しきい値設定は簡単である必要がありますが、OpenCVには接続コンポーネント分析が含まれていないと思います。そのためには、fill fillまたはcvBlobsLibを使用できます。

ここで、画像の中央付近で最大のBLOBを見つけて、凸包を見つけます(背景に接続されていない最大のBLOBを使用しましたが、すべての画像には十分ではないかもしれません)。

結果: ここに画像の説明を入力してください ここに画像の説明を入力してください


0

この状況でノイズに対してより堅牢な別のアプローチは、x軸とy軸に沿って画像の平均グレーレベルの曲線を生成することです。つまり、画像の各行/列の平均グレーレベルを計算します。

たとえば、看板(またはその境界線)がその周囲よりも軽い場合(質問に示されているすべての例の場合)、x軸曲線に2つのピークがあります(左右と境界線) )およびy軸曲線の2つのピーク(上下の境界線用)。1次元の信号(ハイパスフィルターの可能性があります)の境界検出手法を使用して、看板のコーナー座標を推定できます。

ナンバープレートの検出と顔認識にこのアプローチが使用されていることを確認しました(鼻は顔の明るい部分になる傾向があるため、x軸とy軸の曲線にピークが生成されます)。


うーん。看板が回転したり、カメラが転がったりした場合はどうなりますか?
ムスタファ

0

これは少し逆さまのアイデアかもしれませんが、試してみる価値があるかもしれません。四角形を検出してノイズのようなテキストを考える代わりに、テキストを情報のように扱い、それを使用して四角形を簡単に検出できます。

アイデアの概要は次のとおりです。

  • 画像内のテキストを検出します。堅牢な実装である必要はありません(それを行う小さなライブラリをGoogleで検索できるか、OpenCVが持っている可能性があります)。画像内のテキストの概算です。
  • すべてのテキスト検出の中心を見つける。ノイズの多い画像であっても、実際の場所の周りにあるはずです
  • テキスト検出の周りの領域でハフ長方形決定をしてください。テキスト検出の中心からの距離の中央値などを使用する場合があります。異なる直径を行い、最も強いリコール取りますます。

説明と利点:

  • 通常、テキストの周囲の領域は均一です-最初の強いリコールは実際の長方形である必要があります
  • この方法では、画像全体でハフ変換を行う必要がないので、より自然に行うことができます(同じエリアで複数回、バケットサイズが異なる場合があります...)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.