Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.27 KB | None | 0 0
  1. void drawLabels(){
  2. char fname[MAX_PATH];
  3. while (openFileDlg(fname))
  4. {
  5. Mat src = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
  6. Mat dest = Mat(src.size(), CV_8UC3);
  7. int label = 0;
  8. Mat tLabels = Mat::zeros(src.size(), CV_8UC1);
  9.  
  10.  
  11. for (int i = 1; i < tLabels.rows - 1; i++){
  12. for (int j = 1; j < tLabels.cols - 1; j++){
  13. if (src.at<uchar>(i, j) == 0 && tLabels.at<uchar>(i, j) == 0){
  14. label++;
  15. std::queue<Point> Q;
  16. Point p = Point(i, j);
  17. tLabels.at<uchar>(i, j) = label;
  18. Q.push(p);
  19. while (!Q.empty()){
  20. Point q = Q.front();
  21. Q.pop();
  22. for (int k = q.x - 1; k <= q.x + 1; k++){ //pt fiecare vecin din N8
  23. for (int l = q.y - 1; l <= q.y + 1; l++){
  24. Point vecin = Point(k, l);
  25. if (src.at<uchar>(vecin.x, vecin.y) == 0 && tLabels.at<uchar>(vecin.x, vecin.y) == 0 && k != q.x&&l != q.y){
  26. tLabels.at<uchar>(vecin.x, vecin.y) = label;
  27. Q.push(vecin);
  28. }
  29. }
  30. }
  31. }
  32. }
  33. }
  34. }
  35.  
  36. Vec3b * culori = (Vec3b*)malloc((label + 1)*sizeof(Vec3b));
  37. for (int i = 1; i <= label; i++){
  38. unsigned char R = rand() % 255;
  39. unsigned char G = rand() % 255;
  40. unsigned char B = rand() % 255;
  41. culori[i] = Vec3b(B, G, R);
  42. }
  43. for (int i = 0; i < tLabels.rows; i++){
  44. for (int j = 0; j < tLabels.cols; j++)
  45. {
  46. int pozVec = tLabels.at<uchar>(i, j);
  47. if (pozVec == 0){
  48. dest.at<Vec3b>(i, j) = Vec3b(255, 255, 255);
  49. }
  50. else{
  51. dest.at<Vec3b>(i, j) = culori[pozVec];
  52. }
  53. }
  54. }
  55.  
  56. imshow("src image", src);
  57. imshow("dest image", dest);
  58. waitKey(0);
  59. }
  60. }
  61. uchar minnn(vector<uchar> L){
  62.  
  63. uchar mic = L[0];
  64. for (int i = 0; i <L.size(); i++)
  65. {
  66. if (L[i]<mic)
  67. mic = L[i];
  68. }
  69. return mic;
  70. }
  71. void traversalTwoPass(){
  72.  
  73. char fname[MAX_PATH];
  74. while (openFileDlg(fname))
  75. {
  76. Mat img = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
  77. imshow("src", img);
  78.  
  79. int label = 0;
  80. Mat labelMat = Mat(img.size(), CV_8UC1); //labels
  81.  
  82. for (int i = 0; i < img.rows; i++){
  83. for (int j = 0; j < img.cols; j++){
  84. labelMat.at<uchar>(i, j) = 0;
  85. }
  86. }
  87.  
  88. std::queue<Point2i> myqueue;
  89.  
  90. vector<vector<int>> edges(10);
  91.  
  92. for (int i = 1; i < img.rows-1; i++){
  93. for (int j = 1; j < img.cols-1; j++){
  94. if (img.at<uchar>(i, j) == 0 && labelMat.at<uchar>(i, j) == 0){
  95.  
  96. vector<uchar> L;
  97.  
  98. int di[4] = { -1, 0, 1, 0 };
  99. int dj[4] = { 0, -1, 0, 1 };
  100.  
  101. uchar neighbors[4];
  102.  
  103. for (int k = 0; k < 4; k++){
  104. neighbors[k] = img.at<uchar>(i + di[k], j + dj[k]);
  105. if (labelMat.at<uchar>(i + di[k], j + dj[k]) > 0){
  106. L.push_back(labelMat.at<uchar>(i + di[k], j + dj[k]) > 0);
  107. }
  108. }
  109.  
  110. if (L.size() == 0){
  111. label++;
  112. labelMat.at<uchar>(i, j) = label;
  113. }
  114.  
  115. else {
  116. uchar x = minnn(L);
  117. labelMat.at<uchar>(i, j) = x;
  118. for (int y = 0; y <L.size(); y++){
  119. if (x != y){
  120. edges[x].push_back(y);
  121. edges[y].push_back(x);
  122. }
  123.  
  124. }
  125. }
  126.  
  127. }
  128. }
  129. }
  130.  
  131. int newLabel = 0;
  132. Vector<uchar> newLabels;
  133. for (int i = 1; i < label + 1; i++){
  134. newLabels[i] = 0;
  135. }
  136.  
  137. for (int i = 1; i < label; i++){
  138. if (newLabels[i] == 0){
  139. newLabel++;
  140. std::queue<int> myqueue;
  141.  
  142. newLabels[i] = newLabel;
  143.  
  144. myqueue.push(i);
  145.  
  146. while (!myqueue.empty()){
  147.  
  148. int crt = myqueue.front();
  149. myqueue.pop();
  150. for (int y = 0; y < edges[crt].size(); y++){
  151. if (newLabels[y] == 0){
  152. newLabels[y] = newLabel;
  153. myqueue.push(y);
  154. }
  155. }
  156. }
  157.  
  158. }
  159. }
  160.  
  161.  
  162. for (int i = 0; i < img.rows; i++){
  163. for (int j = 0; j < img.cols; j++){
  164. labelMat.at<uchar>(i, j) = newLabels[labelMat.at<uchar>(i, j)];
  165. }
  166. }
  167. imshow("src2", img);
  168. waitKey(0);
  169.  
  170.  
  171.  
  172. Vec3b colors[256] = { 0 };
  173. colors[0] = Vec3b(255, 255, 255);
  174. for (int labeldIndex = 1; labeldIndex <= label; labeldIndex++){
  175.  
  176.  
  177. uchar v1 = rand() % 256;
  178. uchar v2 = rand() % 256;
  179. uchar v3 = rand() % 256;
  180.  
  181. colors[labeldIndex] = Vec3b(v1, v2, v3);
  182. }
  183.  
  184. Mat newImg = Mat(img.rows, img.cols, CV_8UC3);
  185.  
  186. for (int i = 0; i < img.rows; i++){
  187. for (int j = 0; j < img.cols; j++){
  188. newImg.at<Vec3b>(i, j) = colors[labelMat.at<uchar>(i, j)];
  189. }
  190. }
  191.  
  192. imshow("src2", newImg);
  193.  
  194. }
  195.  
  196. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement