8

私はPythonを初めて使用し、行き詰まりました。

次のように、画像上の隣接する粒子を分離できるPythonスクリプトを作成したいと思います。

前

このような別々の地域に:

後

私は分水界法を使用するように提案されました。私が理解している限り、それは私に次のようなものを与えるでしょう:

3Dの流域

編集 実際には、これは距離変換であり、流域ではないことがわかりました

次に、しきい値を使用してそれらを分離することができます。このopenCV流域ガイドに従いましたが、粒子を切り取るためだけに機能しました。私が望むことをするためにコードを「変換」することができませんでした。

その後、別のアプローチを取りました。粒子の輪郭が良好なopenCV輪郭を使用してみました。次に、次のようにエッジを縮小するためにポリゴンオフセットを実行する簡単な方法を集中的に探しています。

エッジオフセット

オフセット輪郭(ポリゴン)から中心を使用すると、パーティクルの数がわかります。しかし、Pythonでエッジオフセット/ポリゴン縮小を行う簡単な方法を見つけることができませんでした。

4

1 に答える 1

7

これは、numpy、scipy、およびscikit-image(別名skimage)を使用したスクリプトです。これは、局所最大抽出とウォーターシェーディングに加えてラベリング(つまり、連結成分抽出)を利用します。

import numpy as np
import scipy.misc
import scipy.ndimage
import skimage.feature
import skimage.morphology

# parameters
THRESHOLD = 128

# read image
im = scipy.misc.imread("JPh65.png")
# convert to gray image
im = im.mean(axis=-1)
# find peaks
peak = skimage.feature.peak_local_max(im, threshold_rel=0.9, min_distance=10)
# make an image with peaks at 1
peak_im = np.zeros_like(im)
for p in peak:
    peak_im[p[0], p[1]] = 1
# label peaks
peak_label, _ = scipy.ndimage.label(peak_im)
# propagate peak labels with watershed
labels = skimage.morphology.watershed(255 - im, peak_label)
# limit watershed labels to area where the image is intense enough
result = labels * (im > THRESHOLD)
于 2012-10-08T08:31:04.327 に答える