(四)用分水岭算法实现图像分割
分水岭变换,是一种流行的图像处理算法,用于快速将图像分割成多个同质区域。若把图像看成是一个拓扑地貌,同类区域相当于陡峭边缘内相对平坦的盆地;算法通过逐步增高水位,将其分割成多个部分。因原始版本算法会过度分割图像,产生很多小的区域,因此OpenCV中提出改进版本,使用一系列预定义标记来引导图像分割的方式。
4.1 实现
分水岭分割法,需要调用cv::watershed函数。输入对象是一个标记图像,图像的像素值为32位有符号整数,每个非零像素代表一个标签。其原理是对图像中部分图像做标记,表明它们所属区域是已知的。
分水岭算法,可根据这个初始化标签确定其他像素所属的区域。本节先建立一个标记图像作为灰度图像,后将其转换成整型图像。把该步骤封装进WatershedSegmenter类,包含指定标记图像和计算分水岭的方法:
class WatershedSegmenter
{
Private:
cv::Mat markers;
Public:
Void setMarkers(const cv::Mat& markerImage)
{
//转换成整数型图像
markerImage.converTo(markers,CV_32S);
}
cv::Mat process(const cv::Mat &image)
{
//应用分水岭
cv::watershed(image,markers);
return markers;
}
}
不同应用程序获得标记的方式各不相同。如,可在预处理过程中识别出一些属于某个感兴趣物体的像素,然后根据初始检测结果,使用分水岭算法划分出整个物体的边缘。如:从二值图像中