基于OpenCV给二值图像中不同邻域做标记
2017-07-31 18:49
274 查看
标记8连通邻域
上个色
给不同邻域上个色
![](https://img-blog.csdn.net/20170731184858603?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWmhhbmdiZWlf/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
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; }
给不同邻域上个色
相关文章推荐
- OpenCV 基于轮廓提取的二值图像分析与连通区域标记算法
- 基于标记的AR的OpenCV实现
- Schwarzer教你用OpenCV实现基于标记的AR
- 基于vs2010+opencv2.4.8实现----将三通道RGB图片分别按R,G,B三个不同分量输出显示
- 基于标记的AR的opencv实现(一)
- 基于标记的AR的opencv实现(一)
- 如何使用OpenCV实现基于标记的定位(为什么对标记检测能够实现定位)
- 基于标记的AR的OpenCV实现(二)
- 基于标记的ID检测opencv实现代码
- 基于标记的AR的OpenCV实现
- 基于标记的AR的opencv实现(一)
- 车辆检测与标记(基于opencv2)
- ios--OpenCV--基于模板图片的标记识别
- ios--OpenCV--图片比对方案:基于模板图片的标记识别
- 连通区域标记:c++版的bwlabel实现(基于opencv)
- 基于标记的AR的OpenCV实现:动态视频输入
- iOS开发005 OpenCV--基于模板图片的标记识别
- 基于区域生长的二值图像标记,去掉区域的细小直线段并选择
- opencv之分水岭算法2——基于标记点的分水岭算法
- 基于标记的AR的OpenCV实现(二)