opencv分水岭算法对图像进行切割
先看效果
说明
并用128灰度表示
源代码
class WatershedSegment{
private:
cv::Mat markers;
public:
void setMarkers(const cv::Mat &image){
image.convertTo(markers,CV_32S);
}
cv::Mat process(const cv::Mat &image) {
// Apply watershed
cv::watershed(image,markers);
markers.convertTo(markers,CV_8U);
return markers;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
cv::Mat image = cv::imread("group.jpg");
cv::Mat binary = cv::imread("binary.bmp",0); //没加0害得我找好久错误的原因。即使"binary.bmp"为二值图像不加0读进来还是3通道
//cv::threshold(image,binary,60,255,CV_THRESH_BINARY); //阈值化操作
//binary = 255 - binary; //让前景变为白色区域
cv::namedWindow("binary",CV_WINDOW_AUTOSIZE);
cv::imshow("binary",binary);
cv::Mat fImage;
cv::erode(binary,fImage,cv::Mat(),cv::Point(-1,-1),6); //binary = 255 - binary; //让前景变为白色区域//腐蚀去掉小的干扰物体得到前景图像
cv::namedWindow("eroded",CV_WINDOW_AUTOSIZE);
cv::imshow("eroded",fImage);
cv::Mat bImage;
cv::dilate(binary,bImage,cv::Mat(),cv::Point(-1,-1),6);
cv::threshold(bImage,bImage,1,128,cv::THRESH_BINARY_INV);//对原始二值图像阈值化并取反,得到背景图像
cv::namedWindow("bImage",CV_WINDOW_AUTOSIZE);
cv::imshow("bImage",bImage);
cv::Mat marker(binary.size(),CV_8U,cv::Scalar(0));
marker = fImage + bImage; //创建标记图像
cv::namedWindow("marker",CV_WINDOW_AUTOSIZE);
cv::imshow("marker",marker);
WatershedSegment segmenter;
segmenter.setMarkers(marker);
cv::Mat segment = segmenter.process(image);
cv::namedWindow("segmenter",CV_WINDOW_AUTOSIZE);
cv::imshow("segmenter",segment);
cv::waitKey(0);
return 0;
}
private:
cv::Mat markers;
public:
void setMarkers(const cv::Mat &image){
image.convertTo(markers,CV_32S);
} cv::Mat process(const cv::Mat &image) { // Apply watershed
cv::watershed(image,markers);
markers.convertTo(markers,CV_8U);
return markers;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
cv::Mat image = cv::imread("group.jpg");
cv::Mat binary = cv::imread("binary.bmp",0); //没加0害得我找好久错误的原因。即使"binary.bmp"为二值图像不加0读进来还是3通道
//cv::threshold(image,binary,60,255,CV_THRESH_BINARY); //阈值化操作
//binary = 255 - binary; //让前景变为白色区域
cv::namedWindow("binary",CV_WINDOW_AUTOSIZE);
cv::imshow("binary",binary); cv::Mat fImage;
cv::erode(binary,fImage,cv::Mat(),cv::Point(-1,-1),6); //binary = 255 - binary; //让前景变为白色区域//腐蚀去掉小的干扰物体得到前景图像
cv::namedWindow("eroded",CV_WINDOW_AUTOSIZE);
cv::imshow("eroded",fImage); cv::Mat bImage;
cv::dilate(binary,bImage,cv::Mat(),cv::Point(-1,-1),6);
cv::threshold(bImage,bImage,1,128,cv::THRESH_BINARY_INV);//对原始二值图像阈值化并取反,得到背景图像
cv::namedWindow("bImage",CV_WINDOW_AUTOSIZE);
cv::imshow("bImage",bImage); cv::Mat marker(binary.size(),CV_8U,cv::Scalar(0));
marker = fImage + bImage; //创建标记图像
cv::namedWindow("marker",CV_WINDOW_AUTOSIZE);
cv::imshow("marker",marker); WatershedSegment segmenter;
segmenter.setMarkers(marker);
cv::Mat segment = segmenter.process(image);
cv::namedWindow("segmenter",CV_WINDOW_AUTOSIZE);
cv::imshow("segmenter",segment);
cv::waitKey(0);
return 0;
}
:
opencv分水岭算法对图像进行切割的更多相关文章
- Opencv分水岭算法——watershed自动图像分割用法
分水岭算法是一种图像区域分割法,在分割的过程中,它会把跟临近像素间的相似性作为重要的参考依据,从而将在空间位置上相近并且灰度值相近的像素点互相连接起来构成一个封闭的轮廓,封闭性是分水岭算法的一个重要特 ...
- opencv学习之路(30)、分水岭算法及图像修补
一.简介 二.分水岭算法 #include "opencv2/opencv.hpp" using namespace cv; void main() { Mat srcImg = ...
- 新手学,java使用分水岭算法进行图像切割(一)
近期被图像切割整的天昏地暗的,在此感谢老朋友周洋给我关于分水岭算法的指点!本来打算等彩色图像切割有个完满的结果再写这篇文章,可是考虑到到了这一步也算是一个阶段,所以打算对图像切割做一个系列的博文,于是 ...
- OpenCV——分水岭算法
分水岭算法,是一种基于拓扑理论的数学形态学的分割方法,其基本思想是把图像看作是测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局部极小值及其影响区域称为集水盆,而集水盆的边界则形 ...
- OpenCV学习(9) 分水岭算法(3)
本教程我学习一下opencv中分水岭算法的具体实现方式. 原始图像和Mark图像,它们的大小都是32*32,分水岭算法的结果是得到两个连通域的轮廓图. 原始图像:(原始图像必须是3通道图像) Mark ...
- OpenCV学习(8) 分水岭算法(2)
现在我们看看OpenCV中如何使用分水岭算法. 首先我们打开一副图像: // 打开另一幅图像 cv::Mat image= cv::imread("../to ...
- OpenCV学习(7) 分水岭算法(1)
分水岭算法主要用于图像分段,通常是把一副彩色图像灰度化,然后再求梯度图,最后在梯度图的基础上进行分水岭算法,求得分段图像的边缘线. 下面左边的灰度图,可以描述为右边的地 ...
- 第八节、图片分割之GrabCut算法、分水岭算法
所谓图像分割指的是根据灰度.颜色.纹理和形状等特征把图像划分成若干互不交迭的区域,并使这些特征在同一区域内呈现出相似性,而在不同区域间呈现出明显的差异性.我们先对目前主要的图像分割方法做个概述,后面再 ...
- 图片分割之GrabCut算法、分水岭算法
https://www.cnblogs.com/zyly/p/9392881.html 所谓图像分割指的是根据灰度.颜色.纹理和形状等特征把图像划分成若干互不交迭的区域,并使这些特征在同一区域内呈现出 ...
随机推荐
- shell 脚本中$$,$#,$?分别代表什么意思?
$0 这个程式的执行名字$n 这个程式的第n个参数值,n=1..9$* 这个程式的所有参数,此选项参数可超过9个.$# 这个程式的参数个数$$ 这个程式的PID(脚本运行的当前进程ID号)$! 执行上 ...
- linux-2.6.33移植到FL2440
宿主机:ubuntu10.04 目标机:fl2440 交叉编译器:arm-linux-gcc-3.4.1 交叉编译器路径:/usr/local/arm/3.4.1 要移植的内核版本:linux-2.6 ...
- VC++对象布局的奥秘:虚函数、多继承、虚拟继承
哈哈,从M$ Visual C++ Team的Andy Rich那里又偷学到一招:VC8的隐含编译项/d1reportSingleClassLayout和/d1reportAllClassLayout ...
- 【充电器】小米手机2S电池座充——小米手机官网
ligh@local-host$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.3 [充电器]小米手机2S电池座充--小米手机官网 小米手机2S电池座 ...
- linux命令--sysctl
sysctl sysctl被用来在执行时配置内核参数.这些参数都存储在/proc/sys/(以键-值对形式存储)中.你可以用sysctl来读和写数据 命令参数 variable 要读的键值的名字 ...
- highchats与php结合生成动态统计图
series: [{ type: 'pie', name: 'Browser share', data: [ ['Firefox', 45.0], ['IE', 26.8], { name: 'Chr ...
- CentOS中使用shell的命令补全
习惯debian的用户都知道shell中的自动补全功能非常实用,其中在CentOS中也可以有同样的功能. 只需要安装 bash-completion 包即可. rpm -ivh http://www. ...
- Codeforces 57C Array dp暴力找到规律
主题链接:点击打开链接 的非增量程序首先,计算, 如果不增加的节目数量x, 非减少一些方案是x 答案就是 2*x - n 仅仅需求得x就可以. 能够先写个n3的dp,然后发现规律是 C(n-1, 2* ...
- Android开发之TextView排版问题
下面直接是关于解决该问题的代码(根据别人的代码进行了修正以及测试,保证可以修改字体尺寸.颜色.根据padding调整,如果需要支持其他的格式可以将对应的属性添加至Paint类型的对象中): 1 p ...
- iOS开发之理解iOS中的MVC设计模式
模型-视图-控制器(Model-View-Controller,MVC)是Xerox PARC在20世纪80年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已广泛应用于用户交互应用程 ...