歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> OpenCV求得圖像的最大連通域

OpenCV求得圖像的最大連通域

日期:2017/3/1 10:10:37   编辑:Linux編程

直接貼代碼了。在寫的時候借鑒了網上的一些代碼,可是忘記保留鏈接了,所以此處向可能的貢獻者致謝。

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

測試圖像采用標准的Lena圖像,測試結果為:

Copyright © Linux教程網 All Rights Reserved