基于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
- 基于OpenCV给二值图像中不同邻域做标记
- OpenCV中遍历图像与邻域操作
- OpenCV 基于轮廓提取的二值图像分析与连通区域标记算法
- OpenCV:二值图像连通区域分析与标记算法实现
- 二值图像连通区域标记(OpenCV版)
- 图像分析:二值图像连通域标记-基于行程的标记方法
- 图像分析:二值图像连通域标记2-基于轮廓的标记
- 图像分析:二值图像连通域标记-基于行程的标记方法
- bwlabel函数(二值图像中元素标记)
- bwlabel函数(二值图像中元素标记)
- bwlabel函数(二值图像中元素标记)
- bwlabel函数(二值图像中元素标记)
- 图像标识:4邻域标记算法的两次扫描分析
- OpenCV删除面积小的区域 实现图像二值化分割 标记连通区域
- 基于区域生长的二值图像标记,去掉区域的细小直线段并选择
- 基于标记的AR的OpenCV实现(二)
- 基于标记的AR的OpenCV实现(二)
- 【图像处理】二值图像连通区域标记中等价对的合并
- BZOJ 3309 莫比乌斯反演
- 分别使用js和php判断是哪个app打开网页
- HDU 1394 Minimum Inversion Number(线段树求逆序数)
- 算法:C++实现动态规划中的几个典型问题
- Android7.0系统启动
- 基于OpenCV给二值图像中不同邻域做标记
- AutoRestEvent 实现同步
- c语言实现继承和多态
- Matlab axis用法
- java高级特性之--泛型
- 网络流[ZJOI2009] 假期的宿舍
- QS Network(Kruskal)
- Realm源码分析之自动更新原理
- python默认参数的坑