功能说明:
distanceTransform:用于计算图像中每一个非零点距离离自己最近的零点的距离;
distanceTransform的第二个Mat矩阵参数dst保存了每一个点与最近的零点的距离信息,图像上越亮的点,代表了离零点的距离越远。
该函数有两个初始化API:
void distanceTransform(InputArray src, OutputArray dst, int distanceType, int maskSize)
void distanceTransform(
InputArray src,
OutputArray dst,
OutputArray labels,
int distanceType,
int maskSize,
int labelType=DIST_LABEL_CCOMP )
参数说明:
- src – 8-bit, 单通道(二值化)输入图片。
- dst – 输出结果中包含计算的距离,这是一个32-bit float 单通道的Mat类型数组,大小与输入图片相同。
- distanceType – 计算距离的类型那个,可以是 CV_DIST_L1、CV_DIST_L2 、CV_DIST_C。
- maskSize – 距离变换掩码矩阵的大小,可以是:
3(CV_DIST_L1、 CV_DIST_L2 、CV_DIST_C)
5(CV_DIST_L2 )
CV_DIST_MASK_PRECISE (这个只能在有4参数的API中使用)
- labels – 可选的2D标签输出(离散 Voronoi 图),类型为 CV_32SC1 大小同输入图片。
- labelType – 输出标签的类型,这里有些两种。
- labelType==DIST_LABEL_CCOMP 将周围较近的白色像素点作为一个整体计算其到黑色边缘的距离
- labelType==DIST_LABEL_PIXEL 单独计算每个白色像素点到其黑色边缘的距离.
distanceType参数说明:
distanceType | maskSize | a \ b \ c |
CV_DIST_C | 3(3X3) | a = 1, b = 1 |
CV_DIST_L1 | 3(3X3) | a = 1, b = 2 |
CV_DIST_L2 | 3(3X3) | a=0.955, b=1.3693 |
CV_DIST_L2 | 5(5X5) | a=1, b=1.4, c=2.1969 |
其中 a b c 含义:在这个函数中计算每个白色像素到黑色像素(0值像素)的最短距离,因此需要通过最短的移动方式找到这个点兵计算他们之间的值。通常来说移动有水平方向、竖直方向、对角方向、跳跃式几个移动方法。虽然计算距离的方法都是一些很基础的公式,但是这个这个掩码矩阵必须是对阵的(这里插一句,要求对是式为了卷积计算的过程可以使用加速算法),因此掩码矩阵上所有水平和竖直方向的变化量(原文是must have the same shift cost ),这里用 a 代表;对角方向的变化量用 b 代表;跳跃移动的变化量用 c 代表。CV_DIST_C、CV_DIST_L1、CV_DIST_L2(maskSize=5)的计算结果是精确的,CV_DIST_L2(maskSize=3)是一个快速计算方法。