2016-10-19 21 views
3

scikitlearnのDBSCANを使用してイメージを色に基づいてセグメント化しようとしています。私が得ている結果はplot of imageです。ご覧のとおり、3つのクラスタがあります。私の目標は、写真のブイを別のクラスターに分けることです。しかし明らかに彼らは同じクラスターとして現れています。私は広範囲のeps値とmin_samplesを試しましたが、それらの2つのものは常に一緒に集まります。私のコードは次のとおりです。イメージは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() 

私は、これはユークリッド距離を取り、そのLab空間におけるユークリッド距離が異なる色の間で異なるだろうので、されると仮定します。誰かが私にこれについての指導を与えることができるなら、私は本当にそれを感謝します。

更新: 以下の回答が有効です。 DBSCANは2次元以上の配列を必要とするため、元のイメージに列を連結し、n×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

ありがとうございます!それはトリックを行うようだ。 –

関連する問題