运行环境:ubuntu16.04+Qt+opencv2.4.13

参考链接:http://blog.csdn.net/u010741471/article/details/45193521

watershedsegmenter.h

#ifndef WATERSHEDSEGMENTER
#define WATERSHEDSEGMENTER #include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp> class WatershedSegmenter { private:
//用来表示标记(图)
cv::Mat markers; public:
//设置标记图
void setMarkers(const cv::Mat& markerImage) { //watershed()的输入参数必须为一个32位有符号的标记,所以要先进行转换
markerImage.convertTo(markers,CV_32S);
}
//执行watershed()
cv::Mat process(const cv::Mat &image) { // Apply watershed
cv::watershed(image,markers); return markers;
} // 以图像形式返回结果
cv::Mat getSegmentation() { cv::Mat tmp;
// 从32S到8U(0-255)会进行饱和运算,所以像素高于255的一律复制为255
markers.convertTo(tmp,CV_8U);// return tmp;
} // 以图像形式返回分水岭(我理解的是分割线)
cv::Mat getWatersheds() { cv::Mat tmp;
//在设置标记图像,即执行setMarkers()后,边缘的像素会被赋值为-1,其他的用正整数表示
//下面的这个转换可以让边缘像素变为-1*255+255=0,即黑色,其余的溢出,赋值为255,即白色。
markers.convertTo(tmp,CV_8U,,);
return tmp;
}
}; #endif // WATERSHEDSEGMENTER

main.cpp

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "watershedsegmenter.h" using namespace std;
using namespace cv; int main()
{
// Read input image 原图
Mat image= imread("/home/osksh/skin_c/dulani_anuradha4.jpg");
if (!image.data)
return ; // Display the image
namedWindow("Original Image");
imshow("Original Image",image); Mat binary,fg,bg;
cvtColor(image,binary,CV_RGBA2GRAY); //Display the binary image
namedWindow("Binary Image");
imshow("Binary Image",binary); // 由二值图像获得前景。腐蚀。移除噪点与微小物体 erode(binary,fg,cv::Mat(),cv::Point(-,-),); // Display the foreground image
namedWindow("Foreground Image");
imshow("Foreground Image",fg); //膨胀二值图来获取背景(只有草地,没有树林)
dilate(binary,bg,cv::Mat(),cv::Point(-,-),);
threshold(bg,bg,,,cv::THRESH_BINARY_INV);
//最后一个参数的表示 ifsrc>1,dst=0,else dst=128。这样就使背景全为灰色(128)
// Display the background image
namedWindow("Background Image");
imshow("Background Image",bg); // Show markers image
Mat markers(binary.size(),CV_8U,cv::Scalar());
markers= fg+bg;//使用重载操作符+
namedWindow("Markers");
imshow("Markers",markers); // Create watershed segmentation object
WatershedSegmenter segmenter; // Set markers and process
segmenter.setMarkers(markers);
segmenter.process(image); // Display segmentation result
namedWindow("Segmentation");
imshow("Segmentation",segmenter.getSegmentation()); // Display watersheds
namedWindow("Watersheds");
imshow("Watersheds",segmenter.getWatersheds()); waitKey();
return ;
}

最新文章

  1. mybatis常见易出错
  2. Linux nginx 配置 location 语法 正则表达式
  3. Node.js爬虫抓取数据 -- HTML 实体编码处理办法
  4. com组件的注册
  5. Xcode升级后插件失效的原理与修复办法
  6. shell 常用
  7. HTML中属性ID和属性NAME的区别(转)
  8. PHP页面静态化(转)
  9. [转] Hive 内置函数
  10. 【2017-05-19】WebForm复合控件
  11. lua API 小记2
  12. “Django用户认证系统”学习资料收集
  13. @cacheevict 清除多个key
  14. 如何解析超长的protobuf zhuan
  15. ABP中针对sql2008的数据库配置
  16. php 采集爬取单个淘宝商品描述,商品属性
  17. Java方法重载的区分
  18. day1-课堂笔记
  19. Idea卡在Maven导入工程
  20. centos6.8 安装Python2.7后, yum出现“No module named yum”错误

热门文章

  1. Python3.x:正则 re.findall()的用法
  2. 20145313Java第五次实验
  3. 收藏 19 个 ES6常用的简写技巧
  4. asm-3.3.1.jar详解 (转)
  5. hadoop 3.1.1 安装
  6. LeetCode——remove-duplicates-from-sorted-list
  7. rsync | scp文件同步命令使用
  8. [Network Architecture]ResNext论文笔记(转)
  9. spring boot2.1读取 apollo 配置中心3
  10. JavaScript封装Ajax工具函数及jQuery中的ajax,xhr在IE的兼容