Преобразование Mat в одномерный массив float для EM? - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь преобразовать код Python в Java. Однако я не могу найти способ создать образец для обучения максимизации ожидания, так как он должен быть одноканальной матрицей с 2 ​​значениями (S и V из цветового пространства HSV), как показано ниже:

  • строка 0: S, V
  • строка 1: S, V
  • строка 2: S, V
  • строка 3: S, V

В Python я смог сделать это следующим образом:

def convert_to_samples(image, height, width):
    samples = []
    for y in range(0, height):
        for x in range(0, width):
            samples.append(image[y, x])
    samples = np.float32(np.vstack(samples))
    return samples

Я безуспешно пытался выполнить следующее, так как результат не Mat, и я не могу найти способ превратить его обратно.

public double[][] convert_to_samples(Mat image) {
    double[][] samples = new double[image.height()][];
        for(int i = 0; i < image.height(); i++) {
            for(int j = 0; j < image.width(); j++) {
                samples[i] = image.get(i, j);
            }
        }
    return sortRowWise(samples);
}

private static double[][] sortRowWise(double[][] m) {
    for (double[] values : m) Arrays.sort(values);
    return m;
}

Может ли кто-нибудь помочь мне преобразовать коврик?

1 Ответ

0 голосов
/ 18 февраля 2020
public Mat convert_to_samples(Mat image) {
    double[][] samples = new double[image.height()][];
    for(int i = 0; i < image.height(); i++) {
        for(int j = 0; j < image.width(); j++) {
            samples[i] = image.get(i, j);
        }
    }
    sortRowWise(samples);
    Mat matSamples = new Mat(image.height(), 2, CvType.CV_64FC1);
    for (int i = 0; i < image.height(); i++) {
        matSamples.put(i, 0, samples[i]);
    }
    return matSamples;
}

private static void sortRowWise(double[][] m) {
    for (double[] values : m) Arrays.sort(values);
}
...