分水岭分割算法(watershed segmentation)的C++实现(法1)
运行环境: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)的更多相关文章
- Matlab的标记分水岭分割算法
1 综述 Separating touching objects in an image is one of the more difficult image processing operation ...
- [ZZ] 基于Matlab的标记分水岭分割算法
基于Matlab的标记分水岭分割算法 http://blog.sina.com.cn/s/blog_725866260100rz7x.html 1 综述 Separating touching obj ...
- 基于Matlab的标记分水岭分割算法
转自:http://blog.sina.com.cn/lyqmath 1 综述 Separating touching objects in an image is one of the more d ...
- 基于标记的分水岭分割算法/OpenCV中距离变换
Opencv分水岭算法——watershed自动图像分割用法 OpenCV距离变换distanceTransform应用 图像分割作为图像识别的基础,在图像处理中占有重要地位,通常需要在进行图像分割算 ...
- 分水岭分割算法(watershed segmentation)的C++实现(法2)
运行环境:ubuntu16.04+Qt+opencv2.4.13.3 watershed.cpp #include "opencv2/imgproc/imgproc.hpp" #i ...
- Opencv分水岭算法——watershed自动图像分割用法
分水岭算法是一种图像区域分割法,在分割的过程中,它会把跟临近像素间的相似性作为重要的参考依据,从而将在空间位置上相近并且灰度值相近的像素点互相连接起来构成一个封闭的轮廓,封闭性是分水岭算法的一个重要特 ...
- 从Random Walk谈到Bacterial foraging optimization algorithm(BFOA),再谈到Ramdom Walk Graph Segmentation图分割算法
1. 从细菌的趋化性谈起 0x1:物质化学浓度梯度 类似于概率分布中概率密度的概念.在溶液中存在不同的浓度区域. 如放一颗糖在水盆里,糖慢慢溶于水,糖附近的水含糖量比远离糖的水含糖量要高,也就是糖附近 ...
- 三维网格分割算法(Random Walks)
首先以一维随机游走(1D Random Walks)为例来介绍下随机游走(Random Walks)算法,如下图所示,从某点出发,随机向左右移动,向左和向右的概率相同,都为1/2,并且到达0点或N点则 ...
- VIPS:基于视觉的页面分割算法[微软下一代搜索引擎核心分页算法]
VIPS:基于视觉的页面分割算法[微软下一代搜索引擎核心分页算法] - tingya的专栏 - 博客频道 - CSDN.NET VIPS:基于视觉的页面分割算法[微软下一代搜索引擎核心分页算法] 分类 ...
随机推荐
- 生产者消费者JAVA实现
三种实现方式: 1. Object对象的wait(),notify(),加synchronize. 2. Lock的await(),signal(). 3. BlockingQueue阻塞队列. Ob ...
- RESTful风格与RESTful Api
REST(representational state transfer)(表述性状态转移),词汇解析: 1.representational 表述性:指资源以用各种形式来表述,包括 XML.JSON ...
- shell小脚本--网速监控
在windows中,我们可以在360等管家软件中显示网速,在linux下想要查看实时的网速怎么办呢?当然在linux下也有很多优秀的软件可以实时显示网络状况!但是在这里我们使用shell脚本来先完成网 ...
- nginx搭建mp4流服务器
流媒体服务器 流媒体指以流方式在网络中传送音频.视频和多媒体文件的媒体形式.相对于下载后观看的网络播放形式而言,流媒体的典型特征是把连续的音频和视频信息压缩后放到网络服务器上,用户边下载边观看,而不必 ...
- svn根据项目来创建目录结构或者根据分支来创建项目结构
假设检出项目的时候,都使用trunk来进行检出 按照项目来创建目录结构 TestPrj版本库 适合一次只检出一个项目的需求 这个版本库的名字无所谓,随便起就好了.因为检出某一个项目的trunk的时候, ...
- Pandas 的使用
1. 访问df结构中某条记录使用loc或者iloc属性.loc是按照index或者columns的具体值,iloc是按照其序值.访问类似于ndarray的访问,用序列分别表示一维和二维的位置. 例如: ...
- 使用IP spoofer 功能
有个问题请教:使用IP spoofer 功能后,很多vuser都会挂掉,这个怎么解决呢? LR
- 【Linux】使用awk批量杀进程
pkill 杀一个用户的所有进程 pkill -u bingo 批量杀进程 使用ps -ef|grep aaa 查出相关进程 使用grep -v grep 过滤掉grep本身产生的进程 使用awk 打 ...
- ADC和RTC的寄存器的读取
ADC的寄存器读取,int adc_read(void){ int result; #if ADSTART==0 result = ADC.ADCDAT0&0x3ff; while(!(ADC ...
- windows系统下,安装多个版本的jdk,java -version
问题描述: 开始安装了 jdk8 后来装了jdk9,可以为项目配置不同的jdk,相安无事: 今天发现软件需要jdk8的环境,结果我的java -version始终是jdk9.0.1: 解决办法:使ja ...