[cpp] OpenCV Binary Image

Viewer

copydownloadembedprintName: OpenCV Binary Image
  1. #include "opencv2/core/core.hpp"
  2. #include "opencv2/imgproc/imgproc.hpp"
  3. #include "opencv2/highgui/highgui.hpp"
  4. #include <opencv2/opencv.hpp>
  5. #include <unordered_map>
  6. #include <stack>
  7.  
  8. using namespace cv;
  9. using namespace std;
  10.  
  11. class BinaryColoring {
  12.  
  13. private:
  14.     
  15.     Mat image;
  16.     vector<vector<unsigned int>> intensityArray;
  17.     unordered_map<unsigned intint> valueCountMap;
  18.     
  19.     float initial1;
  20.     float initial2;
  21.  
  22. public:
  23.     
  24.     BinaryColoring(const string& imagePath, float initialCentroid1, float initialCentroid2) {
  25.         image = imread(imagePath);
  26.  
  27.         if (image.empty()) {
  28.             cerr << "Resim okuma hatası!" << endl;
  29.             exit(-1);
  30.         }
  31.  
  32.         int rows = image.rows;
  33.         int cols = image.cols;
  34.         intensityArray.resize(rows, vector<unsigned int>(cols, 0.0));
  35.  
  36.         for (int i = 0; i < rows; ++i) {
  37.             for (int j = 0; j < cols; ++j) {
  38.                 Vec3b pixel = image.at<Vec3b>(i, j);
  39.                             unsigned int intensity = 0.21 * pixel[2] + 0.72 * pixel[1] + 0.07 * pixel[0];
  40.                             intensityArray[i][j] = intensity;
  41.             }
  42.         }
  43.  
  44.         for (const auto& row : intensityArray) {
  45.             for (float value : row) {
  46.                 valueCountMap[value]++;
  47.             }
  48.         }
  49.  
  50.         initial1 = initialCentroid1;
  51.         initial2 = initialCentroid2;
  52.     }
  53.  
  54.     void runKMeans(float threshold = 0.0) {
  55.         float tempInitial1 = initial1;
  56.         float tempInitial2 = initial2;
  57.  
  58.         do {
  59.             initial1 = tempInitial1;
  60.             initial2 = tempInitial2;
  61.  
  62.             unordered_map<unsigned intint> nearInitial1Map;
  63.             unordered_map<unsigned intint> nearInitial2Map;
  64.  
  65.             for (const auto& pair : valueCountMap) {
  66.                 float value = pair.first;
  67.  
  68.                 float distanceToInitial1 = abs(value - tempInitial1);
  69.                 float distanceToInitial2 = abs(value - tempInitial2);
  70.  
  71.                 if (distanceToInitial1 < distanceToInitial2) {
  72.                     nearInitial1Map[value] = pair.second;
  73.                 } else {
  74.                     nearInitial2Map[value] = pair.second;
  75.                 }
  76.             }
  77.  
  78.             tempInitial1 = calculateNewCentroid(nearInitial1Map);
  79.             tempInitial2 = calculateNewCentroid(nearInitial2Map);
  80.  
  81.         } while (abs(initial1 - tempInitial1) > threshold || abs(initial2 - tempInitial2) > threshold);
  82.     }
  83.  
  84.     Mat getResultImage() {
  85.         int rows = image.rows;
  86.         int cols = image.cols;
  87.         Mat resultImage(rows, cols, CV_8UC1, Scalar(0));
  88.  
  89.         for (int i = 0; i < rows; ++i) {
  90.             for (int j = 0; j < cols; ++j) {
  91.                 float intensity = intensityArray[i][j];
  92.  
  93.                 if (abs(intensity - initial1) < abs(intensity - initial2)) {
  94.                     resultImage.at<uchar>(i, j) = 255;
  95.                 } else {
  96.                     resultImage.at<uchar>(i, j) = 0;
  97.                 }
  98.             }
  99.         }
  100.  
  101.         return resultImage;
  102.     }
  103.  
  104. private:
  105.     float calculateNewCentroid(const unordered_map<unsigned intint>& intensityMap) {
  106.         float sum = 0.0;
  107.         int totalIntensity = 0;
  108.  
  109.         for (const auto& pair : intensityMap) {
  110.             sum += pair.first * pair.second;
  111.             totalIntensity += pair.second;
  112.         }
  113.  
  114.         return totalIntensity > 0 ? sum / totalIntensity : 0.0;
  115.     }
  116. };
  117.  
  118. vector<vector<int>> createBinaryImage(const Mat& resultImage) {
  119.     
  120.     int rows = resultImage.rows;
  121.     int cols = resultImage.cols;
  122.  
  123.     vector<vector<int>> binaryArray(rows, vector<int>(cols, 0));
  124.  
  125.     for (int i = 0; i < rows; ++i) {
  126.         for (int j = 0; j < cols; ++j) {
  127.             if (resultImage.at<uchar>(i, j) == 255) {
  128.                 binaryArray[i][j] = 1;
  129.             }
  130.         }
  131.     }
  132.  
  133.     return binaryArray;
  134. }
  135.  
  136.  
  137. vector<vector<int>> labelComponentsOnImage(const vector<vector<int>>& binaryImage) {
  138.    
  139.     int matris_rows = int(binaryImage.size());
  140.     int matris_cols = int(binaryImage[0].size());
  141.     
  142.     vector<vector<int>> labeledImage(matris_rows, vector<int>(matris_cols, 0));
  143.     
  144.     vector<int> labelTable(10);
  145.     
  146.     int numLabel = 1;
  147.  
  148.     for(int r = 0; r < matris_rows; r++)
  149.     {
  150.         for(int c = 0; c < matris_cols; c++)
  151.         {
  152.             if(binaryImage[r][c] == 0){labeledImage[r][c] = 0;}
  153.             
  154.             else{
  155.                 
  156.                 labeledImage[- 1][c] = (> 0) ? labeledImage[- 1][c] : 0;
  157.                 labeledImage[r][- 1] = (> 0) ? labeledImage[r][- 1] : 0;
  158.                 
  159.                 if(labeledImage[- 1][c] == 0
  160.                    && labeledImage[r][- 1] == 0)
  161.                 {labeledImage[r][c] = numLabel;
  162.                     labelTable.push_back(numLabel);
  163.                     numLabel++;}
  164.                 
  165.                 else if(labeledImage[- 1][c] != 0
  166.                         && labeledImage[r][- 1] == 0)
  167.                 {labeledImage[r][c] = labeledImage[- 1][c];}
  168.                 
  169.                 else if(labeledImage[- 1][c] == 0
  170.                         && labeledImage[r][- 1] != 0)
  171.                 {labeledImage[r][c] = labeledImage[r][- 1];}
  172.                 
  173.                 else
  174.                 {labeledImage[r][c] = min(labeledImage[- 1][c],labeledImage[r][- 1]);
  175.                     
  176.                     if(labeledImage[- 1][c] != labeledImage[r][- 1]) {
  177.  
  178.                         int max_label = max(labeledImage[- 1][c], labeledImage[r][- 1]);
  179.                         int min_label = min(labeledImage[- 1][c], labeledImage[r][- 1]);
  180.                         
  181.                         for(int i = 1; i < labelTable.size(); i++)
  182.                         {
  183.                             if(labelTable[i] == max_label)
  184.                                 labelTable[i] = min_label;
  185.                         }
  186.                     }
  187.                     
  188.                 }
  189.             }
  190.         }
  191.     }
  192.     
  193.     for(int r = 0; r < matris_rows; r++)
  194.     {
  195.         for(int c = 0; c < matris_cols; c++)
  196.         {
  197.             
  198.             if(labeledImage[r][c] != 0)
  199.                 labeledImage[r][c] = labelTable[labeledImage[r][c]];
  200.         }
  201.     }
  202.  
  203.     return labeledImage;
  204. }
  205.  
  206.  
  207.  
  208.  
  209. int main() {
  210.     string imagePath = "/Users/daghan/Desktop/şekiller2.jpeg";
  211.     
  212.     float initialCentroid1 = 40.0;
  213.     float initialCentroid2 = 120.0;
  214.  
  215.     BinaryColoring myImage(imagePath, initialCentroid1, initialCentroid2);
  216.     myImage.runKMeans();
  217.  
  218.     Mat resultImage = myImage.getResultImage();
  219.  
  220.     vector<vector<int>> binaryImage = createBinaryImage(resultImage);
  221.     vector<vector<int>> labeledImage;
  222.  
  223.     labeledImage = labelComponentsOnImage(binaryImage);
  224.  
  225.     return 0;
  226. }
  227.  

Editor

You can edit this paste and save as new:


File Description
  • OpenCV Binary Image
  • Paste Code
  • 20 May-2024
  • 6.75 Kb
You can Share it: