宁乡市住房和城乡建设局网站,海外服务器ip,目录做排名 网站,会员登录管理系统操作系统#xff1a;ubuntu22.04OpenCV版本#xff1a;OpenCV4.9IDE:Visual Studio Code编程语言#xff1a;C11
功能描述
distanceTransform是OpenCV库中的一个非常有用的函数#xff0c;主要用于计算图像中每个像素到最近的背景#xff08;通常是非零像素到零像素ubuntu22.04OpenCV版本OpenCV4.9IDE:Visual Studio Code编程语言C11
功能描述
distanceTransform是OpenCV库中的一个非常有用的函数主要用于计算图像中每个像素到最近的背景通常是非零像素到零像素的距离。它在计算机视觉和图像处理中有多种应用以下是其中一些主要用途
1.形态学分析
细化Skeletonization距离变换常用于细化图像即获取图像的骨架这对于字符识别、形状分析等很有帮助。膨胀和腐蚀结合距离变换和阈值操作可以实现精确的形态学膨胀和腐蚀。
2.物体分割
确定前景区域距离变换可以帮助确定图像中的前景区域特别是在二值图像中。种子点选择在分水岭算法中距离变换可以用于确定种子点从而更好地分割物体。
3.特征提取
质心定位对于连通组件距离变换可以帮助找到其质心或重心。边缘检测可以用于边缘增强通过分析像素到边界点的距离来突出边缘。
4.路径规划和避障
在机器人导航和路径规划中距离变换可以提供一个关于障碍物距离的信息图帮助规划最优路径。
5.热力图生成
距离变换的结果可以被可视化为热力图展示不同区域的“热度”或重要性。
6.形状描述符
在模式识别中距离变换可以作为形状描述的一部分帮助识别和分类不同的形状。
7.医学影像分析
在医疗图像处理中距离变换可以用于测量结构的厚度或距离例如血管壁的厚度。
cv::distanceTransform函数计算从二值图像中每个像素到最近零像素的近似或精确距离。对于零像素的图像显然距离将为零。
当maskSize等于DIST_MASK_PRECISE且distanceType等于DIST_L2时函数运行在文献[83]中描述的算法。此算法利用TBB库进行了并行化。
在其他情况下使用文献[34]中的算法。这意味着对于每个像素函数寻找到达最近零像素的最短路径该路径由基本移动组成水平、垂直、对角线或骑士移动骑士移动适用于5×5的掩模。总距离被计算为这些基本距离的总和。由于距离函数应当是对称的所以所有的水平和垂直移动必须具有相同的代价记作a所有对角线移动必须具有相同的代价记作b所有骑士移动也必须具有相同的代价记作c。对于DIST_C和DIST_L1类型距离被精确计算而对于DIST_L2欧几里得距离距离只能计算出相对误差5×5掩模给出更准确的结果。对于a、b和cOpenCV使用原论文中提出的值
DIST_L1: a 1, b 2DIST_L2: 3 x 3: a0.955, b1.36935 x 5: a1, b1.4, c2.1969 DIST_C: a 1, b 1
通常为了快速、粗略的距离估算DIST_L2使用3×3掩模。为了更精确的距离估算DIST_L2使用5×5掩模或精确算法。需要注意的是无论是精确算法还是近似算法它们的时间复杂度都是与像素数量线性的。
这种函数变体不仅计算每个像素(x,y)的最小距离还标识出最近的由零像素组成的连通组件当labelType等于DIST_LABEL_CCOMP或最近的零像素当labelType等于DIST_LABEL_PIXEL。组件/像素的索引存储在labels(x, y)中。当labelType等于DIST_LABEL_CCOMP时函数自动在输入图像中查找零像素的连通组件并用不同的标签标记它们。当labelType等于DIST_LABEL_PIXEL时函数遍历输入图像并对所有零像素标记不同的标签。
在这种模式下复杂度仍然是线性的。也就是说该函数提供了一种非常快速的方法来计算二值图像的Voronoi图。目前第二种变体只能使用近似距离变换算法即不支持maskSize DIST_MASK_PRECISE。
函数原型
void cv::distanceTransform
( InputArray src,OutputArray dst,OutputArray labels,int distanceType,int maskSize,int labelType DIST_LABEL_CCOMP
)
参数 src这是输入的8位单通道通常是二值化的源图像。每个像素值要么是0背景要么是255前景函数会计算每个前景像素到最近背景像素的距离。 dst这是输出图像包含计算出的距离信息。它是一个8位或32位浮点型的单通道图像与src图像具有相同的尺寸。每个像素值表示该像素到最近的背景像素的距离。 labels这是输出的二维标签数组离散的Voronoi图。它具有CV_32SC132位整数类型并且与src图像具有相同的尺寸。每个像素值代表了最近的背景像素或背景像素组成的连通组件的标签。 distanceType这指定了距离类型它定义了计算距离的方式具体包括 DIST_L1城市街区距离也称为曼哈顿距离。DIST_L2欧几里得距离。DIST_C棋盘距离也称为无限范数距离。 maskSize这是距离变换所使用的掩模大小。它定义了计算距离时考虑的邻域大小。DIST_MASK_PRECISE在此变体中不受支持。对于DIST_L1或DIST_C距离类型参数被强制为3因为3×3的掩模可以给出与5×5或任何更大窗口相同的距离结果。 labelType这定义了要构建的标签数组的类型具体包括 DIST_LABEL_CCOMP每个连通组件的背景像素都被赋予一个唯一的标签。DIST_LABEL_PIXEL每个背景像素都被赋予一个唯一的标签。
函数原型2 void cv::distanceTransform
( InputArray src,OutputArray dst,int distanceType,int maskSize,int dstType CV_32F
)
参数2
src 这是输入的8位单通道通常是二值化的源图像.dst 这是输出图像包含计算出的距离信息它是一个8位或32位浮点型的单通道图像与src图像具有相同的尺寸。distanceType 距离的类型参见DistanceTypes maskSize 距离变换掩模的大小参见DistanceTransformMasks。在DIST_L1或DIST_C距离类型的情况下该参数被强制为3因为3×3的掩模可以得到与5×5或任何更大孔径相同的结果.dstType 输出图像的类型。它可以是CV_8U或CV_32F。CV_8U类型仅能用于函数的第一个变体并且当distanceType等于DIST_L1时。
示例源码
#include iostream
#include opencv2/opencv.hppint main()
{// 读取图像cv::Mat src cv::imread( /media/dingxin/data/study/OpenCV/sources/images/hawk.jpg, 0 ); // 以灰度模式读取图像if ( src.empty() ){std::cout Error : Image cannot be loaded..!! std::endl;return -1;}cv::Size sz2Sh( 300, 400 );resize( src, src, sz2Sh, 0, 0, cv::INTER_LINEAR_EXACT );// 将图像转换为二值图像cv::Mat binary;cv::threshold( src, binary, 127, 1, cv::THRESH_BINARY );// 计算距离变换cv::Mat dist;cv::distanceTransform( binary, dist, cv::DIST_L2, 3 );// 将距离变换结果归一化到[0,255]范围cv::normalize( dist, dist, 0, 1, cv::NORM_MINMAX );// 显示原始图像和距离变换结果cv::imshow( Source Image, src );cv::imshow( Distance Transform, dist );cv::waitKey( 0 );return 0;
}运行结果
原图
距离变换图