当前位置:   article > 正文

OpenCV笔记12 距离变换_距离变换图

距离变换图

一、距离图像 

距离变换于被广泛应用于图像分析、计算机视觉、模式识别等领域,人们利用它来实现目标细化、骨架提取、形状插值及匹配、粘连物体的分离等。距离变换的图像是二值图像针二值图像可以做事两个部分组成的前景目标和背景,前景目标的像素值为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表示背景,则曼哈顿(城市街区)距离:

 算子解释

  1. void cv::distanceTransform(
  2. InputArray src, // cv_8U的单通道的图像
  3. OutputArray dst, // 输出图像, cv_8U或者CV_32F
  4. OutputArray labels,// 二维的标签数组(离散Voronoi图),与输入图像具有相同的尺寸,数据类型为CV_32S的单通道数据
  5. int distanceType, // 计算距离的方法 DIST_USER -1 ,表示用户自定义距离
  6. CV_DIST_L1, 1, 曼哈顿距离(城市街区距离) 距离的计算是精确的
  7. CV_DIST_L2, 2, 欧式距离 计算有某些相对误差 (5×5 mask 给出更精确的结果)
  8. CV_DIST_C 3, 棋盘距离 距离的计算是精确的
  9. int maskSize,// 掩码大小 :DIST_MASK_3(3×3)和DIST_MASK_5(5×5)
  10. int labelType = DIST_LABEL_CCOMP //labelType == DIST_LABEL_CCOMP时,该函数会自动在输入图像中找到0像素的连通分量,并用不同的标签标记它们。当labelType == DIST_LABEL_CCOMP时,该函数扫描输入图像并用不同的标签标记所有0像素。
  11. )

 

距离变换算法步骤:

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 则为距离变换后的图像。

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/407092
推荐阅读
相关标签
  

闽ICP备14008679号