什么是图像分割(Image Segmentation)
-
图像分割(Image Segmentation)是图像处理最重要的处理手段之一
-
图像分割的目标是将图像中像素根据一定的规则分为若干(N)个cluster集合,每个集合包含一类像素。
-
根据算法分为监督学习方法和无监督学习方法,图像分割的算法多数都是无监督学习方法 - KMeans
-
从数学角度来看,图像分割是将数字图像划分成互不相交的区域的过程。图像分割的过程也是一个标记过程,即把属于同一区域的像索赋予相同的编号。目的是将图像中像素根据一定的规则分为若干(N)个聚(cluster)集合,每个集合包含一类像素。将对象在背景提取出来。
距离变换与分水岭介绍
可以参考:https://blog.youkuaiyun.com/zhangjunp3/article/details/79672098
距离变换常见算法有两种:
- 不断膨胀/ 腐蚀得到
- 基于倒角距离
分水岭变换常见的算法
- 基于浸泡理论实现
可以参考:https://blog.youkuaiyun.com/zhu_hongji/article/details/81703350
相关API
- (1)距离变换:计算源图像的每个像素到最近的零像素的距离.
distanceTransform(
InputArray src, //8位单通道(二进制)源图像
OutputArray dst, //输出具有计算距离的图像,8位或32位浮点的单通道图像,大小与src相同.
OutputArray labels, //输出二维数组标签labels(离散维诺Voronoi图),类型为 CV_32SC1 ,相同距离的算做同一个 label ,算出总共由多少个 labels
int distanceType, //距离类型 = DIST_L1/DIST_L2
int maskSize, //距离变换的掩膜大小,DIST_MASK_3(maskSize = 3x3),最新的支持DIST_MASK_5(mask = 5x5),//最新的支持5x5,推荐3x3、
int labelType=DIST_LABEL_CCOMP //要生成的标签数组的类型
)
参数四距离可选类型:
参数六标签可选类型: - (2)分水岭:用分水岭算法执行基于标记的图像分割
watershed(
InputArray image, //输入8位3通道图像(输入锐化原图8位3通道)
InputOutputArray markers // 输入或输出32位单通道的标记,和图像一样大小。(输入高峰轮廓标记)
)
处理流程
- 将白色背景变成黑色-目的是为后面的变换做准备
- 使用filter2D与拉普拉斯算子实现图像对比度提高,sharp
- 转为二值图像通过threshold
- 距离变换
- 对距离变换结果进行归一化到[0~1]之间
- 使用阈值,再次二值化,得到标记
- 腐蚀得到每个Peak - erode
- 发现轮廓 – findContours
- 绘制轮廓- drawContours
- 分水岭变换 watershed
- 对每个分割区域着色输出结果
演示代码
程序代码
可以参考:https://blog.youkuaiyun.com/huanghuangjin/article/details/81194552