Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <opencv2/opencv.hpp>
- #include <vector>
- #include <random>
- using namespace cv;
- using namespace std;
- int main() {
- Mat_<uchar> image;
- image = imread("/home/visoft/temp/OpenCVApplication-VS2019_OCV451_basic/Images/circle_square.bmp",
- IMREAD_GRAYSCALE);
- imshow("Display Image", image);
- int label = 0;
- Mat_<int> labels(image.rows, image.cols);
- labels = 0;
- vector<vector<int>> edges;
- edges.push_back({});
- int di[] = {0, -1, -1, -1};
- int dj[] = {-1, -1, 0, 1};
- #define NR_VEC 4
- int i, j, k;
- for (i = 0; i < image.rows; i++) // RANDURI
- for (j = 0; j < image.cols; j++) { // COLOANE
- if ((image(i, j) == 0) && (labels(i, j) == 0)) {
- // printf("gasit %d %d\n", i, j);
- vector<int> L;
- for (k = 0; k < NR_VEC; k++) {
- int vi = i + di[k];
- int vj = j + dj[k];
- if ((0 <= vi) && (vi < image.rows) && (0 <= vj) && (vj < image.cols)) {
- int label_vecin = labels(vi, vj);
- if (label_vecin > 0) {
- L.push_back(label_vecin);
- }
- }
- }//for all neighbors
- if (L.size() == 0) {
- label++;
- edges.push_back(vector<int>());
- labels(i, j) = label;
- } else {
- int x = L[0];
- for (k = 1; k < L.size(); k++) {
- x = min(x, L[k]);
- }
- labels(i, j) = x;
- for (k = 0; k < L.size(); k++) {
- int y = L[k];
- if (y != x) {
- edges[x].push_back(y);
- edges[y].push_back(x);
- }
- }
- }//end else
- }//end if pixel obiect.
- }//end for all pixels
- int newlabel = 0;
- vector<int> newlabels(label + 1, 0);
- for (i = 1; i < label; i++) {
- if (newlabels[i] == 0) {
- newlabel++;
- queue<int> Q;
- newlabels[i] = newlabel;
- Q.push(i);
- while (Q.size() > 0) {
- int x = Q.front();
- Q.pop();
- for (k = 0; k < edges[x].size(); k++) {
- int y = edges[x][k];
- if (newlabels[y] == 0){
- newlabels[y] = newlabel;
- Q.push(y);
- }
- }
- }
- }
- }
- default_random_engine gen;
- uniform_int_distribution<int> d(0, 255);
- #define NR_MAX_CULORI 300
- vector<Vec3b> culori(NR_MAX_CULORI);
- culori[0] = Vec3b(255, 255, 255);
- for (i = 1; i < NR_MAX_CULORI; i++) {
- culori[i][0] = d(gen);
- culori[i][1] = d(gen);
- culori[i][2] = d(gen);
- }
- Mat_<Vec3b> labels_for_show(image.rows, image.cols);
- for (i = 0; i < image.rows; i++) // RANDURI
- for (j = 0; j < image.cols; j++) { // COLOANE
- labels_for_show(i, j) = culori[newlabels[labels(i, j)]];
- }
- namedWindow("etichete", WINDOW_NORMAL | WINDOW_GUI_EXPANDED);
- imshow("etichete", labels_for_show);
- waitKey(0);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement