Advertisement
Guest User

Untitled

a guest
Nov 20th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.41 KB | None | 0 0
  1. struct punct{
  2. Point p;
  3. int color;
  4. };
  5.  
  6. void KMeansClustering_labo06_setOfPoints( const int K) {
  7. //obtain rgb image from original image
  8. Mat srcImg = imread("Images_Kmeans/points2.bmp", CV_LOAD_IMAGE_GRAYSCALE);
  9. Mat srcImgRgb(srcImg.size(), CV_8UC3);
  10. cvtColor(srcImg, srcImgRgb, CV_GRAY2RGB);
  11.  
  12. const int height = srcImgRgb.rows;
  13. const int width = srcImgRgb.cols;
  14. //generate random colors
  15. std::default_random_engine gen;
  16. gen.seed(time(NULL));
  17. std::uniform_int_distribution<int> dist_img(0, 255);
  18. Vec3b *colors = (Vec3b*)malloc(K*sizeof(Vec3b));
  19.  
  20. for (int i = 0; i < K; i++){
  21. colors[i] = { (uchar)dist_img(gen), (uchar)dist_img(gen), (uchar)dist_img(gen) };
  22. }
  23. //initialize k centers
  24. std::vector<Point> points;
  25. int pointsCounter = 0;
  26. for (int i = 0; i < height; i++){
  27. for (int j = 0; j < width; j++){
  28. if (srcImg.at<uchar>(i, j) == 0){
  29. Point newPoint(i, j);
  30. points.push_back(newPoint);
  31. pointsCounter++;
  32. }
  33. }
  34. }
  35.  
  36. Point *m = (Point*)malloc(K*sizeof(Point));
  37. Point *m_new = (Point*)calloc(K,sizeof(Point));
  38. std::uniform_int_distribution<int> points_distribution(0, pointsCounter-1);
  39. for (int i = 0; i < K; i++){
  40. m[i] = points.at((int)points_distribution(gen));
  41. std::cout << m[i].x << " " << m[i].y << "\n";
  42. }
  43.  
  44.  
  45.  
  46. float *distances = (float*)malloc(K*sizeof(float));
  47. punct *puncte = (punct*)malloc(pointsCounter*sizeof(punct));
  48. bool changed = true;
  49.  
  50. while(changed) {
  51. //Assignment
  52. for (int i = 0; i < pointsCounter;i++){
  53. for (int k = 0; k < K; k++) {
  54. distances[k] = sqrt(((m[k].x - points[i].x) * (m[k].x - points[i].x)) + ((m[k].y - points[i].y) * (m[k].y - points[i].y)));
  55. }
  56. puncte[i].color = getMinimumElementIndex(distances, K);
  57. puncte[i].p = points.at(i);
  58. }
  59.  
  60. //vectors used to update centers
  61. int*sumX = (int*)malloc(K*sizeof(int));
  62. int*sumY = (int*)malloc(K*sizeof(int));
  63. int*numerOfPoints = (int*)malloc(K*sizeof(int));
  64. for (int c = 0; c < K; c++){
  65. sumX[c] = 0;
  66. sumY[c] = 0;
  67. numerOfPoints[c] = 0;
  68. }
  69.  
  70. //Update
  71. for (int i = 0; i < pointsCounter; i++){
  72. sumX[puncte[i].color] += puncte[i].p.x;
  73. sumY[puncte[i].color] += puncte[i].p.y;
  74. numerOfPoints[puncte[i].color]++;
  75. }
  76. for (int c = 0; c < K; c++) {
  77. m[c].x = sumX[c] / numerOfPoints[c];
  78. m[c].y = sumY[c] / numerOfPoints[c];
  79. }
  80. //check if assignment function produced new centers
  81. changed = false;
  82. for (int v = 0; v < K; v++){
  83. if (m[v].x != m_new[v].x || m[v].y != m_new[v].y){
  84. changed = true;
  85. }
  86. }
  87. for (int cnt = 0; cnt < K; cnt++){
  88. m_new[cnt] = m[cnt];
  89. }
  90. }
  91. Mat voronoi = srcImgRgb.clone();
  92. for (int i = 0; i < pointsCounter;i++){
  93. srcImgRgb.at<Vec3b>(puncte[i].p.x, puncte[i].p.y) = colors[puncte[i].color];
  94. }
  95. for (int i = 0; i < height; i++){
  96. for (int j = 0; j < width; j++){
  97. for (int k = 0; k < K; k++){
  98. distances[k] = sqrt(((m[k].x - i) * (m[k].x - i) + ((m[k].y - j) * (m[k].y - j))));
  99. }
  100. voronoi.at<Vec3b>(i, j) = colors[getMinimumElementIndex(distances,K)];
  101. }
  102. }
  103.  
  104. imshow("result", srcImgRgb);
  105. imshow("voroni_mozaicare", voronoi);
  106. waitKey(0);
  107. }
  108.  
  109. void KMeansClustering_lab06_RGB(int noOfIterations) {
  110. Mat srcImg = imread("images_Kmeans/img01.jpg", CV_LOAD_IMAGE_COLOR);
  111. const int height = srcImg.rows;
  112. const int width = srcImg.cols;
  113. Mat rez = Mat(height, width, CV_8UC3);
  114. //generate centers
  115. std::default_random_engine gen;
  116. std::uniform_int_distribution<int> dist_img(0, 255);
  117. const int K = 10;
  118. Vec3b m[K];
  119.  
  120. for (int i = 0; i < K; i++) {
  121. m[i][0] = dist_img(gen);
  122. m[i][1] = dist_img(gen);
  123. m[i][2] = dist_img(gen);
  124. }
  125.  
  126. Mat L = Mat(height, width, CV_8UC1);
  127. Mat newL = Mat(height, width, CV_8UC1);
  128. float distances[K];
  129. for (int count = 0; count < noOfIterations; count++) {
  130. //Assignment function
  131. for (int i = 0; i < height; i++) {
  132. for (int j = 0; j < width; j++) {
  133. for (int k = 0; k < K; k++) {
  134. distances[k] = sqrt(
  135. ((m[k][0] - srcImg.at<Vec3b>(i, j)[0]) * (m[k][0] - srcImg.at<Vec3b>(i, j)[0])) +
  136. ((m[k][1] - srcImg.at<Vec3b>(i, j)[1]) * (m[k][1] - srcImg.at<Vec3b>(i, j)[1])) +
  137. ((m[k][2] - srcImg.at<Vec3b>(i, j)[2]) * (m[k][2] - srcImg.at<Vec3b>(i, j)[2]))
  138. );
  139. }
  140. L.at<uchar>(i, j) = getMinimumElementIndex(distances, K);
  141. }
  142. }
  143. if (count > 0) {
  144. //check if assignment function produced new results
  145. bool isEqual = (sum(L != newL) == Scalar(0, 0, 0));
  146. if (isEqual == true) {
  147. std::cout << "assignent function produced same results at iteration: " << count;
  148. break;
  149. }
  150.  
  151. }
  152. //update centers
  153. int sumsR[K];
  154. int sumsG[K];
  155. int sumsB[K];
  156. int noOfPoints[K];
  157. for (int i = 0; i < K; i++) {
  158. sumsR[i] = 0;
  159. sumsG[i] = 0;
  160. sumsB[i] = 0;
  161. noOfPoints[i] = 0;
  162. }
  163.  
  164. for (int i = 0; i < height; i++) {
  165. for (int j = 0; j < width; j++) {
  166. sumsB[L.at<uchar>(i, j)] += srcImg.at<Vec3b>(i, j)[0];
  167. sumsG[L.at<uchar>(i, j)] += srcImg.at<Vec3b>(i, j)[1];
  168. sumsR[L.at<uchar>(i, j)] += srcImg.at<Vec3b>(i, j)[2];
  169. noOfPoints[L.at<uchar>(i, j)]++;
  170. }
  171. }
  172. for (int c = 0; c < K; c++) {
  173. if (noOfPoints[c] > 0) {
  174. m[c][0] = sumsB[c] / noOfPoints[c];
  175. m[c][1] = sumsG[c] / noOfPoints[c];
  176. m[c][2] = sumsR[c] / noOfPoints[c];
  177. }
  178. }
  179. L.copyTo(newL);
  180. }
  181. for (int i = 0; i < height; i++) {
  182. for (int j = 0; j < width; j++) {
  183. rez.at<Vec3b>(i, j) = m[L.at<uchar>(i, j)];
  184. }
  185. }
  186. imshow("color", rez);
  187. waitKey(0);
  188. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement