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/letters.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(vector<int>());
- int di[] = {0, -1, -1, -1};
- int dj[] = {-1, -1, 0, 1};
- for (int i = 0; i < image.rows; i++) // RADNDURI
- for (int 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 (int k = 0; k < 4; k++) {
- int iv = i + di[k];
- int jv = j + dj[k];
- if ((0 <= iv) && (iv < image.rows) && (0 <= jv) && (jv <= image.cols)) {
- if (labels(iv, jv) > 0) {
- L.push_back(labels(iv, jv));
- }
- }//if neigbor in the image
- }//for all neigbors
- if (L.size() == 0) {
- label++;
- edges.push_back(vector<int>());
- labels(i, j) = label;
- } else {
- int x = L[0];
- for (int k = 1; k < L.size(); k++) {
- x = min(x, L[k]);
- }
- labels(i, j) = x;
- for (int k = 1; k < L.size(); k++) {
- int y = L[k];
- if (y != x) {
- edges[x].push_back(y);
- edges[y].push_back(x);
- }
- }
- }
- }//if pixel obiect
- }
- int newlabel = 0;
- vector<int> newlabels(label + 1, 0);
- for (int 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 (int 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 MAX_CULORI 400
- vector<Vec3b> index_culori(MAX_CULORI);
- index_culori[0] = Vec3b(255, 255, 255);
- for (int k = 1; k < MAX_CULORI; k++) {
- index_culori[k][0] = d(gen);
- index_culori[k][1] = d(gen);
- index_culori[k][2] = d(gen);
- }
- Mat_<Vec3b> etichete_colorate(image.rows, image.cols);
- for (int i = 0; i < image.rows; i++)
- for (int j = 0; j < image.cols; j++) {
- etichete_colorate(i, j) = index_culori[newlabels[labels(i, j)] % MAX_CULORI];
- }
- imshow("etichete", etichete_colorate);
- waitKey(0);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement