K-средства и EM алгоритмы

Как я могу реализовать K-средства & EM алгоритмы без вызова функций openCV для сегментации изображения?

Я начинаю с этого кода:

#include opencv2/highgui/highgui.hpp
#include iostream

using namespace cv;
using namespace std;

int main()
{
Mat img = imread("testImage.png", 0);
Mat label_img;
label_img.create(img.cols, img.rows, CV_8UC1);
}

Как я могу продолжить?

-2

Решение

K-средства работают очень просто, повторяя два шага до сходимости, E-шаг и M-шаг.

Инициализация:

Назначьте каждый пиксель случайным образом одному из k кластеры. То есть для каждой записи в вашем label_img выбрать номер [0..k-1] случайно.

Ожидание (E-шаг)

учитывая назначение пикселей для кластеров (label_img), вы можете вычислить центр каждого кластера (просто среднее значение пикселей, назначенных этому кластеру).
В конце этого этапа вы будете иметь k векторы, указывающие на центры вашего k кластеры.

Максимизация (М-шаг)

Когда у вас есть k кластеры, вы рассчитываете расстояние каждого пикселя до k центры и назначить его (путем изменения соответствующей записи в label_img) к центру, ближайшему к пикселю.
В конце этого этапа у вас будет новое назначение каждого пикселя кластерам (новые значения label_img)

Вам нужно повторить эти два шага, пока label_img больше не изменяется или если вы превысите заранее определенное количество итераций.

0

Другие решения

include <opencv2/highgui/highgui.hpp>
include <iostream>

using namespace cv;
using namespace std;

void kmeans(const Mat frame, Mat label) {
}

void em(const Mat frame, const Mat label, Mat new_label) {
}

void main()
{
Mat frame;
Mat label_img;
Mat em_label;

frame = imread("testImage.png", 0);

kmeans(frame, label_img);

em(frame, label_img, em_label);
label_img.create(frame.cols, frame.rows, CV_8UC1);

label_img.ptr<float>(25)[30] = 0;
label_img.ptr<float>(25)[31] = 255;

}
0