opencv之基于距离变换与分水岭的图像分割

什么是图像分割(Image Segmentation)

opencv之基于距离变换与分水岭的图像分割
图像分割(Image Segmentation)是图像处理最重要的处理手段之一
图像分割的目标是将图像中像素根据一定的规则分为若干(N)个cluster集合,每个集合包含一类像素。
根据算法分为监督学习方法和无监督学习方法,图像分割的算法多数都是无监督学习方法 - KMeans

距离变换与分水岭介绍

距离变换

测试点多边形得到结果跟距离变换相似
opencv之基于距离变换与分水岭的图像分割

分水岭

opencv之基于距离变换与分水岭的图像分割
距离变换常见算法有两种

  • 不断膨胀/ 腐蚀得到
  • 基于倒角距离

分水岭变换常见的算法

  • 基于浸泡理论实现

距离变换API cv::distanceTransform

cv::distanceTransform(InputArray src, OutputArray dst, OutputArray labels, int distanceType, int maskSize, int labelType=DIST_LABEL_CCOMP)
distanceType = DIST_L1/DIST_L2,
maskSize = 3x3,最新的支持5x5,推荐3x3、
labels离散维诺图输出
dst输出8位或者32位的浮点数,单一通道,大小与输入图像一致

分水岭API cv::distanceTransform

cv::watershed(InputArray image, InputOutputArray markers)

处理流程

1.将白色背景变成黑色-目的是为后面的变换做准备
2. 使用filter2D与拉普拉斯算子实现图像对比度提高,sharp
3. 转为二值图像通过threshold
4. 距离变换
5. 对距离变换结果进行归一化到[0~1]之间
6. 使用阈值,再次二值化,得到标记
7. 腐蚀得到每个Peak - erode
8.发现轮廓 – findContours
9. 绘制轮廓- drawContours
10.分水岭变换 watershed
11. 对每个分割区域着色输出结果