2016-04-02 23 views
0

私はまだコーディングの初心者です。私は現在、C/C++のプログラムで、写真の中に定義されたマーク(白い背景を持つ黒い円です)のピクセル位置を決定しています。
私はそれが要素(私は赤、緑、青の値を合算++魔術を使って)だとして、マスクのすべてのピクセル値が含まれているマークとベクトルからマスクを作りました。ベクターにはaproxが含まれています。マスクが100x100pxなので10000の値。私はまた、イメージを単純化するための閾値関数を使用しました。画像内に定義されたマークの位置検出

私はマークの座標を見つけたい絵、同じことをやっているグリッドを、作ったより。これは基本的にループであり、画像を通過しており、プログラムがグリッド内のピクセル値を知っているときには、それらをすぐにマスクと比較します。主なアイデアは、マスクとグリッド位置の1つの差が最も小さいことです。

問題(例えば、画像10の000値を含む1920x1080pxので、200万人以上のベクトルを持っている)すべてのグリッド位置を評価するこの手順は時間の膨大な量を要することがあります。私はグリッドをすべてのピクセルではなく、例えば10番目の列と行ごとに循環させることにしました。そして、この手順から最良のコアリングのために、すべてのピクセルループを使用した領域を選択しました。しかし、これにはまだ多くの時間がかかります。

私はそこに、より良い(速い)の結果を得るために、この方法を改善するいくつかの方法があるか、この全体的なアイデアは、時間効率的ではないと私は別のアプローチを使用するかどうか、お聞きしたいと思います。

アドバイスありがとうございます!

編集:プログラムは複数の画像を処理するために使用され、それらのすべてでサイズは同じになります。これはしきい値の後の画像で、マークは大きな黒い点です。 Image

+0

マークが特定の位置にあるかどうかを確認してください。さらに、それが特定のサイズを有する場合には、任意のサイズを有することができる。また、マークがその写真の上にあるものを完全に上書きする場合もあります。 –

+0

円ハフ変換のようなアルゴリズムを使用しようとしましたか?それはあなたのaproachをより速くするiterestのあなたの領域を制限する可能性があります。 –

+0

私はあなたがアートテンプレートマッチングの状態について何かお読みください。それはあなたがやっているものに似ていますが、かなり速いです。 – Piglet

答えて

1

私が興味深いと思うのは、ピラミッド方式、つまりプログレッシブリファインメントです。より小さな画像でスポットを見つけて、大きな画像の小さな四角形だけを探します。

あなたは、あなたがより大きな画像で4いくつかの検索の努力に加えて時間を削減する各次元で2によって、あなたの画像を縮小した場合。

これにはいくつかの問題があります。削減すると、予想される精度に影響します。あなたはその場を逃すかもしれない。

この場合、ハーフサイズのテンプレートを作成するには、サンプル(テンプレート)を同じサイズにカットする必要があります。半分の半分になると、テンプレートは周囲のオブジェクトにぼやけてしまい、有効なテンプレートを持つことはできません。半分のサイズのために、私はドットがそれの周りにいくつかのピクセルを持っていると思います。

+0

私は、このアイデアが、より小さなサイズの画像にスポットを見つけることと、正確なアルゴリズムがより大きな画像で実行されるはずの四角形を定義することが好きです。間違いなく試してみる。どのくらいの計算時間を私はそれから得ることができますかと思います。ありがとう! – jeikey

0

あなたがツールやOSを指定していないとして、私はほとんどのLinuxディストリビューションにインストールされ、OSXとWindowsで利用可能ですされてImageMagickのを選択します。私はここでコマンドラインで使っていますが、C、C++、Python、Perl、PHP、Ruby、Java、および.Netバインディングが利用できます。

は、私はこのような「接続コンポーネントの解析」「ブロブ解析」を使用します。

convert image.png -negate       \ 
    -define connected-components:area-threshold=1200 \ 
    -define connected-components:verbose=true   \ 
    -connected-components 8 -auto-level result.png 

私は-negateであなたのイメージを反転しているモルフォロジー演算では、フォアグラウンドではなく、通常は白であるため、黒よりも。あなたのサークルの半径が2220ピクセルで、1520ピクセルの領域(Pi * 22^2)になるように見えるので、1200ピクセルより小さいブロブを除外しました。

7つの塊を意味し、この出力、与え - 1行に1つずつ - それぞれのバウンディングボックスと面積とを:

Objects (id: bounding-box centroid area mean-color): 
    0: 1358x1032+0+0 640.8,517.0 1296947 gray(0) 
    3: 341x350+1017+287 1206.5,468.9 90143 gray(255) 
    106: 64x424+848+608 892.2,829.3 6854 gray(255) 
    95: 38x101+44+565 61.5,619.1 2619 gray(255) 
    49: 17x145+1341+379 1350.3,446.7 2063 gray(0) 
    64: 43x43+843+443 864.2,464.1 1451 gray(255) 
    86: 225x11+358+546 484.7,551.9 1379 gray(255) 

あなたのサークルが42x42ピクセルであるとして、あなたはブロブを探しているであろう、という注意をそれは正方形で、そのサイズに近いので、私は最後の2行目を見ています。あなたがサークルを探しているとして、あなたは面積がpi * r^2や周りの1500ピクセルであることを期待することに注意し、また

convert image.png -fill none -stroke red -draw "rectangle 843,443 886,486" result.png 

enter image description here

:私はこのようにあなたの元の画像に赤でそれをで描くことができます出力の最後から二番目の欄でそれを確認することができます。

これは、合理的な仕様のiMacで0.4秒で実行されます。画像を4に分割し、各四半期を並列に実行すると、処理が高速化されることに注意してください。あなたが次のようなことをすれば、

#!/bin/bash 
# Split image into 4 (maybe should allow 23 pixels overlap) 
convert image.png -crop [email protected] tile-%02d.mpc 

# Do Blob Analysis on 4 strips in parallel 
for f in tile-*mpc; do 
    convert $f -negate \ 
     -define connected-components:area-threshold=1200 \ 
     -define connected-components:verbose=true  \ 
     -connected-components 8 info: & 
done 
# Wait for all 4 to finish 
wait 

約0.14秒で実行されます。

関連する問題