当前位置: 首页 > news >正文

山东网站建设和游戏开发的公司排名如何制作境外网站

山东网站建设和游戏开发的公司排名,如何制作境外网站,城乡建设部官网,西安网站建设项目OpenCV学习(二十) #xff1a;分水岭算法:watershed() 参考博客#xff1a; OpenCV—分水岭算法 图像处理——分水岭算法 OpenCV学习(7) 分水岭算法(1) Opencv分水岭算法——watershed自动图像分割用法 -牧野- 分水岭算法是一种图像区域分割法#xff0c;在分割的过程中分水岭算法:watershed() 参考博客 OpenCV—分水岭算法 图像处理——分水岭算法 OpenCV学习(7) 分水岭算法(1) Opencv分水岭算法——watershed自动图像分割用法 -牧野- 分水岭算法是一种图像区域分割法在分割的过程中它会把跟临近像素间的相似性作为重要的参考依据从而将在空间位置上相近并且灰度值相近求梯度的像素点互相连接起来构成一个封闭的轮廓。分水岭算法常用的操作步骤彩色图像灰度化然后再求梯度图最后在梯度图的基础上进行分水岭算法求得分段图像的边缘线。 1、watershed()函数 void watershed( InputArray image, // 必须是一个8bit 3通道彩色图像矩阵序列 InputOutputArray markers // markers必须包含了种子点信息算法会根据markers传入的轮廓作为种子也就是所谓的注水点 //对图像上其他的像素点根据分水岭算法规则进行判断并对每个像素点的区域归属进行划定 //直到处理完图像上所有像素点。而区域与区域之间的分界处的值被置为“-1”以做区分。markers 在将图像传递给函数之前您必须粗略地勾勒出索引为正(0)的图像标记中的所需区域。 因此每个区域都表示为一个或多个具有像素值1,2,3的连接组件以此类推。 可以使用findcontours()和drawcontours()从二进制掩码中检索这些标记。这些标记是未来图像区域的“种子”。 标记中的所有其他像素如果它们与轮廓区域的关系未知应该由算法定义则应该设置为0。 在函数输出中标记中的每个像素被设置为“seed”组件的值或者在区域之间的边界处设置为-1。 ); 2、示例一手动添加 markers watershed图像自动分割的实现步骤 1图像灰度化、滤波、Canny边缘检测 2查找轮廓并且把轮廓信息按照不同的编号绘制到watershed的第二个入参merkers上相当于标记注水点。 3watershed分水岭运算 4绘制分割出来的区域视觉控还可以使用随机颜色填充或者跟原始图像融合以下以得到更好的显示效果。 #include opencv2/opencv.hppusing namespace cv; using namespace std;#define WINDOW_NAME1 【程序窗口1】 //为窗口标题定义的宏 #define WINDOW_NAME2 【分水岭算法效果图】 //为窗口标题定义的宏Mat g_maskImage, g_srcImage; Point prevPt(-1, -1);int main() {//输出一些帮助信息printf( \n\n\n\t欢迎来到【分水岭算法】示例程序~\n\n);printf( \t请先用鼠标在图片窗口中标记出大致的区域\n\n\t然后再按键【1】或者【SPACE】启动算法。\n\n\t按键操作说明: \n\n\t\t键盘按键【1】或者【SPACE】- 运行的分水岭分割算法\n\t\t键盘按键【2】- 恢复原始图片\n\t\t键盘按键【ESC】- 退出程序\n\n\n);//【1】载入原图并显示初始化掩膜和灰度图g_srcImage imread(F:/C/2. OPENCV 3.1.0/TEST/1.jpg, 1);imshow( WINDOW_NAME1, g_srcImage );Mat srcImage,grayImage;g_srcImage.copyTo(srcImage);cvtColor(g_srcImage, g_maskImage, COLOR_BGR2GRAY); // 彩色图转灰度图cvtColor(g_maskImage, grayImage, COLOR_GRAY2BGR); // 转回三通道图g_maskImage Scalar::all(0);//【2】设置鼠标回调函数setMouseCallback( WINDOW_NAME1, on_Mouse, 0 );//【3】轮询按键进行处理while(1){//获取键值int c waitKey(0);//若按键键值为ESC时退出if( (char)c 27 )break;//按键键值为2时恢复源图if( (char)c 2 ){g_maskImage Scalar::all(0);srcImage.copyTo(g_srcImage);imshow( image, g_srcImage );}//若检测到按键值为1或者空格则进行处理if( (char)c 1 || (char)c ){//定义一些参数int i, j, compCount 0;vectorvectorPoint contours;vectorVec4i hierarchy;//寻找轮廓findContours(g_maskImage, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);//轮廓为空时的处理if( contours.empty() )continue;//拷贝掩膜Mat maskImage(g_maskImage.size(), CV_32S); //maskImage Scalar::all(0);//循环绘制出轮廓for( int index 0; index 0; index hierarchy[index][0], compCount )drawContours(maskImage, contours, index, Scalar::all(compCount1), -1, 8, hierarchy, INT_MAX);//compCount为零时的处理if( compCount 0 )continue;//生成随机颜色vectorVec3b colorTab;for( i 0; i compCount; i ){int b theRNG().uniform(0, 255);int g theRNG().uniform(0, 255);int r theRNG().uniform(0, 255);colorTab.push_back(Vec3b((uchar)b, (uchar)g, (uchar)r));}// 计算处理时间并输出到窗口中double dTime (double)getTickCount();// 分水岭算法watershed( srcImage, maskImage ); dTime (double)getTickCount() - dTime;printf( \t处理时间 %gms\n, dTime*1000./getTickFrequency() );//双层循环将分水岭图像遍历存入watershedImage中Mat watershedImage(maskImage.size(), CV_8UC3);for( i 0; i maskImage.rows; i )for( j 0; j maskImage.cols; j ){int index maskImage.atint(i,j);if( index -1 )watershedImage.atVec3b(i,j) Vec3b(255,255,255);else if( index 0 || index compCount )watershedImage.atVec3b(i,j) Vec3b(0,0,0);elsewatershedImage.atVec3b(i,j) colorTab[index - 1];}//混合灰度图和分水岭效果图并显示最终的窗口watershedImage watershedImage*0.5 grayImage*0.5;imshow( WINDOW_NAME2, watershedImage );}}waitKey(0);return 0; }鼠标回调函数 static void on_Mouse( int event, int x, int y, int flags, void* ) {// 1处理鼠标不在窗口中的情况if( x 0 || x g_srcImage.cols || y 0 || y g_srcImage.rows )return;// 2处理鼠标左键相关消息if( event CV_EVENT_LBUTTONUP || !(flags CV_EVENT_FLAG_LBUTTON) )prevPt Point(-1,-1);else if( event CV_EVENT_LBUTTONDOWN )prevPt Point(x,y);// 3鼠标左键按下并移动绘制出白色线条else if( event CV_EVENT_MOUSEMOVE (flags CV_EVENT_FLAG_LBUTTON) ){Point pt(x, y); // 当前坐标值if( prevPt.x 0 )prevPt pt;line( g_maskImage, prevPt, pt, Scalar::all(200), 5, 8, 0 ); // 掩模图line( g_srcImage, prevPt, pt, Scalar::all(200), 5, 8, 0 ); //prevPt pt;imshow(WINDOW_NAME1, g_srcImage);} }结果 3、示例二自动添加 markers int main() {//1、载入原图并显示初始化掩膜和灰度图Mat image imread(F:/C/2. OPENCV 3.1.0/TEST/1.jpg, 1);imshow(Source Image,image);// 2、灰度化滤波Canny边缘检测Mat imageGray;cvtColor(image,imageGray,CV_RGB2GRAY);//灰度转换GaussianBlur(imageGray,imageGray,Size(5,5),2); //高斯滤波imshow(Gray Image,imageGray);Canny(imageGray,imageGray,80,150);imshow(Canny Image,imageGray);// 3、查找轮廓vectorvectorPoint contours;vectorVec4i hierarchy;findContours(imageGray,contours,hierarchy,RETR_TREE,CHAIN_APPROX_SIMPLE,Point());Mat imageContoursMat::zeros(image.size(),CV_8UC1); //轮廓Mat marks(image.size(),CV_32S); //Opencv分水岭第二个矩阵参数marksScalar::all(0);int index 0;int compCount 0;for( ; index 0; index hierarchy[index][0], compCount ){// 4、对marks进行标记对不同区域的轮廓进行编号相当于设置注水点有多少轮廓就有多少注水点drawContours(marks, contours, index, Scalar::all(compCount1), 1, 8, hierarchy); // 每个轮廓的标记点不一样drawContours(imageContours,contours,index,Scalar(255),1,8,hierarchy);}//我们来看一下传入的矩阵marks里是什么东西Mat marksShow;convertScaleAbs(marks,marksShow); // 转换前的 marker 图imshow(marksBefore,marksShow);imshow(imageContours 轮廓,imageContours);// 5、分水岭算法watershed(image,marks);// 6、我们再来看一下分水岭算法之后的矩阵marks里是什么东西Mat afterWatershed;convertScaleAbs(marks,afterWatershed); // 转换后的 marker 图imshow(After Watershed,afterWatershed);// 7、对每一个区域进行颜色填充Mat PerspectiveImageMat::zeros(image.size(),CV_8UC3);for(int i0;imarks.rows;i){for(int j0;jmarks.cols;j){int indexmarks.atint(i,j);if(marks.atint(i,j)-1){PerspectiveImage.atVec3b(i,j)Vec3b(255,255,255);}else{PerspectiveImage.atVec3b(i,j) RandomColor(index);}}}imshow(After ColorFill,PerspectiveImage);//分割并填充颜色的结果跟原始图像融合Mat wshed;addWeighted(image,0.4,PerspectiveImage,0.6,0,wshed);imshow(AddWeighted Image,wshed);waitKey(0);return 0; }Vec3b RandomColor(int value) //生成随机颜色函数 {valuevalue%255; //生成0~255的随机数RNG rng;int aarng.uniform(0,value);int bbrng.uniform(0,value);int ccrng.uniform(0,value);return Vec3b(aa,bb,cc); }3、基于距离的分水岭算法 使用分水岭算法进行图像分割一获取灰度图像二值化图像进行形态学操作消除噪点   二在距离变换前加上一步操作通过对上面形态学去噪点后的图像进行膨胀操作可以得到大部分都是背景的区域原黑色不是我们需要的部分是背景   三使用距离变换distanceTransform获取确定的前景色 相关知识补充重点   四在获取了背景区域和前景区域其实前景区域是我们的种子我们将从这里进行灌水向四周涨水但是这个需要在markers中表示后这两个区域中有未重合部分注1怎么办首先确定这些区域寻找种子    开始获取未知区域unknown栅栏会创建在这一区域为下一步获取种子做准备    五获取了这些区域我们可以获取种子这是通过connectedComponents实现,获取masker标签确定的前景区域会在其中显示为以1开始的数据这就是我们的种子会从这里开始漫水   重点   六根据未知区域unknown在markers中设置栅栏并将背景区域加入种子区域一起漫水   七根据种子开始漫水让水漫起来找到最后的漫出点栅栏边界越过这个点后各个山谷中水开始合并。注意watershed会将找到的栅栏在markers中设置为-1
http://www.yutouwan.com/news/283065/

