歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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圖像,測試結果為:

Copyright © Linux教程網 All Rights Reserved