当前位置: 老葡京网站娱乐 > 编程语言 > 算法 > 正文

图像分割相关算法

时间:2010-11-19 博客园 王先荣

老葡京网站娱乐 www.sdguanhua.com 前言

图像分割(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++;
     }