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; };
相关文章推荐
- 新手学,java使用分水岭算法进行图像分割(二)
- 使用分水岭算法对图像进行分割
- 新手学,java使用分水岭算法进行图像分割(一)
- stm32f407使用OV7725使用迭代阈值法进行图像二值化,图像分割
- Python OpenCV学习笔记之:使用Grabcut算法进行图像背景和前景分割
- OpenCV2 使用分水岭算法对图像分割的个人理解 cv::watershed()
- OpenCV2编程手册笔记之 5.5分水岭算法对图像进行分割
- 使用颜色空间进行图像分割
- opencv分水岭算法对图像进行分割
- 利用SVM支持向量机对彩色图像进行分割并使用OpenCV进行实现
- keras版FCN网络进行图像语义分割--使用VOC2012数据
- 新手学,java使用分水岭算法进行图像切割(一)
- 使用 Java 进行图像处理 - 编码输出高分辨率图像
- 使用DeeepZoom Composer进行富图像应用的开发(翻译--1)
- 使用OpenGl GLSL进行数字图像处理
- 使用split进行大数据分割时内存溢出解决方案
- 使用mencoder进行视频分割
- 用C程序进行图像分割的方法
- Q:我欲使用WinDriver开发一个PCI卡的驱动程序来传输图像,但是当我利用WinDriver进行Virtex5 FPGA进行读取和写入动作时,计算机会当机,请问如何解决?
- 使用DeeepZoom Composer进行富图像应用的开发(翻译--2)