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

//使用 分水岭算法 对图像进行分割
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;
};
 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

惊鸿一博

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值