OpenCV求得图像的最大连通域


直接贴代码了。在写的时候借鉴了网上的一些代码,可是忘记保留链接了,所以此处向可能的贡献者致谢。

  1. #include <cv.h>   
  2. #include <highgui.h>   
  3. #include <vector>   
  4. #include <algorithm>   
  5. using namespace std;  
  6.   
  7. #pragma comment( lib, "cv.lib" )   
  8. #pragma comment( lib, "cxcore.lib" )   
  9. #pragma comment( lib, "highgui.lib" )   
  10.   
  11. int main()  
  12. {  
  13.     IplImage *src = cvLoadImage("lena.jpg", CV_LOAD_IMAGE_COLOR);  
  14.     cvNamedWindow("原始图像");  
  15.     cvShowImage("原始图像", src);  
  16.   
  17.     IplImage* dst=cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_8U,1);   
  18.     cvCvtColor(src,dst,CV_BGR2GRAY);  
  19.     cvNamedWindow("灰度图像");  
  20.     cvShowImage("灰度图像", src);  
  21.   
  22.     cvThreshold(dst, dst, 0.0, 255.0, CV_THRESH_BINARY | CV_THRESH_OTSU);//OTSU二值化   
  23.     IplConvKernel *element = cvCreateStructuringElementEx(5, 5, 0, 0, CV_SHAPE_ELLIPSE);  
  24.     cvMorphologyEx(dst, dst, NULL, element, CV_MOP_OPEN);//开运算,去除比结构元素小的点   
  25.     cvReleaseStructuringElement(&element);  
  26.     cvNamedWindow("二值图像");  
  27.     cvShowImage("二值图像", dst);  
  28.       
  29.     int w,h;  
  30.     CvSize sz = cvGetSize(dst);  
  31.       
  32.     int color = 254;//不对0计数,不可能为255,所以254   
  33.     for (w=0; w<sz.width; w++)  
  34.     {  
  35.         for (h=0; h<sz.height; h++)  
  36.         {  
  37.             if (color > 0)  
  38.             {  
  39.                 if (CV_IMAGE_ELEM(dst, unsigned char, h, w) == 255)  
  40.                 {  
  41.                     //把连通域标记上颜色   
  42.                     cvFloodFill(dst, cvPoint(w,h), CV_RGB( color,color,color));  
  43.                     color--;  
  44.                 }  
  45.             }  
  46.         }  
  47.     }  
  48.     cvNamedWindow("标记颜色后的图像");  
  49.     cvShowImage("标记颜色后的图像", dst);  
  50.       
  51.     int colorsum[255] = {0};  
  52.     for (w=0; w<sz.width; w++)  
  53.     {  
  54.         for (h=0; h<sz.height; h++)  
  55.         {  
  56.             if (CV_IMAGE_ELEM(dst, unsigned char, h, w) > 0)  
  57.             {  
  58.                 colorsum[CV_IMAGE_ELEM(dst, unsigned char, h, w)]++;//统计每种颜色的数量   
  59.             }  
  60.         }  
  61.     }  
  62.     vector<int> v1(colorsum, colorsum+255);//用数组初始化vector   
  63.     //求出最多数量的染色,注意max_element的使用方法   
  64.     int maxcolorsum = max_element(v1.begin(), v1.end()) - v1.begin();  
  65.     printf("%d\n",maxcolorsum);  
  66.   
  67.     for (w=0; w<sz.width; w++)  
  68.     {  
  69.         for (h=0; h<sz.height; h++)  
  70.         {  
  71.             if (CV_IMAGE_ELEM(dst, unsigned char, h, w) == maxcolorsum)  
  72.             {  
  73.                 CV_IMAGE_ELEM(dst, unsigned char, h, w) = 255;  
  74.             }  
  75.             else  
  76.             {  
  77.                 CV_IMAGE_ELEM(dst, unsigned char, h, w) = 0;  
  78.             }  
  79.         }  
  80.     }  
  81.     cvNamedWindow("最大连通域图");  
  82.     cvShowImage("最大连通域图", dst);  
  83.       
  84.     cvWaitKey(0);   
  85.     cvDestroyAllWindows();  
  86.     cvReleaseImage(&src);  
  87.     cvReleaseImage(&dst);  
  88.       
  89.     return 0;  
  90. }  

测试图像采用标准的Lena图像,测试结果为:

相关内容