2016-10-19 5 views
3

scikitlearn의 DBSCAN을 사용하여 색상 기반의 이미지를 분할하려고합니다. 결과는 plot of image입니다. 보시다시피 3 개의 클러스터가 있습니다. 내 목표는 그림의 부표를 다른 클러스터로 분리하는 것입니다. 그러나 분명히 그들은 같은 클러스터로 나타나고 있습니다. 광범위한 eps 값과 min_samples를 시도했지만이 두 가지는 항상 함께 묶입니다. 내 코드는 다음과 같습니다이미지가 DBSCAN을 사용하여 올바르게 분할되지 않음

img= cv2.imread("buoy1.jpg) 
labimg = cv2.cvtColor(img, cv2.COLOR_BGR2LAB) 

n = 0 
while(n<4): 
    labimg = cv2.pyrDown(labimg) 
    n = n+1 

feature_image=np.reshape(labimg, [-1, 3]) 
rows, cols, chs = labimg.shape 

db = DBSCAN(eps=5, min_samples=50, metric = 'euclidean',algorithm ='auto') 
db.fit(feature_image) 
labels = db.labels_ 

plt.figure(2) 
plt.subplot(2, 1, 1) 
plt.imshow(img) 
plt.axis('off') 
plt.subplot(2, 1, 2) 
plt.imshow(np.reshape(labels, [rows, cols])) 
plt.axis('off') 
plt.show() 

나는이 유클리드 거리를 복용하고 실험실에서 공간 유클리드 거리가 서로 다른 색상과 다를 것이기 때문입니다 가정합니다. 누구든지 나에게 이것에 대한 지침을 줄 수 있다면 정말 고맙겠습니다.

업데이트 : 아래 답변은 작동합니다. DBSCAN은 2 차원 이하의 배열을 필요로하기 때문에 원본 이미지에 열을 연결하고 n x 5 차원 행렬을 생성하기 위해 재구성되었습니다. 여기서 n은 x 차원과 y 차원의 곱입니다. 이것은 나를 위해 작동하는 것 같다.

indices = np.dstack(np.indices(img.shape[:2])) 
xycolors = np.concatenate((img, indices), axis=-1) 
np.reshape(xycolors, [-1,5]) 

답변

1

당신은 색상 모두와 위치를 사용해야합니다.

지금은 색상 만 사용하고 있습니다.

+0

감사합니다. 그 트릭을 할 것으로 보인다. –

관련 문제