Opencv 分水岭分割图片
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
Mat img1, img2, img3, img4, img5,img6,img_result, img_gray1, img_gray2, img_gray3, img_canny1,img_binary1, img_dist1,kernel_1,kernel_2,img_laplance,img_sharp;
char win1[] = "window1";
char win2[] = "window2";
char win3[] = "window3";
char win4[] = "window4";
char win5[] = "window5";
char win6[] = "window6";
char win7[] = "window7";
int thread_value = 100;
int max_value = 255;
RNG rng1(12345);
RNG rng2(1235);
int Demo_Moments();
int Demo_Moments()
{
namedWindow(win1, CV_WINDOW_AUTOSIZE);
namedWindow(win2, CV_WINDOW_AUTOSIZE);
//namedWindow(win3, CV_WINDOW_AUTOSIZE);
img1 = imread("D://images//24.jpg");
//img2 = imread("D://images//1//p5_1.jpg");
if (img1.empty())
{
cout << "could not load image..." << endl;
return 0;
}
imshow(win1, img1);
img1.copyTo(img2);
//背景色变黑色
for (size_t row =0;row<img2.rows;row++)
{
for (size_t col=0;col<img2.cols;col++)
{
//if (img2.at<Vec3b>(row,col)==Vec3b(135,26,95))
if(img2.at<Vec3b>(row,col)[0]>100 && img2.at<Vec3b>(row,col)[0]<150 && img2.at<Vec3b>(row,col)[1]>18 && img2.at<Vec3b>(row, col)[1] <80 && img2.at<Vec3b>(row,col)[2]>80 && img2.at<Vec3b>(row,col)[2]<170)
{
img2.at<Vec3b>(row, col)[0] = 0;
img2.at<Vec3b>(row, col)[1] = 0;
img2.at<Vec3b>(row, col)[2] = 0;
}
}
}
imshow(win2, img2);
img2.copyTo(img_sharp);
//通过拉普拉斯-锐化边缘
kernel_1 = (Mat_<float>(3,3)<<1,1,1,1,-8,1,1,1,1);
filter2D(img2, img_laplance, CV_32F,kernel_1, Point(-1, -1), 0, BORDER_DEFAULT);
img2.convertTo(img_sharp, CV_32F);
img3 = img_sharp - img_laplance;
img3.convertTo(img3, CV_8UC3);
img_laplance.convertTo(img_laplance, CV_8UC3);
imshow(win3, img3);
//转灰度图
cvtColor(img3, img4, CV_BGR2GRAY);
//二值化
threshold(img4, img_binary1, 40, 255, THRESH_BINARY | THRESH_OTSU);
//距离变换
distanceTransform(img_binary1, img_dist1, DIST_L1, 3, 5);
//归一化处理
normalize(img_dist1, img_dist1, 0, 1, NORM_MINMAX);
//imshow(win4,img_dist1);
//距离变换结果二值化
threshold(img_dist1, img_dist1, 0.4, 1, THRESH_BINARY);
//定义腐蚀核大小
kernel_2 = Mat::ones(3,3,CV_8UC1);
//腐蚀二值图
erode(img_dist1, img_dist1, kernel_2, Point(-1, -1));
imshow(win4, img_dist1);
img_dist1.convertTo(img5, CV_8U);
//查找轮廓,标记,得到标记轮廓的图片
vector<vector<Point>> vec_points;
//查找轮廓
findContours(img5, vec_points, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point(0, 0));
//
img6 = Mat::zeros(img1.size(),CV_32SC1);
for (size_t i=0;i<vec_points.size();i++)
{
//drawContours(img6, vec_points, static_cast<int>(i), Scalar(rng1.uniform(0,255), rng1.uniform(0, 255), rng1.uniform(0, 255)),-1);
drawContours(img6, vec_points, static_cast<int>(i), Scalar::all(static_cast<int>(i) + 1), -1);
//drawContours(img6, vec_points, static_cast<int>(i), Scalar(theRNG().uniform(0, 255), theRNG().uniform(0, 255), theRNG().uniform(0, 255)), -1);
}
//circle(img6,Point(5,5),3,Scalar(rng1.uniform(0, 255), rng1.uniform(0, 255), rng1.uniform(0, 255)),-1);
//circle(img6, Point(5, 5), 3, Scalar(theRNG().uniform(0, 255), theRNG().uniform(0, 255), theRNG().uniform(0, 255)), -1);
circle(img6,Point(5,5),3,Scalar(255,255,255),-1);
imshow(win5,img6*3000);
//在标记图片的基础上进行分水岭变换
watershed(img1,img6);
Mat img_mark = Mat::zeros(img6.size(),CV_8UC1);
img6.convertTo(img_mark,CV_8UC1);
//取反
bitwise_not(img_mark,img_mark,Mat());
imshow(win6,img_mark);
//着色
vector<Vec3b> vec_colors;
for (size_t j=0;j<vec_points.size();j++)
{
int color_r = rng2.uniform(0,255);
int color_g = rng2.uniform(0, 255);
int color_b = rng2.uniform(0, 255);
//int color_r = theRNG().uniform(10, 255);
//int color_g = theRNG().uniform(10, 255);
//int color_b = theRNG().uniform(10, 255);
vec_colors.push_back(Vec3b((uchar)color_b,(uchar)color_g,(uchar)color_r));
//vec_colors.push_back(Vec3b((uchar)rng1.uniform(0,255), (uchar)rng1.uniform(0, 255), (uchar)rng1.uniform(0, 255)));
}
img_result = Mat::zeros(img6.size(),CV_8UC3);
for (size_t row=0;row<img6.rows;row++)
{
for (size_t col=0;col<img6.cols;col++)
{
int index_1 = img6.at<int>(row,col);
if (index_1>0 && index_1<=static_cast<int>(vec_points.size()))
{
img_result.at<Vec3b>(row, col) = vec_colors[index_1 -1];
}
else
{
img_result.at<Vec3b>(row, col) = Vec3b(0,0,0);
}
}
}
imshow(win7, img_result);
return 0;
}
int main()
{
Demo_Moments();
waitKey(0);
return 0;
}







