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