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