分水岭分割算法
在计算机视觉中我们常常关注的目标特征是颜色和灰度,刻画图像中的两个区域视觉相似性有许多方法,如形状描绘子,颜色特征,距特征等。对于某种场景下的应用,具有独特的纹理对象可以使用一个很好的纹理特征符。针对颜色不同的区域中的单体对象相同的扩展,我们可以使用颜色特征来测量对象的不用部分的相似性。如果物体各个子区域存在单一的颜色分布,我们可以使用颜色特征来测量对象不同部分的相似性。如果物体各个子区域存在单一的颜色分布,我们可以使用颜色特征来测量物体的不同区域的相似性概率。
分水岭分割算法的实现途径有多种,本节是利用图像距离变换来实现的,具体思路为:首先,对源图像进行灰度化,并使用OTSU进行二值化操作;其次,对二值化图像进行形态学开操作,利用distanceTransform完成图像距离变换操作;最后,归一化距离变换的统计图像,并计算相应的连通区域分割块:
示例代码如下:
Mat watershedSegment(Mat & srcImage, int & noOfSegments)
{
Mat grayMat;
Mat otsuMat;
cvtColor(srcImage, grayMat, CV_BGR2GRAY);
imshow("grayMat", grayMat);
// 阈值操作
threshold(grayMat, otsuMat, 0, 255,
CV_THRESH_BINARY_INV + CV_THRESH_OTSU);//使用最大类间方差进行分割,能够很好的分割直方图波峰和波谷不明显的图像
imshow("otsuMat", otsuMat);
// 形态学开操作
morphologyEx(otsuMat, otsuMat, MORPH_OPEN,
Mat::ones(9, 9, CV_8SC1), Point(4, 4), 2);//去除小的干扰像素
imshow("Mor-openMat", otsuMat);
// 距离变换
Mat disTranMat(otsuMat.rows, otsuMat.cols, CV_32FC1);
distanceTransform(otsuMat, disTranMat, CV_DIST_L2, 3);
// 归一化
normalize(disTranMat, disTranMat, 0.0, 1, NORM_MINMAX);
imshow("DisTranMat", disTranMat);
// 阈值化分割图像
threshold(disTranMat, disTranMat, 0.1, 1, CV_THRESH_BINARY);
//归一化统计图像到0-255
normalize(disTranMat, disTranMat, 0.0, 255.0, NORM_MINMAX);
disTranMat.convertTo(disTranMat, CV_