OpenCV笔记 距离变换

2022年8月3日12:15:13

一、距离图像

距离变换于被广泛应用于图像分析、计算机视觉、模式识别等领域,人们利用它来实现目标细化、骨架提取、形状插值及匹配、粘连物体的分离等。距离变换的图像是二值图像针。二值图像可以做事两个部分组成的前景目标和背景,前景目标的像素值为1,背景的像素值为0;距离变换的结果是一幅灰度级图像,即距离图像,图像中每个像素的灰度值为该像素与距其最近的背景像素间的距离。
距离变换算法主要采用两类距离测度:非欧式距离和欧式距离。

1. 欧式距离:其物理意义表示距离小于等于某一个值得像素中心(x,y)且半径为R的圆平面,r

如上图所示,p1h和p2 ,dist=1.4.14

2. 棋盘距离:是指数字栅格上像素按照对角线方向移动形成的距离

如上图所示,p1h和p2 ,dist=2

3. 曼哈顿距离:从起点到终点所需要的最小步数,只允许横向移动和纵向移动

如上图所示,p1h和p2 ,dist=1

 例如:如下1表示前景目标,0表示背景,则曼哈顿(城市街区)距离:

 算子解释

 void cv::distanceTransform(
  InputArray  src,  // cv_8U的单通道的图像
  OutputArray  dst, // 输出图像, cv_8U或者CV_32F
  OutputArray  labels,// 二维的标签数组(离散Voronoi图),与输入图像具有相同的尺寸,数据类型为CV_32S的单通道数据
  int  distanceType, // 计算距离的方法  DIST_USER   -1 ,表示用户自定义距离
                                          CV_DIST_L1,  1, 曼哈顿距离(城市街区距离)  距离的计算是精确的
                                          CV_DIST_L2,  2,  欧式距离 计算有某些相对误差 (5×5 mask 给出更精确的结果) 
                                          CV_DIST_C    3,  棋盘距离  距离的计算是精确的

  int  maskSize,// 掩码大小  :DIST_MASK_3(3×3)和DIST_MASK_5(5×5)
  int  labelType = DIST_LABEL_CCOMP  //labelType == DIST_LABEL_CCOMP时,该函数会自动在输入图像中找到0像素的连通分量,并用不同的标签标记它们。当labelType == DIST_LABEL_CCOMP时,该函数扫描输入图像并用不同的标签标记所有0像素。
  )

距离变换算法步骤:

1.将图像进行二值化,子图像值为0,背景为255;

2.利用Mask 1从左向右,从上到下扫描,p点是当前像素点,q点是Mask 1中AL邻域中的点,D为距离计算,包括棋盘距离、城市距离和欧式距离。Fpp为p点的像素值,计算

F(p) = min( F(p),  F(q)+D(p,q) ), 其中,q属于AL.

3.再利用Mask 2从右向左,从下向上扫描

Fpp = minF(pF(p, Fqq+Dp,qp,q ), 其中,q属于BR

4.Fpp 则为距离变换后的图像。

代码详情请看:距离变换 - 芒果的博客 - 芒果的个人博客

  • 作者:Σίσυφος1900
  • 原文链接:https://blog.csdn.net/weixin_39354845/article/details/122022022
    更新时间:2022年8月3日12:15:13 ,共 1183 字。