2016-11-11 6 views
-3

Ich würde gerne Pixel-Klassifizierung auf RGB-Bildern basierend auf Eingabe Trainingsbeispiele der angegebenen Anzahl von Klassen durchführen. So habe ich z.B. 4 Klassen, die Pixel (r, g, b) enthalten, ist das Ziel, das Bild in vier Phasen zu segmentieren.Maximale Wahrscheinlichkeit Pixel-Klassifizierung in Python opencv

Ich habe festgestellt, dass Python opencv2 den Expectation Maximization-Algorithmus hat, der die Aufgabe erfüllen könnte. Leider habe ich kein Tutorial oder Material gefunden, das mir (seit ich Anfänger bin) erklären kann, wie man mit dem Algorithmus arbeitet.

Können Sie bitte irgendeine Art von Tutorial vorschlagen, die als Ausgangspunkt verwendet werden kann?

Update ... ein weiterer Ansatz für den Code unten: G O_o gle:

**def getsamples(img): 
    x, y, z = img.shape 
    samples = np.empty([x * y, z]) 
    index = 0 
    for i in range(x): 
     for j in range(y): 
      samples[index] = img[i, j] 
      index += 1 
    return samples 
def EMSegmentation(img, no_of_clusters=2): 
    output = img.copy() 
    colors = np.array([[0, 11, 111], [22, 22, 22]]) 
    samples = getsamples(img) 
    #em = cv2.ml.EM_create() 
    em = cv2.EM(no_of_clusters) 
    #em.setClustersNumber(no_of_clusters) 
    #em.trainEM(samples) 
    em.train(samples) 
    x, y, z = img.shape 
    index = 0 
    for i in range(x): 
     for j in range(y): 

      result = em.predict(samples[index])[0][1] 
      #print(result) 
      output[i][j] = colors[result] 
      index = index + 1 
    return output 
img = cv2.imread('00.jpg') 
smallImg = small = cv2.resize(img, (0,0), fx=0.5, fy=0.5) 
output = EMSegmentation(img) 
smallOutput = cv2.resize(output, (0,0), fx=0.5, fy=0.5) 
cv2.imshow('image', smallImg) 
cv2.imshow('EM', smallOutput) 
cv2.waitKey(0) 
cv2.destroyAllWindows()** 
+1

Kurz Python. Long: Google "Erwartungsmaximierungsalgorithmus". Sobald Sie genug Informationen über das Konzept haben, googlen Sie dies: "Erwartungsmaximierungsalgorithmus opencv". Beachten Sie, dass opencv eine Bibliothek und kein Buch ist. Sie müssen die Techniken aus Forschungspapier, Büchern, Wiki oder jeder Quelle, mit der Sie sich am wohlsten fühlen, studieren. Grund für den Downvote: - Ich habe beim ersten Versuch mehrere Tutorials gefunden. Wenn Sie immer noch in Schwierigkeiten sind, googeln Sie auf youtube und Sie werden Video-Tutorials derselben finden. – saurabheights

+0

suchen Sie die entsprechende Funktion zwischen opencv 2.4.x und 3.0, für meinen Code als Quelle verwenden: https://subukita.com/2014/03/24/image-segmentierung-using-opencvs-expectation-maximization/ – eyllanesc

Antwort

1

convert C++ source

enter image description here

import cv2 
import numpy as np 


def getsamples(img): 
    x, y, z = img.shape 
    samples = np.empty([x * y, z]) 
    index = 0 
    for i in range(x): 
     for j in range(y): 
      samples[index] = img[i, j] 
      index += 1 
    return samples 


def EMSegmentation(img, no_of_clusters=2): 
    output = img.copy() 
    colors = np.array([[0, 11, 111], [22, 22, 22]]) 
    samples = getsamples(img) 
    em = cv2.ml.EM_create() 
    em.setClustersNumber(no_of_clusters) 
    em.trainEM(samples) 
    means = em.getMeans() 
    covs = em.getCovs() # Known bug: https://github.com/opencv/opencv/pull/4232 
    x, y, z = img.shape 
    distance = [0] * no_of_clusters 
    for i in range(x): 
     for j in range(y): 
      for k in range(no_of_clusters): 
       diff = img[i, j] - means[k] 
       distance[k] = abs(np.dot(np.dot(diff, covs[k]), diff.T)) 
      output[i][j] = colors[distance.index(max(distance))] 
    return output 


img = cv2.imread('dinosaur.jpg') 
output = EMSegmentation(img) 
cv2.imshow('image', img) 
cv2.imshow('EM', output) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 
+0

Vielen Dank für die Hilfe! – Kristan

+0

Marke als die richtige Lösung: D – eyllanesc

+0

Könnten Sie mir bitte sagen, welche Opencv-Version verwenden Sie? Ich habe 2.4.13 und es scheint, dass es z. getMeans(). – Kristan