あなたが試みているのは、Otsu thresholding algorithmとよく似ています。その場合、あなたはあなたのデータは強く三峰性であり、大津の方法が十分でない場合には、相手方は、3つのクラスタでkmeans clusteringを適用することであろう
ret, otsu = cv2.threshold(gray_scale_img , 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
を使用することができます。大津の方法とkmeansは、クラス内の分散を最小限に抑えてデータを分類します。コード内:
import numpy as np
from sklearn.cluster import KMeans
# Make trimodal data
# (if image is large, consider downsampling it)
n1 = np.random.normal(80, 10, 200)
n2 = np.random.normal(120, 10, 200)
n3 = np.random.normal(180, 10, 400)
imflat = np.r_[n1, n2, n3]
# shuffle and reshape
np.random.shuffle(imflat)
im = imflat.reshape(-1, 1)
km = KMeans(n_clusters=3, random_state=0).fit(im)
lab = km.labels_
# maxmimum data value in each cluster
[im[np.argwhere(lab==i)].flatten().max() for i in range(3)]
これは、3つのクラスタのどれがヒストグラム内で最高のピークを持つかを特定しません。不完全な解決に対する謝罪。もう1つの提案は、ヒストグラムに6次の多項式を当てはめて、ターニングポイントを見つけることです。
最大ピークを "どのように"調整するかを追加します。あなた自身のコードを多く表示するほど、より良いレスポンスが得られます。そうでなければ、回答は広がり、疑問は広がる –
また、あなたの質問 –
を使って、純粋にnp.argmax(hist)を使って学ぶ人もいます。最大ピーク値は – mDumple