图像分割相关算法

前言

图像分割(Image Segmentation)指的是将数字图像细分为多个图像子区域的过程,在OpenCv中实现 了三种跟图像分割相关的算法,它们分别是:分水岭分割算法、金字塔分割算法 以及均值漂移分割算法。它们的使用过程都很简单,下面的文章权且用于记录, 并使该系列保持完整吧。

分水岭分割算法

分水岭分割算法需要您或者先前算法提供标记,该标记用于指定哪些大致区 域是目标,哪些大致区域是背景等等;分水岭分割算法的分割效果严重依赖于提 供的标记。OpenCv中的函数cvWatershed实现了该算法,函数定义如下:

void cvWatershed(const CvArr * image, CvArr * markers)

其中:image为8为三通道的彩色图像;

markers是单通道整型图像,它用不同的正整数来标记不同的区域,下面的代 码演示了如果响应鼠标事件,并生成标记图像。

生成标记图像

//当鼠标按下并在源图像上移动时,在源图像上绘制分割线条
     private void pbSource_MouseMove(object sender,  MouseEventArgs e)
     {
       //如果按下了左键
       if (e.Button == MouseButtons.Left)
       {
         if (previousMouseLocation.X >= 0 &&  previousMouseLocation.Y >= 0)
         {
           Point p1 = new Point((int) (previousMouseLocation.X * xScale), (int)(previousMouseLocation.Y  * yScale));
           Point p2 = new Point((int)(e.Location.X *  xScale), (int)(e.Location.Y * yScale));
           LineSegment2D ls = new LineSegment2D(p1,  p2);
           int thickness = (int)(LineWidth *  xScale);
           imageSourceClone.Draw(ls, new Bgr(255d,  255d, 255d), thickness);
           pbSource.Image = imageSourceClone.Bitmap;
           imageMarkers.Draw(ls, new Gray(drawCount),  thickness);
         }
         previousMouseLocation = e.Location;
       }
     }
     //当松开鼠标左键时,将绘图的前一位置设置为(-1,-1)
     private void pbSource_MouseUp(object sender,  MouseEventArgs e)
     {
       previousMouseLocation = new Point(-1, -1);
       drawCount++;
     }

时间: 2024-10-02 07:50:06

图像分割相关算法的相关文章

数组大小为2n+1-数组相关算法java,找出需求的数据

问题描述 数组相关算法java,找出需求的数据 存在一个数组,数组大小为2n+2,里面有n对个数,例如:1,2,2,3,4,1.(数组是无序的,考虑排序的话一定会超过限制)这,6个数中的单独的数就是3,4,要你用你能想到的最高效率的方法找出来 解决方案 如果数组是连续的则可以用byte[] b = new byte[n+1];然后遍历一遍原数组,将遍历的值放入b的下标中计数,最后为1的那个下标表示数据是单独的. 这样的话总最多做3n+3次操作就能找全单独的数. 如果数组里面的数是无规律的,那么可

赛车游戏相关算法请教

问题描述 赛车游戏相关算法请教 在赛车游戏中,远处的画面根据车速逐渐靠近的算法怎么写呢?就是根据车速画面由远至近的大小变化如何控制? 解决方案 我猜测是根据速度算出,图片显示的数序关系,完后投影映射?

关于图像分割Snake算法(c#)的一些不解之惑,望大神指点

问题描述 关于图像分割Snake算法(c#)的一些不解之惑,望大神指点 我手头有一个别人的代码,是winform程序,其中包含了两个类,分别是FormSnake.cs和SnakeSharp.cs在FormSnake类中的鼠标事件里,用了一个动态数组presetContour来记录鼠标每次每次停留位置的坐标,在SnakeSarp中也定义一个数组snakePoints,我的问题是:presetContour里面是肯定有数据的,而snakePoints是怎么得到这些数据的.我把两个类的代码都放上来,请

浅谈算法和数据结构 十二 无向图相关算法基础

从这篇文章开始介绍图相关的算法,这也是Algorithms在线课程第二部分的第一次课程笔记. 图的应用很广泛,也有很多非常有用的算法,当然也有很多待解决的问题,根据性质,图可以分为无向图和有向图.本文先介绍无向图,后文再介绍有向图. 之所以要研究图,是因为图在生活中应用比较广泛: 无向图 图是若干个顶点(Vertices)和边(Edges)相互连接组成的.边仅由两个顶点连接,并且没有方向的图称为无向图. 在研究图之前,有一些定义需要明确,下图中表示了图的一些基本属性的含义,这里就不多说明. 图的

Java编程中快速排序算法的实现及相关算法优化_java

时间复杂度 平均情况:O(nlgn) 最坏情况:O(n*n),发生在当数据已经是排序状态时 快排算法的基本原理 1.从数据中选取一个值a[i]作为参考 2.以a[i] 为参考,将数据分成2部分:P1.P2,P1中的数据全部≤a[i],P2中的数据全部>a[i],数据变为{{P1}{a[i]}{P2}} 3.将P1.P2重复上述步骤,直到各部分中只剩1个数据 4.数据完成升序排列 基本示例: 原始数据: {3,9,8,5,2,1,6} 第1步:选取第1个数据:3 第2步:将数据分成2部分,左边≤3

栈相关算法

-括号匹配 int match(char * cs, int size); 1.做一个空栈.读入字符直到文件尾. 2.对读入的字符进行判断, 2.1如果字符是一个左括号,则入栈: 2.2如果字符是一个右括号,如果栈空或弹出的左括号不匹配,则匹配失败: 2.3输入结束,如果栈非空,则匹配失败,否则匹配成功. -计算后缀表达式的值(假定后缀表达式正确) int postfixValue(char * expression, int size); 1.做一个空栈,读入字符直到文件尾. 2.对读入的字符

单链表相关算法

[1]打印单链表,void PrintList(List list); 使用一个指针遍历所有链表节点. [2]两个升序链表,打印tarList中的相应元素,这些元素的序号由SeqList指 定,void PrintLots(List tarList, List seqList); 使用两个指针分别遍历两个链表,每次取出序列链表的一个序号后,根据该 序号,到达目标链表指定节点. [3]两个升序链表交集 ,List Intersect(List l1, List l2); [4]两个升序链表并集 ,

OpenCV 1 图像分割--分水岭算法代码

// watershed_test20140801.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" // // ch9_watershed image // This is an exact copy of the watershed.cpp demo in the OpenCV ../samples/c directory // // Think about using a morphologically eroded forground an

国际计算机视觉算法竞赛中科院摘金夺银创佳绩

本报讯(记者蔡文清)记者昨天从中科院自动化研究所获悉,在不久前结束的2010年国际计算机视觉算法竞赛中,该所模式识别国家重点实验室谭铁牛研究员和黄凯奇博士带领的智能视频监控研究团队,从30多个世界顶尖学术研究机构中脱颖而出,取得了冠军和亚军的优异成绩,这一成绩表明我国在该方向的研究已处于国际领先水平. 据介绍,图像目标检测和图像目标分类是计算机视觉中的基本科学问题,也是智能视频监控等计算机视觉应用中的关键技术.计算机视觉相关算法国际公开竞赛每年提供一个极具挑战性的标准图像数据库,用于评估计算机视