使用 DBSCAN 无法正确分割图像

问题描述 投票:0回答:2

我正在尝试使用 scikitlearn 中的 DBSCAN 根据颜色分割图像。 我得到的结果是plot of image。正如您所看到的,有 3 个簇。 我的目标是将图中的浮标分成不同的簇。但显然它们显示为同一个集群。我尝试了各种 eps 值和 min_samples 但这两件事总是聚集在一起。我的代码是:

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])
opencv scikit-learn computer-vision image-segmentation dbscan
2个回答
5
投票

您需要同时使用颜色和位置

现在,您仅使用颜色。


5
投票
您可以在答案中添加完整代码吗?我无法理解在哪里添加对你有用的那三行 – user8306074 Sep 4 at 8:58

让我来回答你,这是完整版代码:

import numpy as np import cv2 import matplotlib.pyplot as plt from sklearn.cluster import DBSCAN img= cv2.imread('your image') 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_ indices = np.dstack(np.indices(labimg.shape[:2])) xycolors = np.concatenate((labimg, indices), axis=-1) feature_image2 = np.reshape(xycolors, [-1,5]) db.fit(feature_image2) labels2 = 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.subplot(2, 1, 2) plt.imshow(np.reshape(labels2, [rows, cols])) plt.axis('off') plt.show()
    
© www.soinside.com 2019 - 2024. All rights reserved.