运行环境: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 ;
}

分水岭分割算法(watershed segmentation)的C++实现(法1)的更多相关文章

  1. Matlab的标记分水岭分割算法

    1 综述 Separating touching objects in an image is one of the more difficult image processing operation ...

  2. [ZZ] 基于Matlab的标记分水岭分割算法

    基于Matlab的标记分水岭分割算法 http://blog.sina.com.cn/s/blog_725866260100rz7x.html 1 综述 Separating touching obj ...

  3. 基于Matlab的标记分水岭分割算法

    转自:http://blog.sina.com.cn/lyqmath 1 综述 Separating touching objects in an image is one of the more d ...

  4. 基于标记的分水岭分割算法/OpenCV中距离变换

    Opencv分水岭算法——watershed自动图像分割用法 OpenCV距离变换distanceTransform应用 图像分割作为图像识别的基础,在图像处理中占有重要地位,通常需要在进行图像分割算 ...

  5. 分水岭分割算法(watershed segmentation)的C++实现(法2)

    运行环境:ubuntu16.04+Qt+opencv2.4.13.3 watershed.cpp #include "opencv2/imgproc/imgproc.hpp" #i ...

  6. Opencv分水岭算法——watershed自动图像分割用法

    分水岭算法是一种图像区域分割法,在分割的过程中,它会把跟临近像素间的相似性作为重要的参考依据,从而将在空间位置上相近并且灰度值相近的像素点互相连接起来构成一个封闭的轮廓,封闭性是分水岭算法的一个重要特 ...

  7. 从Random Walk谈到Bacterial foraging optimization algorithm(BFOA),再谈到Ramdom Walk Graph Segmentation图分割算法

    1. 从细菌的趋化性谈起 0x1:物质化学浓度梯度 类似于概率分布中概率密度的概念.在溶液中存在不同的浓度区域. 如放一颗糖在水盆里,糖慢慢溶于水,糖附近的水含糖量比远离糖的水含糖量要高,也就是糖附近 ...

  8. 三维网格分割算法(Random Walks)

    首先以一维随机游走(1D Random Walks)为例来介绍下随机游走(Random Walks)算法,如下图所示,从某点出发,随机向左右移动,向左和向右的概率相同,都为1/2,并且到达0点或N点则 ...

  9. VIPS:基于视觉的页面分割算法[微软下一代搜索引擎核心分页算法]

    VIPS:基于视觉的页面分割算法[微软下一代搜索引擎核心分页算法] - tingya的专栏 - 博客频道 - CSDN.NET VIPS:基于视觉的页面分割算法[微软下一代搜索引擎核心分页算法] 分类 ...

随机推荐

  1. TypeScript 3.3来了!快看看有什么新功能

    翻译:疯狂的技术宅原文:https://github.com/Microsoft/TypeScript/wiki/What's-new-in-TypeScript 本文首发微信公众号:jingchen ...

  2. Junit中的setup和teardown方法

    setup需要@before注解,实现测试前的初始化工作 teardown需要@after注解,测试完成后垃圾回收等后续工作

  3. 为什么说git比svn好

    http://blog.jobbole.com/20069/ git的权限控制,可以借助第三方的工具来实现 也快成使用git的子模块 http://www.cnblogs.com/aga-j/arch ...

  4. ssm中不能访问静态资源问题

    最近用springmvc spring mybatis框架写程序,请求成功并获得数据,唯独css样式不能加载,但路径正确,css文件编码也是utf-8,用火狐debug总是显示未请求到(都快怀疑自己写 ...

  5. Redis之基本数据类型

    Redis 基本数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). redis类型 含义 S ...

  6. linux一键安装nginx脚本

    #!/bin/sh echo "----------------------------------start install nginx ------------------------- ...

  7. Delphi.format填充0

    1. ]);// 一共8位数字不够的补零 2. 3. 4. 5.

  8. HTML5如何做横屏适配

    在移动端中我们经常碰到横屏竖屏的问题,那么我们应该如何去判断或者针对横屏.竖屏来写不同的代码呢. 首先在head中加入如下代码: 1 <meta name="viewport" ...

  9. unity3D用什么语言开发好?

    unity3D用什么语言开发好? 一.总结 一句话总结:选c# 同时U3D团队也会把支持的重心转移到C#,也就是说文档和示例以及社区支持的重心都在C#,C#的文档会是最完善的,C#的代码实例会是最详细 ...

  10. zabbix自动化运维学习笔记(服务器配置)

    继上次博主整理的安装后,这次是配置步骤 首先打开zabbix的安装web地址   http://xx.xx.xx.xx/zabbix/setup.php  xx.xx.xx.xx是服务器的IP地址 由 ...