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

来源:互联网 发布:单片机课设 编辑:程序博客网 时间:2024/06/05 06:27
#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 intsmarkerImage.convertTo(markers,CV_32S);  }  cv::Mat process(const cv::Mat &image) {// Apply watershedcv::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 255markers.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 imagecv::Mat image= cv::imread("d:/test/opencv/group.jpg");if (!image.data)return 0;     // Display the imagecv::namedWindow("Original Image");cv::imshow("Original Image",image);// Get the binary mapcv::Mat binary;binary= cv::imread("d:/test/opencv/binary.bmp",0);    // Display the binary imagecv::namedWindow("Binary Image");cv::imshow("Binary Image",binary);// Eliminate noise and smaller objectscv::Mat fg;cv::erode(binary,fg,cv::Mat(),cv::Point(-1,-1),6);    // Display the foreground imagecv::namedWindow("Foreground Image");cv::imshow("Foreground Image",fg);// Identify image pixels without objectscv::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 imagecv::namedWindow("Background Image");cv::imshow("Background Image",bg);// Show markers imagecv::Mat markers(binary.size(),CV_8U,cv::Scalar(0));markers= fg+bg;cv::namedWindow("Markers");cv::imshow("Markers",markers);// Create watershed segmentation objectWatershedSegmenter segmenter;// Set markers and processsegmenter.setMarkers(markers);segmenter.process(image);// Display segmentation resultcv::namedWindow("Segmentation");cv::imshow("Segmentation",segmenter.getSegmentation());// Display watershedscv::namedWindow("Watersheds");cv::imshow("Watersheds",segmenter.getWatersheds());cv::waitKey();return 0;}


0 0
原创粉丝点击