您当前的位置: 首页 >  算法

惊鸿一博

暂无认证

  • 5浏览

    0关注

    535博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

惊鸿一博 发布时间:2017-03-14 17:05:06 ,浏览量:5

//使用 分水岭算法 对图像进行分割
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);//阈值化得到二值化图像binary


cv::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=0
return tmp;


}
cv::Mat getWatersheds()
{
cv::Mat tmp;
markers.convertTo(tmp, CV_8U,255,255);//只显示边界...
return tmp;
}
private:
cv::Mat markers;
};
 

 

 

关注
打赏
1663399408
查看更多评论
立即登录/注册

微信扫码登录

0.8868s