2016-11-11 11 views
-3

与えられた数のクラスの入力トレーニングサンプルに基づいてRGB画像のピクセル分類を行いたいと思います。だから私は持っている。 4つのクラスにはピクセル(r、g、b)が含まれているため、目的は画像を4つのフェーズに分割することです。python opencvの最尤ピクセル分類

python opencv2には、ジョブを実行できるExpectation maximizationアルゴリズムがあることがわかりました。しかし残念なことに、私は(私は初心者であるので)アルゴリズムについての作業方法を教えてくれるチュートリアルや資料は見つけられませんでした。

出発点として使用できる任意のチュートリアルを提案してください。

更新...以下のコードのための別のアプローチ:

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

をPythonのためにC++に変換する:G O_OのGLE。長い:Googleの "期待最大化アルゴリズム"。一度あなたはコンセプトに関する十分な情報を持っていれば、これをgoogleにしてください: "Expectation maximization algorithm opencv"。 opencvはライブラリであり、本ではありません。研究論文、書籍、wiki、またはあなたが最も気楽に使っている資料から技術を勉強する必要があります。原因をdownvote: - 私は最初の試しで複数のチュートリアルを見つけた。まだ困っている場合は、YouTubeで同じgoogleと同じビデオチュートリアルがあります。 – saurabheights

+0

opencv 2.4.xと3.0の間の同等の機能を検索します。私のコードをソースとして使用する:https://subokita.com/2014/03/24/image-segmentation-using-opencvs-expectation-maximization/ – eyllanesc

答えて

1

は要するに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

関連する問題