您的位置:首页 > 运维架构

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

2017-07-31 18:49 274 查看
标记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);
}
ims
4000
how("color", img);
waitKey(0);

return 0;
}


给不同邻域上个色



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  图像算法