画像内の正方形を見つける


34

OpenCVを使用して画像内の正方形を見つける必要があります(matlabやその他の問題はありません。一般的に、私はいくつかのアイデアを期待しています)。

以下のテスト画像を検討してください。

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

上の画像で色の付いた正方形を正確に見つける必要があります(白い長いストリップではありません)。

私がしたこと :

  • 一般的な方法(OpenCVサンプルに付属)を適用しました。つまり、すべてのカラープレーンで輪郭見つけ、近似し、要素数= 4をチェックします。いくつかの四角形、特に暗い四角形が検出されると、ある程度拡張されます。

  • 次のステップは予測でした。すなわち、この配置は固定されています。そのため、いくつかが取得された場合、残りのものを予測できます。また、さらに拡張されました。しかし、精度は非常に悪かった。

しかし、ここでは予測は良い方法ではなく、最初のステップで与えられたように正確な答えを常に提供するとは限りません。

必要なもの:

1)これらの正方形をより正確に検出する他のより良い方法はありますか?または複数の方法?

1つの重要なポイントは、ここでは時間は問題ではないということです。アルゴリズムは遅くなる可能性がありますが、問題ではありません。しかし、精度が主要な基準です。

時々、画像がはるかにぼやけることがあります。

そして、私が直面した主要な問題の1つは、いくつかの正方形が背景の色とほぼ同じ色を持つことです(3列目の1番目と2番目の正方形を確認してください)。

アイデアを探して、事前に感謝します

更新:

以下は、私が得た最大の正確な結果です:

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

もちろん、結果画像のサイズは少し変更されます。

更新2:

私は以下の回答でより良いソリューションを提供しました:https : //dsp.stackexchange.com/a/7526/818


あなたの背景は常に白っぽいですか?