相关文章:

  • 郑州网站推广公司排名苏州电商系统开发
  • 邢台wap网站建设报价重庆建设岗位培训网站
  • 基金会网站建设登录wordpress数据库
  • 做竞品分析去哪个网站互联网有多少网站
  • 怎做连接网站重庆知名设计公司有哪些
  • 大网站开发语言石家庄网站建设公司哪家好
  • 做宠物网站心得网站开发入股合作分配比例
  • php网站开发文本格式设置在网站设计公司上班好吗
  • 网站开发保密合同wordpress 中文文件名
  • 西安网站建设报价方案中国计算机网络公司排名
  • 网站关键字选择标准网站建设风险怎样规避
  • 微商网站模板上海公司排名前十
  • 长沙网建站中国建设银行网站对公账户首页
  • 东莞中赢网站建设公司怎么样建设门户网站需要多少钱
  • 5000多一年的网站建站怎么做物流网站代理
  • dw做网站实例旅游网站的建设开题报告
  • 阜平网站建设电商网站建设意义
  • 茌平做网站推广做网站要买服务器吗
  • 了解网站建设的流程30岁学编程太晚了
  • 如何建设网站哪个济南兴田德润简介免费域名证书申请
  • 做网站前端用什么语言全景网站模版
  • 个人业务网站教程wordpress小图标大全
  • 网站关键词突然没有排名了ppt设计主题
  • 泰安专业网站开发公司h5自适应网站建设是什么意思
  • 网站如何强制修改主页 源码广州智能科技有限公司
  • 学校网站建设意义网站建设如何定价
  • iis网站服务器安全隐患分析网站开发注册个体工商
  • 江西专业网站建设定制细分网站
  • 网站改标题不改版 kwordpress图片主题 瀑布流经典
  • 网站策划素材做网站如何获得阿里巴巴投资