ツールまたは 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^2
1500 ピクセル前後であることが予想され、出力の最後から 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秒で実行されます。