基于OpenCV给二值图像中不同邻域做标记

来源:互联网 发布:软件启动画面 编辑:程序博客网 时间:2024/06/09 17:59

标记8连通邻域

void lableConnectedRegion(Mat &img, Mat &labelImg, vector<int> &resLabelSet){    uchar fgPix = 255;    uchar bgPix = 0;    resLabelSet.clear();    resLabelSet.push_back(0);    labelImg.create(img.size(), CV_32SC1);    labelImg = Scalar(0);    vector<int> labelSet(1, 0);    int label = 1;    // 初步打标签    for(int ver = 0; ver < img.rows; ++ver) {        for(int hor = 0; hor < img.cols; ++hor) {            if(img.at<uchar>(ver, hor) == fgPix) {                int upLabel = labelImg.at<int>( MAX2(ver - 1, 0), hor);                int leftLabel = labelImg.at<int>(ver, MAX2(hor - 1, 0));                int upLeftLabel = labelImg.at<int>(MAX2(ver - 1, 0), MAX2(hor - 1, 0));                vector<int> set;                set.push_back(upLabel);                set.push_back(leftLabel);                set.push_back(upLeftLabel);                sort(set.begin(), set.end());                int zeroCnt = 0;                for(size_t i = 0; i < set.size(); ++i) {                    if(set[i] == 0) zeroCnt++;                }                if(zeroCnt == 3) {                    labelImg.at<int>(ver, hor) = label;                    labelSet.push_back(label);                    ++label;                }                else {                    labelImg.at<int>(ver, hor) = set[zeroCnt];                    if(zeroCnt == 1) {                        if(labelSet[set[2]] > set[1]) labelSet[set[2]] = set[1];                    }                    else if(zeroCnt == 0) {                        if(labelSet[set[1]] > set[0]) labelSet[set[1]] = set[0];                        if(labelSet[set[2]] > set[0]) labelSet[set[2]] = set[0];                    }                }            }        }    }    if(1 == label) return;    // 建立标签之间的关系    for(size_t i = 1; i < labelSet.size(); ++i) {        if(i != labelSet[i]) {            labelSet[i] = labelSet[labelSet[i]];        }    }    // 打新标签    for(int ver = 0; ver < img.rows; ++ver) {        int *ptr = labelImg.ptr<int>(ver);        for(int hor = 0; hor < img.cols; ++hor) {            ptr[hor] = labelSet[ptr[hor]];        }    }    // 合并标签    for(size_t i = 1; i < labelSet.size(); ++i) {        if(labelSet[i] > resLabelSet.back()) resLabelSet.push_back(labelSet[i]);    }}

上个色

void Color(Mat &img, Mat labelImg, int label, int b, int g, int r){    for(int ver = 0; ver < img.rows; ++ver) {        for(int hor = 0; hor < img.cols; ++hor) {            if( label == labelImg.at<int>(ver, hor) ) {                img.at<Vec3b>(ver, hor)[0] = b;                img.at<Vec3b>(ver, hor)[1] = g;                img.at<Vec3b>(ver, hor)[2] = r;            }        }    }}int main(int argc, char *argv[]){    Mat img = imread(argv[1]);    vector<Mat> chan;    split(img, chan);    Mat gray = chan[0];    imshow("gray", gray);    waitKey(0);    Mat labelImg(gray.size(), CV_32SC1);    vector<int> labelSet;    lableConnectedRegion(gray, labelImg, labelSet);    for(int i = 1; i < labelSet.size(); ++i) {        Color(img , labelImg, i, rand() % 256, rand() % 256, rand() % 256);    }    imshow("color", img);    waitKey(0);    return 0;}

给不同邻域上个色
这里写图片描述

这里写图片描述

阅读全文
0 0
原创粉丝点击