1
私のアイデアは「彩度」を計算し、sat imgのしきい値を設定することでしたが、例を使用するとあまりうまくいきません(彩度をmax(RG、RB、GB)として計算します。すべての画像が同じパターン(隣に正方形のある長い白いストライプ)がある場合、最も簡単なビット(実際に色付けされた正方形、または白いストライプなど)を見つけて、他の場所の推定位置を推測する必要があります正方形と...実際に存在するかどうかを確認する方法を見つけてください。タフですが面白い!さらに画像を提供できますか?

まあ、これは動かすべきではなかったと思う。
-Junuxx

1
さらに画像を提供できますか?また、これは何ですか?
アンドレイRubshtein

2
OPはいくつかの質問に答える必要があります。たぶん白い背景は必要ありません。そして、光はどうなっていますか?そんなに悪くなるのでしょうか?これらは、私にとって不必要に複雑に見えます。
泰-宋新

回答:


9

Matlabを使用した最初の試み:

im = imread('squares.jpg');
im2 = rgb2gray(im);

se = strel('disk', 15);

for i = 1:16;
    t = 60+i*5; % try out a range of bw thresholds to see what works best
    labelled = bwlabel(im2>t); % label regions in the BW image
    closed = imclose(labelled, se); % close small regions
    cleared = imclearborder(~closed,4); % clear regions touching the border
    subplot(4,4,i); 
    imshow(cleared); 
    title(['T = ' num2str(t)]);
end

次の地域の結果:

ラベル付き領域

ご覧のように、最大​​数のリージョン(T = 120)をもたらすしきい値を選択すると、すでに7つの正しい場所、いくつかのマージされた場所、1つの誤検知と2つの誤検知が得られます。

これはかなり単純な試みでしたが、このアプローチが機能することを示していると思います。いくつかの要素を追加して細長い領域を分割するか、これを各カラーチャネルに対して個別に行うことは、これを改善するためにできることのほんの一部です。

また、さらにいくつかのテストイメージを提供すると役立ちます。


8

問題の結果を改善するために別のことを試みました。以下の解決策は、最初の正方形(オレンジ)が常にステップ1で検出されることを前提としています。また、背景と比較してコントラストが高いため、実用的です。私が問題で示した結果でさえ、それを正しく検出しました

ステップ1:できるだけ多くの正方形を見つける

画像をR、G、B、H、S、Vプレーンに分割し、25の倍数などのさまざまなしきい値で画像のしきい値を設定しました。各画像について正方形を見つけ、それらを「マスク画像」に配置しました。また、正方形の平均の高さと幅を見つけました。

マスク画像(合計7/12の正方形が検出されました):

マスク画像

ステップ2:正方形のグリッドを形成する

次に、マスク画像でこれらの正方形の重心を見つけました。それらをソートし、最初の正方形(オレンジ)の重心を見つけました。綿密な分析から、2つの正方形間のギャップが水平方向と垂直方向の両方で正方形であることがわかります。このようにして、以下のような正方形のグリッドを作成し、ideal_squaresと呼びました(これは単なる名前であり、これが必要な出力であるという意味ではありません)。

ideal_squares:

理想的なイメージ

ステップ3:ideal_imageの再マッピング

これで、ideal_squaresの重心と元の重心ができました。ideal_centroidsから元の各セントロイドの正しい一致を見つけました(それらの間のユークリッド距離を取ることにより)。次に、補間のためにScipy interpolate.griddataを使用し、重心値に従ってideal_imageを再マップしました(これらのQ&Aで行われたワーピングとほぼ同じです:数独正方形の凸欠陥を除去する方法OpenCVの画像変換)。以下は、私が得た出力です:

出力:

出力画像

ステップ4:または、最初のステップのマスクイメージを使用して出力の上で操作する

最終出力

これで、すべての正方形が検出されたことがわかりますが、次の問題があります。

問題点:

ステップ3の出力、つまり、正方形グリッドの再マップ画像を見てください。2つの中央の正方形を除き、他のすべての正方形はクリップされます。この再マッピングに関連する問題です。scipy.interpolate.griddata()またはcv2.remap()で問題がどこにあるのかわかりません。画像全体がゆがむと思いましたが、そうではありません。与えられた図心内の画像のみをワープします。これを修正できれば、出力は問題ありません。

だから誰かがそのための良いアイデアを知っているなら、大歓迎!!!


5

注:この方法は非常に遅くなります。

理想的なオブジェクトの輪郭のように見えるマスクを生成します。これに似ています:

オブジェクトのマスク

次に、マスクを画像上でスライド(位置、スケール、回転)し、実際の画像の輪郭と一致させ(応答をより柔らかくするために少しぼかして)、それらの類似度を計算します。(位置、スケール、回転)最も高い類似性応答は、実際のオブジェクトの(位置、スケール、回転)である必要があります。

このメソッドは、オブジェクト全体を考慮するため、オブジェクトの背景や部分的なオクルージョンへの正方形のブレンドを気にしません。

私は個人的にこの方法を使ってマウスの鼻とひげをうまく追跡しましたが、最後の既知の位置に近いなどの推測がありました。カメラ内のオブジェクトの位置、中心からの距離、または10度未満の回転など


5

ステップ1:B、G、R、H、S、Vプレーンで分析することで得られる最終的なバイナリイメージが何であれ、そのイメージではblobカウントアルゴリズムを実行します。

ステップ2:面積または輪郭の長さに基づいて最大のブロブを見つけます。ブロブはほとんどが平行四辺形であるため、面積または輪郭になるため、どれでもできます。

ステップ3:最大のBLOBを使用して(最大のBLOBは実際の正方形に似ているため)、BLOBの方向を見つけようとします...これは、最適な四角形をフィッティングするか、コーナーポイントを取得することで取得できます...それらをつなぐ線の勾配を取得します(水平線と垂直方向の両方で)。

ステップ4:2つの傾斜が得られたら、ブロブの軸を通る2本の線を引きます。軸の場合は、コーナーポイントを平均化するか、重心(重心)を使用できます...コーナーポイントの平均を使用します...

ステップ5:各水平方向と垂直方向の間隔は等しいため(理想的な正方形の画像から来ると理想的には水平方向と垂直方向の間隔も等しくなりますが、想定しません)。平行四辺形

ボトムライン: 1つの正方形が完全に検出された場合、グリッド全体を作成できます。最大ブロブの水平軸に沿って2H(H =最大ブロブの水平幅)間隔で、ブロブの垂直軸に沿って垂直に2V(V =最大ブロブの垂直高さ)間隔で中心をマークするだけです。

サポートするいくつかの写真 ここに画像の説明を入力してください

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


1
+1-実装できたら素晴らしいと思います。
アビッドラーマンK

2
@AbidRahmanKそれはStackExchangeの目的ではありません。質問->回答。それ以外の場合、これは仕事のフェアになります。
ヤンクルーガー

2

この配置は固定されています

あなたが以前にどのような予測をしたかは本当にわかりませんが、ルートとして白い長いストリップに焦点を合わせようとしましたか。次に(3列の正方形が同じサイズの場合)、正方形の高さ(2つのストリップ間の距離)を検出でき、画像の最大領域と最小領域(高さと幅)を検出できます。

次に、正方形全体の最も一般的な色を検出し、「非正方形」領域に設定します。残りはあなたが探している正方形になるはずです。


等高線法を使用して3〜4個の正方形を見つけました。次に、各正方形の高さと幅を取得しました。次に、検出された正方形間のギャップをチェックし、それらの間のギャップが別の正方形を保持するのに十分な大きさであると仮定しました。それが私がした予測です。
アビッドラーマンK

一部の正方形は、背景の色とほぼ同じ色を持っています。だから私は恐れている、彼らはまたあなたの方法に従って非正方形の領域と見なされます。
アビッドラーマンK

たぶん、すべての列で作業して、x軸が画像の高さ(ピクセル単位)、y軸が強度になる曲線をプロットすることができます。次に、微分形式でいくつかの刃先を見つけようとすることができます。

それはエッジ検出そのものですよね?試しましたが、良い結果が得られませんでした。
アビッドラーマンK

1
はい、できますが、失敗の理由は自分で確認でき、プロット内のいくつかの興味深い領域を分離できます。ところで、問題を解決するのに役立つヒントを見つけたら、投稿してください。研究の幸運

0

ハフ変換を使用することをお勧めします。ハフ変換は、線、円などの単純なパラメトリック形状を見つけるための非常に堅牢なアルゴリズムです。線の検出が最適です。少なくとも長い白いスリッピーの側面を見つけることができました。次に、角抽出アルゴリズム(ハリスまたは多分SIFTまたはSURF)を使用すると、正方形がほぼ等間隔であるという事実を使用しても、それらの線に沿って角を見つけることができます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.