您的位置:首页 > 运维架构

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

2017-03-14 17:05 375 查看
//使用 分水岭算法 对图像进行分割
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;
};


 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opencv 图像分割