Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void k_means(){
- Mat_<uchar> dt = imread("./Images/points3.bmp", CV_LOAD_IMAGE_GRAYSCALE);
- Mat img(dt.rows, dt.cols, CV_8UC3, Scalar(255, 255,255));
- std::uniform_int_distribution<int> dis_colors(0, 255);
- const int K = 3;
- int x, y;
- Point2i a;
- vector<Point2i> vec;
- vector<Point2i> centre;
- Vec3b colors[K];
- std::uniform_int_distribution<int> dist_colors(0, 255);
- for (int i = 0; i < K; i++)
- colors[i] = Vec3b(dist_colors(gen), dist_colors(gen), dist_colors(gen));
- for (int i = 0; i < img.rows; i++)
- for (int j = 0; j < img.cols; j++)
- if (dt(i, j) == 0)
- vec.push_back(Point2i(j, i));
- std::uniform_int_distribution<int> dist(0, vec.size());
- for (int i = 0; i < K; i++){
- int idx = dist(gen);
- centre.push_back(vec.at(idx));
- }
- int minx = 100000000, miny = 10000000, minsum = 10000, ab = 0;
- int vx[K], vy[K], vsum[K];
- bool update = true;
- int nrIt = 0;
- while (update){
- for (int i = 0; i < img.rows; i++)
- for (int j = 0; j < img.cols; j++)
- img.at<Vec3b>(i, j) = Vec3b(255,255,255);
- update = false;
- for (int i = 0; i < K; i++)
- {
- vx[i] = 0;
- vy[i] = 0;
- vsum[i] = 0;
- }
- for (int i = 0; i < vec.size(); i++) {
- Point2i crt = vec.at(i);
- int k = 0;
- minsum = 10000000;
- for (Point2i p : centre)
- {
- ab = abs((p.x - crt.x)*(p.x - crt.x) - (p.y - crt.y)*(p.y - crt.y));
- if (minsum > ab)
- {
- minsum = ab;
- img.at<Vec3b>(crt.y, crt.x) = colors[k];
- vx[k] += crt.x;
- vy[k] += crt.y;
- vsum[k]++;
- }
- k++;
- }
- }
- int k = 0;
- for (Point2i &p : centre){
- int help = round(vx[k] / vsum[k]);
- if (p.x != help){
- p.x = help;
- update = true;
- }
- help = round(vy[k] / vsum[k]);
- if (p.y != help){
- p.y = help;
- update = true;
- }
- circle(img, p, 3, Scalar(colors[k]), 3);
- k++;
- }
- imshow("Dest", img);
- waitKey(0);
- }
- imshow("Dest", img);
- waitKey(0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement