0penCV_(Watershed Segmenter)使用 分水岭算法 对图像进行分割

来源:互联网 发布:淘宝买水果拒收 编辑:程序博客网 时间:2024/05/19 06:51
//使用 分水岭算法 对图像进行分割
cv::Mat image = cv::imread("../../aTestImage/cow.jpg", 1);cv::Mat image1 = cv::imread("../../aTestImage/cow.jpg", 0);cv::Mat binary;cv::threshold(image1, binary, 60, 255, cv::THRESH_BINARY_INV);//阈值化得到二值化图像binarycv::namedWindow("image", 1);cv::imshow("image", image);cv::Mat fg;cv::erode(binary, fg, cv::Mat(), cv::Point(-1, -1), 6);//用点Point对图像腐蚀6次     // cv::namedWindow("fg", 1);//cv::imshow("fg", fg);cv::Mat bg;cv::dilate(binary, bg, cv::Mat(), cv::Point(-1, -1), 6);//用点Point对图像膨胀6次cv::threshold(bg, bg, 1, 128, cv::THRESH_BINARY_INV);//cv::namedWindow("bg", 1);//cv::imshow("bg", bg);cv::Mat markers(binary.size(), CV_8U, cv::Scalar(0));markers = fg + bg;cv::namedWindow("markers", 1);    cv::imshow("markers", markers);WatershedSegmenter segmenter;segmenter.setMarkers(markers);//通过对二值图像的腐蚀+膨胀,获得标记图像markers = segmenter.process(image); // markers是一个数组,图像显示为纯黑cv::namedWindow("Segmentation");//显示分割图像cv::imshow("Segmentation", segmenter.getSegmentation());cv::namedWindow("Watersheds");//显示边界图像cv::imshow("Watersheds", segmenter.getWatersheds());cv::waitKey(0);return 0;}class WatershedSegmenter{public:WatershedSegmenter();~WatershedSegmenter();void setMarkers(const cv::Mat &markerImage){markerImage.convertTo(markers,CV_32S);}cv::Mat process(const cv::Mat &image){cv::watershed(image, markers);return markers;}cv::Mat getSegmentation(){cv::Mat tmp;markers.convertTo(tmp, CV_8U);//等价于(tmp, CV_8U,1, 0)  //double alpha=1, double beta=0return tmp;}cv::Mat getWatersheds(){cv::Mat tmp;markers.convertTo(tmp, CV_8U,255,255);//只显示边界...return tmp;}private:cv::Mat markers;};

 



0 0
原创粉丝点击