1 #include <cv.h>   
  2 
  3 #include <highgui.h>   
  4 
  5 #include <vector>   
  6 
  7 #include <algorithm>   
  8 
  9 using namespace std;  
 10 
 11 
 12 
 13 int main()  
 14 
 15 {  
 16 
 17     IplImage *src = cvLoadImage("lena.jpg", CV_LOAD_IMAGE_COLOR);  
 18 
 19     cvNamedWindow("原始图像");  
 20 
 21     cvShowImage("原始图像", src);  
 22 
 23   
 24 
 25     IplImage* dst=cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_8U,1);   
 26 
 27     cvCvtColor(src,dst,CV_BGR2GRAY);  
 28 
 29     cvNamedWindow("灰度图像");  
 30 
 31     cvShowImage("灰度图像", src);  
 32 
 33   
 34 
 35     cvThreshold(dst, dst, 0.0, 255.0, CV_THRESH_BINARY | CV_THRESH_OTSU);//OTSU二值化   
 36 
 37     IplConvKernel *element = cvCreateStructuringElementEx(5, 5, 0, 0, CV_SHAPE_ELLIPSE);  
 38 
 39     cvMorphologyEx(dst, dst, NULL, element, CV_MOP_OPEN);//开运算,去除比结构元素小的点   
 40 
 41     cvReleaseStructuringElement(&element);  
 42 
 43     cvNamedWindow("二值图像");  
 44 
 45     cvShowImage("二值图像", dst);  
 46 
 47       
 48 
 49     int w,h;  
 50 
 51     CvSize sz = cvGetSize(dst);  
 52 
 53       
 54 
 55     int color = 254;//不对0计数,不可能为255,所以254   
 56 
 57     for (w=0; w<sz.width; w++)  
 58 
 59     {  
 60 
 61         for (h=0; h<sz.height; h++)  
 62 
 63         {  
 64 
 65             if (color > 0)  
 66 
 67             {  
 68 
 69                 if (CV_IMAGE_ELEM(dst, unsigned char, h, w) == 255)  
 70 
 71                 {  
 72 
 73                     //把连通域标记上颜色   
 74 
 75                     cvFloodFill(dst, cvPoint(w,h), CV_RGB( color,color,color));  
 76 
 77                     color--;  
 78 
 79                 }  
 80 
 81             }  
 82 
 83         }  
 84 
 85     }  
 86 
 87     cvNamedWindow("标记颜色后的图像");  
 88 
 89     cvShowImage("标记颜色后的图像", dst);  
 90 
 91       
 92 
 93     int colorsum[255] = {0};  
 94 
 95     for (w=0; w<sz.width; w++)  
 96 
 97     {  
 98 
 99         for (h=0; h<sz.height; h++)  
100 
101         {  
102 
103             if (CV_IMAGE_ELEM(dst, unsigned char, h, w) > 0)  
104 
105             {  
106 
107                 colorsum[CV_IMAGE_ELEM(dst, unsigned char, h, w)]++;//统计每种颜色的数量   
108 
109             }  
110 
111         }  
112 
113     }  
114 
115     vector<int> v1(colorsum, colorsum+255);//用数组初始化vector   
116 
117     //求出最多数量的染色,注意max_element的使用方法   
118 
119     int maxcolorsum = max_element(v1.begin(), v1.end()) - v1.begin();  
120 
121     printf("%d\n",maxcolorsum);  
122 
123   
124 
125     for (w=0; w<sz.width; w++)  
126 
127     {  
128 
129         for (h=0; h<sz.height; h++)  
130 
131         {  
132 
133             if (CV_IMAGE_ELEM(dst, unsigned char, h, w) == maxcolorsum)  
134 
135             {  
136 
137                 CV_IMAGE_ELEM(dst, unsigned char, h, w) = 255;  
138 
139             }  
140 
141             else  
142 
143             {  
144 
145                 CV_IMAGE_ELEM(dst, unsigned char, h, w) = 0;  
146 
147             }  
148 
149         }  
150 
151     }  
152 
153     cvNamedWindow("最大连通域图");  
154 
155     cvShowImage("最大连通域图", dst);  
156 
157       
158 
159     cvWaitKey(0);   
160 
161     cvDestroyAllWindows();  
162 
163     cvReleaseImage(&src);  
164 
165     cvReleaseImage(&dst);  
166 
167       
168 
169     return 0;  
170 
171 }