Advertisement
Guest User

Untitled

a guest
Nov 20th, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.93 KB | None | 0 0
  1. void k_means(){
  2.  
  3.  
  4. Mat_<uchar> dt = imread("./Images/points3.bmp", CV_LOAD_IMAGE_GRAYSCALE);
  5. Mat img(dt.rows, dt.cols, CV_8UC3, Scalar(255, 255,255));
  6. std::uniform_int_distribution<int> dis_colors(0, 255);
  7.  
  8. const int K = 3;
  9. int x, y;
  10. Point2i a;
  11. vector<Point2i> vec;
  12. vector<Point2i> centre;
  13.  
  14. Vec3b colors[K];
  15. std::uniform_int_distribution<int> dist_colors(0, 255);
  16. for (int i = 0; i < K; i++)
  17. colors[i] = Vec3b(dist_colors(gen), dist_colors(gen), dist_colors(gen));
  18.  
  19. for (int i = 0; i < img.rows; i++)
  20. for (int j = 0; j < img.cols; j++)
  21. if (dt(i, j) == 0)
  22. vec.push_back(Point2i(j, i));
  23.  
  24. std::uniform_int_distribution<int> dist(0, vec.size());
  25. for (int i = 0; i < K; i++){
  26. int idx = dist(gen);
  27. centre.push_back(vec.at(idx));
  28. }
  29.  
  30.  
  31. int minx = 100000000, miny = 10000000, minsum = 10000, ab = 0;
  32. int vx[K], vy[K], vsum[K];
  33.  
  34. bool update = true;
  35. int nrIt = 0;
  36. while (update){
  37. for (int i = 0; i < img.rows; i++)
  38. for (int j = 0; j < img.cols; j++)
  39. img.at<Vec3b>(i, j) = Vec3b(255,255,255);
  40.  
  41. update = false;
  42. for (int i = 0; i < K; i++)
  43. {
  44. vx[i] = 0;
  45. vy[i] = 0;
  46. vsum[i] = 0;
  47. }
  48. for (int i = 0; i < vec.size(); i++) {
  49. Point2i crt = vec.at(i);
  50. int k = 0;
  51. minsum = 10000000;
  52. for (Point2i p : centre)
  53. {
  54.  
  55. ab = abs((p.x - crt.x)*(p.x - crt.x) - (p.y - crt.y)*(p.y - crt.y));
  56. if (minsum > ab)
  57. {
  58. minsum = ab;
  59. img.at<Vec3b>(crt.y, crt.x) = colors[k];
  60.  
  61. vx[k] += crt.x;
  62. vy[k] += crt.y;
  63. vsum[k]++;
  64. }
  65. k++;
  66. }
  67. }
  68. int k = 0;
  69. for (Point2i &p : centre){
  70. int help = round(vx[k] / vsum[k]);
  71. if (p.x != help){
  72. p.x = help;
  73. update = true;
  74. }
  75. help = round(vy[k] / vsum[k]);
  76. if (p.y != help){
  77. p.y = help;
  78. update = true;
  79. }
  80. circle(img, p, 3, Scalar(colors[k]), 3);
  81. k++;
  82. }
  83.  
  84.  
  85. imshow("Dest", img);
  86. waitKey(0);
  87.  
  88. }
  89. imshow("Dest", img);
  90. waitKey(0);
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement