0

Ich habe diese Art von BildernSeparate Bild als zwei Teil in Python

Image1 Image2

Wie Bilder dargestellt, Bild hauptsächlich einen zweiteiliges hat. oberen und unteren.

Ich möchte sie trennen.

Im ersten Versuch implementiert ich mit K-Meas-Algorithmen.

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

Es ist Werke auf Image1 Fälle, die obere und die untere eine fast gleiche Menge von Punkten haben. Aber wird funktioniert nicht bei Bild 2.

Nachdem ich als cv2.findContours verwendenmaximale Fläche 2 Konturen zu bekommen

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) 

Aber es geht manchmal eine Kontur nicht 2 ...

gibt es irgendwelche zwei blob zwanghaft zu bekommen?

+0

Wenn die tatsächliche Größe der Kleckse nicht von Bedeutung ist, sondern nur die relative Größe, könnten Sie Versuchen Sie, Erosion anzuwenden, bevor Sie die Blobs extrahieren. Dies könnte helfen, die Verbindung zwischen den beiden Blobs zu entfernen. – Mathias

Antwort

0

Sie können connectedComponents versuchen und verwenden, aber beachten Sie, dass Sie connectivity = 4 und nicht 8 als Standard festlegen sollten.

+0

Was bedeutet Konnektivität? –

+0

@JungseokCho Connectivity definiert die Art und Weise, wie der zugrundeliegende Gittergraph aufgebaut ist: 8-connect bedeutet, dass jedes Pixel mit allen 8 Nachbarn verbunden ist. 4-connect bedeutet, dass ein Pixel nur mit den vier Pixeln oben und unten verbunden ist es ist richtig. – Shai

+0

Beachten Sie, dass die beiden Segmente in Ihrem Beispiel einander "diagonal" berühren: das heißt, sie werden als 8-Verbindung betrachtet, sind aber getrennt unter Berücksichtigung von 4-Verbindung – Shai

0

Wenn Sie die Laufzeit nicht stören, können Sie spektrale Clustering versuchen.

K-Means funktioniert nicht für dieses Problem, da es implizit davon ausgeht, dass die Cluster sphärisch sind, während spektrales Clustering mehr über Konnektivität kümmert. Die schlechte Nachricht ist, dass es viel langsamer als K-bedeutet.

unten meine Implementierung mit 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) 

Ausgang:

19.5850000381 

enter image description here

+0

Danke, die Ausgabewerteinheit ist sek? oder msec? –

+0

@ JungseokCho Es ist in Sekunden. – Yiroro

+0

Das spektrale Clustering hat sich bei Clustern verschiedener Skalen bewährt. Sie sollten es vorsichtig in Ihren Beispielen verwenden. – Shai

Verwandte Themen