0

私はまだコーディングの初心者です。現在、写真内の定義されたマーク (周囲が白い黒い円) のピクセル位置を決定する C/C++ のプログラムに取り組んでいます。マークとベクトルからマスク
を作成しました。これには、マスクのすべてのピクセル値が要素として含まれています(Magick ++を使用して、赤、緑、青の値を合計しました)。ベクトルには約が含まれています。マスクが 100x100px であるため、10,000 個の値。また、画像を単純化するためにしきい値関数も使用しました。

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

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

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

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

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

4

2 に答える 2

1

私が興味深いと思うアイデアは、ピラミッド スキーム、つまり漸進的改良です。小さいサイズの画像でスポットを見つけ、大きな画像で小さな四角形だけを検索します。

画像を各次元で 2 縮小すると、時間が 4 短縮され、大きな画像での検索作業がいくらか短縮されます。

これにはいくつかの問題があります。減少は、私が期待する精度に影響します。その場を逃してしまうかもしれません。

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

于 2016-04-03T16:40:39.957 に答える
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形態学的操作では、前景は通常黒ではなく白であるため、画像を反転させました。1200 ピクセルより小さいブロブは除外しました。これは、円の半径が 22 ピクセルで、面積が 1520 ピクセル (Pi * 22^2) になるように見えるためです。

これにより、次の出力が得られます。これは、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 番目の行を見ています。次のように、元の画像に赤で描画できます。

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

ここに画像の説明を入力

また、円を探している場合、領域がpi * r^21500 ピクセル前後であることが予想され、出力の最後から 2 番目の列で確認できることに注意してください。

これは妥当なスペックの iMac で 0.4 秒で実行されます。イメージを 4 つに分割し、各四半期を並行して実行して処理を高速化できることに注意してください。したがって、次のようなことをすると:

#!/bin/bash
# Split image into 4 (maybe should allow 23 pixels overlap)
convert image.png -crop 1x4@ 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秒で実行されます。

于 2016-05-08T18:30:55.273 に答える