雾看OpenCV(16)——分水岭算法

前言

本节我们将要学习
• 使用分水岭算法基于掩模的图像分割
• 函数:cv2.watershed()

正文

原理

任何一副灰度图像都可以被看成拓扑平面,灰度值高的区域可以被看成是 山峰,灰度值低的区域可以被看成是山谷。我们向每一个山谷中灌不同颜色的 水。随着水的位的升高,不同山谷的水就会相遇汇合,为了防止不同山谷的水 汇合,我们需要在水汇合的地方构建起堤坝。不停的灌水,不停的构建堤坝知 道所有的山峰都被水淹没。我们构建好的堤坝就是对图像的分割。这就是分水 岭算法的背后哲理。

开运算:先腐蚀后膨胀,用于移除由图像噪音形成的斑点。
闭运算:先膨胀后腐蚀,用来连接被误分为许多小块的对象;

函数

cv.distanceTransform()

1.  void cv::distanceTransform(InputArray  src,
2.                                  OutputArray  dst,
3.                                  OutputArray  labels,
4.                                  int  distanceType,
5.                                  int  maskSize,
6.                                  int  labelType = DIST_LABEL_CCOMP 
7.                                  )

src:输入图像,数据类型为CV_8U的单通道图像
dst: 输出图像,与输入图像具有相同的尺寸,数据类型为CV_8U或者CV_32F的单通道图像。
labels:二维的标签数组(离散Voronoi图),与输入图像具有相同的尺寸,数据类型为CV_32S的单通道数据。
distanceType:选择计算两个像素之间距离方法的标志,其常用的距离度量方法在表6-1给出。
maskSize:距离变换掩码矩阵的大小,参数可以选择的尺寸为DIST_MASK_3(3×3)和DIST_MASK_5(5×5).
labelType:要构建的标签数组的类型,可以选择的参数在表6-2给出。

在这里插入图片描述

**欧式距离,**两个像素点之间的直线距离。与直角坐标系中两点之间的直线距离求取方式相同,分别计算两个像素在X方向和Y方向上的距离,之后利用勾股定理得到两个像素之间的距离,数学表示形式如式(6.1)所示。
在这里插入图片描述
根据欧式距离的定义,图像中两个像素之间的距离可以含有小数部分,例如图像中的两个像素点 [公式] 和 [公式] 之间的欧式距离为 [公式] 。在一个5×5的矩阵内,所有像素距离矩阵中心的欧式距离如图6-1所示。
在这里插入图片描述
图6-1 5×5矩阵距离中心位置的欧式距离
**街区距离,**两个像素点X方向和Y方向的距离之和。欧式距离表示的是从一个像素点到另一个像素点的最短距离,然而有时我们并不能以两个点之间连线的方向前进,例如在一个城市内两点之间的连线可能存在障碍物的阻碍,因此从一个点到另一个点需要沿着街道行走,因此这种距离的度量方式被称为街区距离。街区距离就是由一个像素点到另一个像素点需要沿着X方向和Y方向一共行走的距离,数学表示形式如式(6.2)所示。
在这里插入图片描述

根据街区距离的定义,图像中两个像素之间的距离一定为整数,例如图像中的两个像素点 [公式] 和 [公式] 之间的街区距离为 [公式] 。在一个5×5的矩阵内,所有像素距离矩阵中心的街区距离如图6-2所示。
在这里插入图片描述
图6-2 5×5矩阵距离中心位置的街区距离
**棋盘距离,**两个像素点X方向距离和Y方向距离的最大值。与街区距离相似,棋盘距离也是假定两个像素点之间不能够沿着连线方向靠近,像素点只能沿着X方向和Y方向移动,但是棋盘距离并不是表示由一个像素点移动到另一个像素点之间的距离,而是表示两个像素点移动到同一行或者同一列时需要移动的最大距离,数学表示形式如式(6.3)所示。
在这里插入图片描述
根据棋盘距离的定义,图像中两个像素之间的距离一定为整数,例如图像中的两个像素点 [公式] 和 [公式] 之间的欧式距离为 [公式] 。在一个5×5的矩阵内,所有像素距离矩阵中心的棋盘距离如图6-3所示。
在这里插入图片描述
图6-3 5×5矩阵距离中心位置的棋盘距离

cv.threshold

参考

cv.getMeanShiftFiltering

均值偏移滤波(Mean Shift Filtering)

均值偏移滤波是计算机视觉和图像处理中常用的数据聚类算法。对于图像的每个像素(具有物理空间位置和特定颜色信息),计算一组相邻像素(在定义的空间半径和颜色距离内). 物理空间上坐标2个—x、y,色彩空间上坐标3个—R、G、B(或任何3维颜色空间),构成一个5维的空间球体。对于这组相邻像素,将计算新的空间中心点(空间平均值)和新的颜色平均值。这些计算出的平均值将用作下一次迭代的新中心点。所描述的过程将重复进行,直到空间和颜色(或灰度)平均值停止变化为止。在迭代结束时,最终的平均颜色将分配给该迭代的开始位置。

pyrMeanShiftFiltering会多出一个maxLevel参数。当maxLevel>0时,将建立maxLevel+1级别的高斯金字塔(gaussian pyramid),并且上面(均值偏移)的过程首先在最小的层上运行。之后,结果将传递到较大的图层,并且仅在图层颜色与金字塔的较低分辨率图层(上一层)相差超过自定义颜色距离的那些像素上再次运行迭代。这使得颜色区域的边界更加清晰。
code

void pyrMeanShiftFiltering(InputArray src, OutputArray dst, double sp, double sr, int maxLevel=1, TermCriteria termcrit=TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS, 5, 1) )

src —— 源8位3通道图像。
dst —— 与源格式和大小相同的目标图像。
sp —— 空间半径。
sr —— 颜色距离。在这里插入图片描述

maxLevel —— 选填。金字塔的最大级别。
termcrit —— 选填。终止标准:何时停止均值漂移迭代。

cv2.connectedComponents

参考1

参考P173

  1. OpenCV-Python-Tutorial-中文版20160814.pdf
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值