Opencv 分水岭分割图片的更多相关文章
- 基于标记的分水岭分割算法/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自动图像分割用法
分水岭算法是一种图像区域分割法,在分割的过程中,它会把跟临近像素间的相似性作为重要的参考依据,从而将在空间位置上相近并且灰度值相近的像素点互相连接起来构成一个封闭的轮廓,封闭性是分水岭算法的一个重要特 ...
- opencv::分水岭图像分割
分水岭分割方法原理 (3种) - 基于浸泡理论的分水岭分割方法 (距离) - 基于连通图的方法 - 基于距离变换的方法 图像形态学操作: - 腐蚀与膨胀 - 开闭操作 分水岭算法运用 - 分割粘连对象 ...
- Matlab的标记分水岭分割算法
1 综述 Separating touching objects in an image is one of the more difficult image processing operation ...
- 用CorelDRAW等分分割图片的方法
在CorelDRAW中,想要将图片等分分割可以通过放置容器来实现,根本不需要裁剪工具和辅助线.例如两等分:首先要建立确定等分的份数,建立长方形或正方形.然后把图片放置容器,调整位置,做无缝拼接就可以了 ...
- 怎么样用opencv将彩色图片转化成像素值只有0和255的灰度图?
分类: OpenCV [Q1]怎么样用opencv将彩色图片转化成像素值只有0和255的灰度图? 进行灰度化,IplImage* pImg = cvLoadImage( "C:\\1.b ...
- csharp通过dll调用opencv函数,图片作为参数
[blog 项目实战派]csharp通过dll调用opencv函数,图片作为参数 一直想做着方面的研究,但是因为这个方面的知识过于小众,也是由于自己找资料的能力比较弱,知道今天才找 ...
- TensorFlow与OpenCV,读取图片,进行简单操作并显示
TensorFlow与OpenCV,读取图片,进行简单操作并显示 1 OpenCV读入图片,使用tf.Variable初始化为tensor,加载到tensorflow对图片进行转置操作,然后openc ...
随机推荐
- win10安装.net3.5 报错解决
在win10光盘里提取“microsoft-windows-netfx3-ondemand-package.cab”安装包 然后放在sxs目录 新建批处理...??Cls@ECHO OFFTITLE ...
- 收藏一下mybatis全局参数配置
http://blog.csdn.net/shaoduo/article/details/54285981
- python+anaconda+pycharm工具包安装
更新额外包 $ conda update conda 更新pip python -m pip install --upgrade pip 更新所有 conda update --all 安装ffmpe ...
- git还原某个特定的文件到之前的版本
场景: 对于某个git控制下的文件进行了修改,但是改的不满意,想退回到改之前的版本.假定该文件为 src/main/main.c 解决方法: 第一步: 在命令行中输入 git log src/main ...
- angular先加载页面再执行事件,使用echarts渲染页面
剧情重现: 在一个页面中有多个小模块,这几个模块是可以拖动调顺序的,并且其中有两个模块使用了echarts渲染, 调整顺序angular插件有成熟的解决方案angular-sortable,https ...
- struts2学习(13)struts2文件上传和下载(1)
一.Struts2文件上传: 二.配置文件的大小以及允许上传的文件类型: 三.大文件上传: 如果不配置上传文件的大小,struts2默认允许上传文件最大为2M: 2097152Byte: 例子实现 ...
- postman 请求 页面出现 Could not get any response 解决方法
1.关闭掉证书 2.再关闭掉代理 3.去掉请求头的Content-Length字段 (或者一个个试请求头的值,看去掉那些就请求成功了) 后记: 网友 @ 重庆张晓祥 提供了个线索确实让我想起以前我从浏 ...
- Java-Runoob-高级教程:Java 文档注释
ylbtech-Java-Runoob-高级教程:Java 文档注释 1.返回顶部 1. Java 文档注释 Java 支持三种注释方式.前两种分别是 // 和 /* */,第三种被称作说明注释,它以 ...
- Java-Runoob:Java 异常处理
ylbtech-Java-Runoob:Java 异常处理 1.返回顶部 1. Java 异常处理 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少 ...
- centos 安装 Splunk
(1).需关闭selinux: 1. vi /etc/sysconfig/selinux SELINUX=disabled (2).开始安装mkdir \splunk http://downl ...