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 所谓图像分割指的是根据灰度.颜色.纹理和形状等特征把图像划分成若干互不交迭的区域,并使这些特征在同一区域内呈现出 ...
随机推荐
- POJ 1458 Common Subsequence(LCS最长公共子序列)
POJ 1458 Common Subsequence(LCS最长公共子序列)解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?c ...
- java反射机制入门3
Method对象的机制与实现 1.Method对象概述 1)java.lang.reflect.Method类是用于表示类中.接口中方法对象的类. 2)可以操作类中私有,以及公有等全部方法. 2.Me ...
- cocos2dx工程
1. create-android-project.sh 进入 pro.android/ ln -s ../Resources ./Resources
- 【转】Plotting texts as graphs with R and igraph
原文转自:http://blog.ynada.com/303 I’ve plotted several word association graphs for this New York Times ...
- Mac上使用Visual Studio Code开发/调试.NET Core代码
Mac上使用Visual Studio Code开发/调试.NET Core代码 .Net Core 1.0终于发布了,Core的一大卖点就是跨平台.这个跨平台不只是跨平台运行,而且可以跨平台开发.今 ...
- Android编程获取网络连接状态(3G/Wifi)及调用网络配置界面
随着3G和Wifi的推广,越来越多的Android应用程序需要调用网络资源,检测网络连接状态也就成为网络应用程序所必备的功能. Android平台提供了ConnectivityManager 类,用 ...
- VC++中的头文件包含问题
在一些大的工程中,可能会包含几十个基础类,免不了之间会互相引用(不满足继承关系,而是组合关系).也就是需要互相声明.好了,这时候会带来一些混乱.如果处理得不好,会搞得一团糟,根据我的经验,简单谈谈自已 ...
- HDU 4741 Save Labman No.004 2013 ACM/ICPC 杭州网络赛
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4741 题意:给你两条异面直线,然你求着两条直线的最短距离,并求出这条中垂线与两直线的交点. 需要注意的是 ...
- android音乐柱状频谱实现
from: http://blog.csdn.net/topgun38/article/details/7663849 原文地址:http://blog.csdn.net/caryee89/artic ...
- Js 30 BOM
小知识点, 1.document.write()方法: 如果document.write()在一个事件中或window.onload=function(){}这个function里, 那么docume ...