2017-01-30 11 views
0

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_) 

답변

1

:

img2=image_array[image_array!=[150,150,150]] 
img2=img2.reshape((len(img2)/3,3)) 

이 목록을 얻을 것입니다 픽셀은 [150,150,150]이 아닙니다.
그러나 이미지 구조를 보존하지 않고 단지 의 픽셀 목록 만 제공합니다. 기억할 수는 없지만 K의 경우 전체 이미지를 제공해야한다는 의미입니다. 즉, 픽셀의 위치를 ​​피드해야합니다. 그러나이 경우 마스킹은 특정 픽셀의 값을 다른 픽셀로 바꿔서 픽셀을 모두 없애지 않으므로 마스킹이 도움이되지 않습니다.

+0

이것은 컬러 클러스터링을 위해 kmeans에 입력으로 잘 작동합니다. 공간 정보 (픽셀 위치)가 사용되지 않으면 인덱싱에 의해 생성 된 픽셀 목록이 좋습니다. – welch

+0

감사합니다. @welch, 확실하지 않았습니다. – Soltius