K- 평균 클러스터링을 사용하여 여러 이미지의 3 가지 주요 색을 찾으려고합니다. 내가 직면하고있는 문제는 K-means가 이미지 배경을 클러스터링한다는 것입니다. Python 2.7 및 OpenCV 3을 사용하고 있습니다.K- 색 클러스터링을 의미합니다. 마스크 된 numpy 배열이있는 배경 픽셀을 생략합니다.
모든 이미지의 RGB 배경색은 150,150,150입니다. K-means가 배경색을 클러스터링하는 것을 피하기 위해 원본 이미지 배열에서 '150'픽셀 값을 모두 마스크하는 마스크 된 배열을 만들었습니다. 이론적으로 K-Means가 작업 할 배열에 배경이 아닌 픽셀 만 남겨 둡니다. 그러나 스크립트를 실행할 때 여전히 회색이 지배적 인 색상 중 하나로 반환됩니다.
내 질문 : 가면을 배열하는 방법입니다 (내가 잘못 했습니까) 아니면 K- 평균 클러스터링에서 픽셀을 제외시키는 더 나은 대안이 있습니까?
찾아주세요 아래에있는 내 코드 : 당신이 당신의 배경 이외의 픽셀의 값을 추출 할 경우, 지수화를 NumPy와 사용할 수 있습니다
from sklearn.cluster import KMeans
from sklearn import metrics
import cv2
import numpy as np
def centroid_histogram(clt):
numLabels = np.arange(0, len(np.unique(clt.labels_)) + 1)
(hist, _) = np.histogram(clt.labels_, bins=numLabels)
hist = hist.astype("float")
hist /= hist.sum()
return hist
image = cv2.imread("test1.jpg")
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
h, w, _ = image.shape
w_new = int(100 * w/max(w, h))
h_new = int(100 * h/max(w, h))
image = cv2.resize(image, (w_new, h_new))
image_array = image.reshape((image.shape[0] * image.shape[1], 3))
image_array = np.ma.masked_values(image_array,150)
clt = KMeans(n_clusters=3)
clt.fit(image_array)
hist = centroid_histogram(clt)
zipped = zip(hist, clt.cluster_centers_)
zipped.sort(reverse=True, key=lambda x: x[0])
hist, clt.cluster_centers = zip(*zipped)
print(clt.cluster_centers_)
이것은 컬러 클러스터링을 위해 kmeans에 입력으로 잘 작동합니다. 공간 정보 (픽셀 위치)가 사용되지 않으면 인덱싱에 의해 생성 된 픽셀 목록이 좋습니다. – welch
감사합니다. @welch, 확실하지 않았습니다. – Soltius