Как я могу реализовать 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);
}
Как я могу продолжить?
K-средства работают очень просто, повторяя два шага до сходимости, E-шаг и M-шаг.
Назначьте каждый пиксель случайным образом одному из k
кластеры. То есть для каждой записи в вашем label_img
выбрать номер [0..k-1]
случайно.
учитывая назначение пикселей для кластеров (label_img
), вы можете вычислить центр каждого кластера (просто среднее значение пикселей, назначенных этому кластеру).
В конце этого этапа вы будете иметь k
векторы, указывающие на центры вашего k
кластеры.
Когда у вас есть k
кластеры, вы рассчитываете расстояние каждого пикселя до k
центры и назначить его (путем изменения соответствующей записи в label_img
) к центру, ближайшему к пикселю.
В конце этого этапа у вас будет новое назначение каждого пикселя кластерам (новые значения label_img
)
Вам нужно повторить эти два шага, пока label_img
больше не изменяется или если вы превысите заранее определенное количество итераций.
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;
}