2016-10-19 1 views
3

Je suis en train d'utiliser dbscan de scikit-learn pour segmenter une image en fonction de la couleur. Les résultats que j'obtiens sont plot of image. Comme vous pouvez le voir il y a 3 groupes. Mon but est de séparer les bouées de l'image en différentes grappes. Mais évidemment, ils apparaissent comme le même groupe. J'ai essayé un large éventail de valeurs eps et min_samples, mais ces deux choses se regroupent toujours. Mon code est:Image non segmentant correctement à l'aide 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() 

Je suppose que cela prend la distance euclidienne et depuis sa distance euclidienne espace laboratoire serait différent entre les différentes couleurs. Si quelqu'un peut me donner des conseils à ce sujet, je l'apprécierais vraiment.

Mise à jour: La réponse ci-dessous fonctionne. Depuis dbscan nécessite un tableau avec pas plus de deux dimensions I concaténés les colonnes de l'image originale et reformé pour produire un n x 5 matrice où n est le temps de dimension X de la dimension y. Cela semble fonctionner pour moi.

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

Répondre

1

Vous devez utiliser à la fois la couleur etla position.

En ce moment, vous utilisez des couleurs seulement.

+0

Merci! Cela semble faire l'affaire. –