0

的两个部分我有那种图像独立的图像作为在python

Image1 Image2

如图所示的图像,图像主要有两个部分。 上下。

我想分开它们。

在第一次尝试中,我实现了使用K-meas算法。

In[2]: kmeans = KMeans(n_clusters=2, random_state=0).fit(... np.asarray(np.where(finalImage == 255)).T)

正是在此搜索案例工程是上下有圆点的几乎相同。但是,是不是工作在影像2

后比我用cv2.findContours以获得最大的区域2个轮廓

im, contours, hierarchy = cv2.findContours(Img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) 

    # get first contour 
    maxContour = 0 
    for contour in contours: 
     contourSize = cv2.contourArea(contour) 
     if contourSize > maxContour: 
      maxContour = contourSize 
      maxContourData0 = contour 

    # get second contour 
    if contours.__len__() != 1: 
     maxContour = 0 
     for contour in contours: 
      contourSize = cv2.contourArea(contour) 
      if contourSize > maxContour and np.sum(np.subtract(contour[0:5],maxContourData0[0:5])) != 0: 
       maxContour = contourSize 
       maxContourData1 = contour 

    mask = np.zeros_like(Img) 
    cv2.fillPoly(mask, [maxContourData0], 1) 
    if contours.__len__() != 1: 
     cv2.fillPoly(mask, [maxContourData1], 1) 

    finalImage = np.zeros_like(Img) 
    finalImage[:, :] = np.multiply(Img, mask) 

    cv2.imshow('final', finalImage) 
    cv2.waitKey(0) 

但有时去一个轮廓不是2 ...

强制性地有没有得到两个blob

+0

如果斑点的实际尺寸并不重要,但只有相对大小,你可以尝试在提取斑点之前应用腐蚀,它可能有助于消除两个斑点之间的连接。 – Mathias

回答

0

您可以尝试和使用connectedComponents,但请注意,您应该设置connectivity = 4而不是8作为默认设置。

+0

连接性的含义是什么? –

+0

@JungseokCho连接定义了底层网格图的构建方式:8连接意味着每个像素连接到它的所有8个邻居,而4连接意味着一个像素仅连接到上面的四个像素,低于其最小值这是对的。 – Shai

+0

请注意,在您的示例中的两个段“对角”互相接触:即它们被认为与8-连接相连,但是考虑到4连接而分开 – Shai

0

如果您不介意运行时间,您可以尝试谱聚类。

K-means对此问题不起作用,因为它隐含地假定聚类是球形的,而谱聚类更关心连通性。坏消息是它比K-means慢得多。

下面是我的实现使用sklearn.cluster.SpectralClustering

t0 = time.time() 
spectral = cluster.SpectralClustering(n_clusters=2, affinity='rbf', n_init=3) 
spectral.fit(pts) 
t1 = time.time() 
print(t1-t0) 

输出:

19.5850000381 

enter image description here

+0

谢谢,输出值单位是秒?或msec? –

+0

@JungseokCho这是在几秒钟内。 – Yiroro

+0

光谱聚类已经证明了不同尺度的聚类问题。您应该在示例中仔细使用它。 – Shai