2016-11-11 7 views
-3

Я хотел бы выполнить классификацию пикселей на изображениях RGB на основе исходных образцов обучения заданного количества классов. Так что у меня есть, например. 4 класса, содержащие пиксели (r, g, b), таким образом, цель состоит в том, чтобы сегментировать изображение на четыре фазы.Классификация пикселов максимального правдоподобия в python opencv

Я обнаружил, что python opencv2 имеет алгоритм максимизации ожиданий, который мог бы выполнять эту работу. Но, к сожалению, я не нашел никакого учебника или материала, который мог бы объяснить мне (поскольку я начинаю), как работать с алгоритмом.

Не могли бы вы предложить какой-либо учебник, который можно использовать в качестве отправной точки?

Update ... другой подход для кода ниже:

**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

Короче говоря: G O_o ственный. Long: Google «Алгоритм максимизации ожиданий». Как только у вас будет достаточно информации о концепции, выполните следующие действия: «Алгоритм максимизации ожиданий opencv». Обратите внимание: opencv - это библиотека, а не книга. Вам необходимо изучить методы из исследовательской статьи, книг, вики или любого источника, с которым вам наиболее удобно. Причина для downvote: - Сначала я нашел несколько обучающих программ. Если все еще в беде, google же на youtube, и вы найдете видео-уроки того же самого. – saurabheights

+0

поиск эквивалентной функции между opencv 2.4.x и 3.0, для использования моего кода в качестве источника: https://subokita.com/2014/03/24/image-segmentation-using-opencvs-expectation-maximization/ – eyllanesc

ответ

1

новообращенного C++ в Python 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

Благодарим вас за помощь! – Kristan

+0

Бренд как правильное решение: D – eyllanesc

+0

Не могли бы вы рассказать мне, какую версию opencv вы используете? У меня 2.4.13, и кажется, что он не может позвонить, например. getMeans(). – Kristan

 Смежные вопросы

  • Нет связанных вопросов^_^