Advertisement

使用分水岭算法对图像进行分割

阅读量:
复制代码
 #if !defined WATERSHS

    
 #define WATERSHS
    
  
    
 #include <opencv2/core/core.hpp>
    
 #include <opencv2/imgproc/imgproc.hpp>
    
 #include <opencv2/highgui/highgui.hpp>
    
  
    
 class WatershedSegmenter {
    
  
    
   private:
    
  
    
 	  cv::Mat markers;
    
  
    
   public:
    
  
    
 	  void setMarkers(const cv::Mat& markerImage) {
    
  
    
 		// Convert to image of ints
    
 		markerImage.convertTo(markers,CV_32S);
    
 	  }
    
  
    
 	  cv::Mat process(const cv::Mat &image) {
    
  
    
 		// Apply watershed
    
 		cv::watershed(image,markers);
    
  
    
 		return markers;
    
 	  }
    
  
    
 	  // Return result in the form of an image
    
 	  cv::Mat getSegmentation() {
    
 		  
    
 		cv::Mat tmp;
    
 		// all segment with label higher than 255
    
 		// will be assigned value 255
    
 		markers.convertTo(tmp,CV_8U);
    
  
    
 		return tmp;
    
 	  }
    
  
    
 	  // Return watershed in the form of an image
    
 	  cv::Mat getWatersheds() {
    
 	
    
 		cv::Mat tmp;
    
 		markers.convertTo(tmp,CV_8U,255,255);
    
  
    
 		return tmp;
    
 	  }
    
 };
    
  
    
  
    
 #endif
    
  
    
 #include <iostream>
    
 #include <opencv2/core/core.hpp>
    
 #include <opencv2/imgproc/imgproc.hpp>
    
 #include <opencv2/highgui/highgui.hpp>
    
 #include "watershedSegmentation.h"
    
  
    
  
    
 int main()
    
 {
    
 	// Read input image
    
 	cv::Mat image= cv::imread("d:/test/opencv/group.jpg");
    
 	if (!image.data)
    
 		return 0; 
    
  
    
     // Display the image
    
 	cv::namedWindow("Original Image");
    
 	cv::imshow("Original Image",image);
    
  
    
 	// Get the binary map
    
 	cv::Mat binary;
    
 	binary= cv::imread("d:/test/opencv/binary.bmp",0);
    
  
    
     // Display the binary image
    
 	cv::namedWindow("Binary Image");
    
 	cv::imshow("Binary Image",binary);
    
  
    
 	// Eliminate noise and smaller objects
    
 	cv::Mat fg;
    
 	cv::erode(binary,fg,cv::Mat(),cv::Point(-1,-1),6);
    
  
    
     // Display the foreground image
    
 	cv::namedWindow("Foreground Image");
    
 	cv::imshow("Foreground Image",fg);
    
  
    
 	// Identify image pixels without objects
    
 	cv::Mat bg;
    
 	cv::dilate(binary,bg,cv::Mat(),cv::Point(-1,-1),6);
    
 	cv::threshold(bg,bg,1,128,cv::THRESH_BINARY_INV);
    
  
    
     // Display the background image
    
 	cv::namedWindow("Background Image");
    
 	cv::imshow("Background Image",bg);
    
  
    
 	// Show markers image
    
 	cv::Mat markers(binary.size(),CV_8U,cv::Scalar(0));
    
 	markers= fg+bg;
    
 	cv::namedWindow("Markers");
    
 	cv::imshow("Markers",markers);
    
  
    
 	// Create watershed segmentation object
    
 	WatershedSegmenter segmenter;
    
  
    
 	// Set markers and process
    
 	segmenter.setMarkers(markers);
    
 	segmenter.process(image);
    
  
    
 	// Display segmentation result
    
 	cv::namedWindow("Segmentation");
    
 	cv::imshow("Segmentation",segmenter.getSegmentation());
    
  
    
 	// Display watersheds
    
 	cv::namedWindow("Watersheds");
    
 	cv::imshow("Watersheds",segmenter.getWatersheds());
    
  
    
 	
    
 	cv::waitKey();
    
 	return 0;
    
 }

全部评论 (0)

还没有任何评论哟~