左側の次の図に示すように、画像(グレースケールまたはバイナリ)があるとします。目標は、ポイントのリスト、つまり(x、y)の形式の座標のリストを生成することです。画像の暗いピクセル。
これを行うための適切な画像処理ツールは何ですか?それらはどこで利用できますか?
更新:
1)
ここでは、問題の詳細を確認できます。(パックのサイズの違いに注意してください)
それぞれの凸包境界を計算するパックを検出してから、代表的な重心を見つけることをお勧めします{詳細はこちらを参照}。
2)
以下は、距離変換(「Libor」が推奨)を適用した結果です。図の注釈に注意してください。この方法は有望だったため機能しません!
3)
侵食は小さなパックを排除します!
from __future__ import division
from scipy import zeros, ndimage as dsp
from pylab import subplot,plot,matshow,show
img = zeros((30,30))
img[10:14,10:14] = 1
img[16:17,16:17] = 1
img[19:23,19] = 1
img[19,19:23] = 1
subplot(221)
matshow(img,0)
subplot(222)
y = dsp.binary_erosion(img,[[1,1],[1,1]])
matshow(y,0)
subplot(223)
y = dsp.binary_erosion(img,[[0,1,0],[1,1,1],[0,1,0]])
matshow(y,0)
subplot(224)
y = dsp.binary_erosion(img,[[1,1,1],[1,1,1],[1,1,1]])
matshow(y,0)
show()
4)
さて、ここにPython(つまり、愛の言語:))の実装のラベル付けのアイデア(以下の「Jean-Yves」によっても提案されています):
subplot(221)
l,n = dsp.label(img)
sl = dsp.find_objects(l)
for s in sl:
x = (s[1].start+s[1].stop-1)/2
y = (s[0].start+s[0].stop-1)/2
plot(x,y,'wo')
そして結果:
Scipyのパフォーマンスのため、Pythonでは非常に高速に行われますが、label
関数のバックグラウンドプロシージャは、繰り返しの多い処理であることに注意してください。これはトレードオフと見なすことができます。しばらくの間、私はより効率的なアルゴリズムを模索することに熱心に取り組んでいます。また、上記のコードでは、ジオメトリの中心が非常に単純に見つかりましたが、複雑な形状や非対称の形状の場合、位置が偏る可能性があることに注意してください。つまり、進行中の作業です;)。
5)
ここから取り込んだ複雑なケース(実像)で、ここでラベリング案が適用されているが、あなたは結果を参照してください。ラベル付けやオブジェクトの検索を含む手順全体でわずか0.015秒しかかかりませんでした。Scipyのみんな、とてもうまくいきました。うわー!{画像を右クリックし、画像をクリックしてフル解像度で表示}