用OpenCV求解最大连通域
来源:互联网 发布:Ubuntu matlab安装教程 编辑:程序博客网 时间:2024/05/28 14:56
在MATLAB里求解最大连通域用bwlabel就行了,在OpenCV中没有看到现成的函数,在网上
找了一些程序,看起来头大,于是自己编了一个,抛砖引玉了这里
本程序的主要结构是:
1.读彩色bmp文件,提取Green通道
2.中值滤波,Otsu二值化
3.形态学操作去除小细节
4.标注连通域
找了一些程序,看起来头大,于是自己编了一个,抛砖引玉了这里
本程序的主要结构是:
1.读彩色bmp文件,提取Green通道
2.中值滤波,Otsu二值化
3.形态学操作去除小细节
4.标注连通域
5.求解最大连通域
#include <cv.h> #include <highgui.h> #include <cxcore.h> #include <vector> #include <algorithm> using namespace std; ///////////////////////////////////////////////void CMy20111114qian的matlab程序转opencvDlg::OnBnClickedButton1(){ IplImage *src = cvLoadImage("before.bmp", CV_LOAD_IMAGE_COLOR);//读取图像文件 cvNamedWindow("origin"); cvShowImage("origin", src);//显示原始图像 //摄像机保存的图像是32位的,有R、G、B和Alpha通道 //图像中实际存储顺序是B、G、R IplImage *blue = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);//制作一个单通道图像 IplImage *green = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);//制作一个单通道图像 IplImage *red = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);//制作一个单通道图像 cvSplit(src, blue, green, red, NULL);//分割颜色通道 cvSmooth(green, green, CV_MEDIAN, 7);//7*7中值滤波 cvThreshold(green, green, 0.0, 255.0, CV_THRESH_BINARY | CV_THRESH_OTSU);//OTSU法二值化 { IplConvKernel *element = cvCreateStructuringElementEx(5, 5, 0, 0, CV_SHAPE_ELLIPSE);//定义形态学结构指针 cvMorphologyEx(green, green, NULL, element, CV_MOP_OPEN);//开运算,去除比结构元素小的亮点 cvReleaseStructuringElement(&element); } cvNamedWindow("binary"); cvShowImage("binary", green);//显示二值化图像 { int color = 254;// 从254开始,因此连通域不能多于253个 CvSize sz = cvGetSize(green); int w; int h; for (w=0; w<sz.width; w++) { for (h=0; h<sz.height; h++) { if (color > 0) { if (CV_IMAGE_ELEM(green, unsigned char, h, w) == 255) { cvFloodFill(green, cvPoint(w,h), CV_RGB( color,color,color));//把各连通域标记上颜色 color--; } } } } cvNamedWindow("labeled"); cvShowImage("labeled", green);//显示标记后的图像 int colorsum[255] = {0}; for (w=0; w<sz.width; w++) { for (h=0; h<sz.height; h++) { if (CV_IMAGE_ELEM(green, unsigned char, h, w) > 0)//不对0值计数,不可能为255 { colorsum[CV_IMAGE_ELEM(green, unsigned char, h, w)]++;//统计每种颜色的数量 } } } vector<int> v1(colorsum, colorsum+255);//用数组初始化vector int maxcolorsum = max_element(v1.begin(), v1.end()) - v1.begin();//求出最多数量的颜色 for (w=0; w<sz.width; w++) { for (h=0; h<sz.height; h++) { if (CV_IMAGE_ELEM(green, unsigned char, h, w) == maxcolorsum) { CV_IMAGE_ELEM(green, unsigned char, h, w) = 255;//只把最多数量的颜色标为255 } else { CV_IMAGE_ELEM(green, unsigned char, h, w) = 0;//其他标为0 } } } cvNamedWindow("最大连通域"); cvShowImage("最大连通域", green);//显示最大连通域 } cvReleaseImage(&src); cvReleaseImage(&blue); cvReleaseImage(&green); cvReleaseImage(&red);}
- 用OpenCV求解最大连通域
- OpenCV获得最大连通域
- OpenCV求得图像的最大连通域
- 用OpenCv找出最大连通域,并对其进行连通域进行ROI
- 用OpenCv找出最大连通域,并对其进行连通域进行ROI
- OpenCV获取彩色图像某一通道的最大连通域
- 使用OpenCV查找二值图中最大连通区域
- opencv实现连通域
- opencv实现连通域
- opencv实现连通域
- opencv实现连通域
- opencv连通域操作
- OpenCV实现连通域
- OPENCV连通域操作
- OpenCV连通域分析
- Opencv 连通域分析
- 动态规划:如何求解最大连通节点值
- 图像处理中最大连通区域的求解
- 正式入驻CSDN
- UVa 12174 - Shuffle
- opencv实现连通域
- Android数据存储之使用SQLite数据库存储数据
- 配置adb环境变量
- 用OpenCV求解最大连通域
- 数论之神 god of number theory
- 黑马程序员 java高新技术<三>--java5的注解、java5的泛型
- OpenCV实现图像的旋转
- POJ 1036 Gangsters -- 常规dp 题意好难懂啊
- oracle--压缩
- 黑马程序员 java高新技术<四>--类加载器、动态代理技术的深入讲解与应用
- OpenCV中響應鼠標消息
- C++一些注意点之new和malloc