opencv图像分析

 

分割

漫水填充

漫水填充常用于标记或隔离图像中部分以做进一步的处理,也可以用于从输入图像中导出可以由后续例程使用的掩膜,以加速处理过程或限制为仅由掩膜指示的那些像素

先选取一个种子点,然后将所有与它相似的点上色

如果像素灰度值与任一当前像素差异在指定范围内或在指定原始种子像素灰度值的指定范围内,cv::floodFill()将其上色

漫水填充的结果是一个单连通区域

  • Step1:选择种子点$(x,y)$;
  • Step2:以种子点为中心,判断4邻域或者8邻域的像素值与种子点像素值的差值,将差值小于阈值的像素点添加进区域内。
  • Step3:将新加入的像素点作为新的种子点,反复执行Step2,直到没有新的像素点被添加进该区域。

漫水填充的掩膜不太懂,和灰度归一化有关

分水岭算法

opencv改进的分水岭算法可以提前标记。(人工或用算法)

每一个线条代表了一个种子,线条的不同灰度值其实代表了对不同注水种子的编号,有多少不同灰度值的线条,就有多少个种子,图像最后分割后就有多少个区域。

一般用轮廓带入mark,有效减少噪声和过度分割

输出时markers所有非零像素都会被设定为给定标记中的一个,区域的边界设为-1

Grabcuts算法

Grabcut是基于图割(graph cut)实现的图像分割算法,它需要用户输入一个bounding box作为分割目标位置,实现对目标与背景的分离/分割

Grabcut分割速度快,效果好,支持交互操作,因此在很多APP图像分割/背景虚化的软件中可以看到其身影

与Graph cut区别:

··Graph Cut的目标和背景的模型是灰度直方图,Grab Cut取代为RGB三通道的混合高斯模型GMM

··Graph Cut需要用户指定目标和背景的一些种子点,但是Grab Cut只需要提供背景区域的像素集就可以了。也就是说你只需要框选目标,那么在方框外的像素全部当成背景

··Graph Cut的能量最小化(分割)是一次达到的,而Grab Cut取代为一个不断进行分割估计和模型参数学习的交互迭代过程

(有点类似机器学习的KMeans聚类方法,给每个区域一个高斯模型,不断迭代更新)

Mean-Shift分割算法

找到空间上颜色分布的峰值,输出是一个“色调分离”的新图像,除了精细纹理,颜色梯度大部分变得平坦

Mean Shift的基本思路是,从每个像素开始,首先估计有相似颜色的邻近像素点的密度(局部密度)的梯度,而后利用迭代算法求出局部密度的峰值(即重心点),把能够聚类到同一个峰值点的所有像素点划分成一个区域。

该算法首先在尺寸最小的图像层中进行分类,之后将结果传播到尺寸较大的图像层,并且仅在颜色与上一层颜色差异大于滑动窗口颜色幅度的像素上再次进行分类,从而使得颜色区域的边界更清晰。

使用cv::pyrMeanShiftFiltering()分割

函数严格来说并不是图像的分割,而是图像在色彩层面的平滑滤波,它可以中和色彩分布相近的颜色,平滑色彩细节,侵蚀掉面积较小的颜色区域,所以在Opencv中它的后缀是滤波“Filter”,而不是分割“segment”