distanceTransform函数

来源:互联网 发布:js判断是否是数组 编辑:程序博客网 时间:2024/06/04 01:23

distanceTransform函数

函数的作用:

主要用于计算非零像素到最近零像素点的最短距离。一般用于求解图像的骨骼。。。。

函数调用形式:

C++: void distanceTransform(InputArray src, OutputArray dst, int distanceType, int maskSize)

参数详解:

InputArray src:输入的图像,一般为二值图像

 OutputArray dst:输出的图像

int distanceType:所用的求解距离的类型、

It can be CV_DIST_L1, CV_DIST_L2 , or CV_DIST_C

mask_size  距离变换掩模的大小,可以是 3 或 5. 对 CV_DIST_L1 或 CV_DIST_C 的情况,参数值被强制设定为 3, 因为 3×3 mask 给出 5×5 mask 一样的结果,而且速度还更快。 

mask
用户自定义距离情况下的 mask。 在 3×3 mask 下它由两个数(水平/垂直位量,对角线位移量)组成, 5×5 mask 下由三个数组成(水平/垂直位移量,对角位移和 国际象棋里的马步(马走日))

函数 cvDistTransform 二值图像每一个象素点到它最邻近零象素点的距离。对零象素,函数设置 0 距离,对其它象素,它寻找由基本位移(水平、垂直、对角线或knight's move,最后一项对 5×5 mask 有用)构成的最短路径。 全部的距离被认为是基本距离的和。由于距离函数是对称的,所有水平和垂直位移具有同样的代价 (表示为 a ), 所有的对角位移具有同样的代价 (表示为 b), 所有的 knight's 移动具有同样的代价 (表示为 c). 对类型 CV_DIST_C 和 CV_DIST_L1,距离的计算是精确的,而类型 CV_DIST_L2 (欧式距离) 距离的计算有某些相对误差 (5×5 mask 给出更精确的结果), OpenCV 使用 [Borgefors86] 推荐的值:

CV_DIST_C (3×3):
a=1, b=1
CV_DIST_L1 (3×3):
a=1, b=2
CV_DIST_L2 (3×3):
a=0.955, b=1.3693
CV_DIST_L2 (5×5):
a=1, b=1.4, c=2.1969

下面用户自定义距离的的距离域示例 (黑点 (0) 在白色方块中间): 用户自定义 3×3 mask (a=1, b=1.5)

4.543.533.544.5432.522.5343.52.51.511.52.53.532101233.52.51.511.52.53.5432.522.5344.543.533.544.5

用户自定义 5×5 mask (a=1, b=1.5, c=2)

4.53.53333.54.53.5322233.5321.511.5233210123321.511.5233.5322233.543.53333.54

典型的使用快速粗略距离估计 CV_DIST_L2, 3×3 mask , 如果要更精确的距离估计,使用 CV_DIST_L2, 5×5 mask。

图像的距离变换被定义为一幅新的图像,该图像的每个输出像素被设成与输入像素中0像素最近的距离。显然,典型
的距离变换的输入应为某些边缘图像。在多数应用中,距离变换的输入是例如Canny 边缘检测的检测图像的转换输
出(即边缘的值是0,非边缘的是非0)。

opencv代码:


<span style="font-size:18px;">#include<cv.h>   #include<highgui.h>   #pragma comment(lib, "cv.lib")#pragma comment(lib, "cxcore.lib")#pragma comment(lib, "highgui.lib")int main()  {  IplImage* src = cvLoadImage ("test.png", 1);  IplImage* dst = cvCreateImage (cvGetSize(src), IPL_DEPTH_32F, 1);  IplImage* canny = cvCreateImage (cvGetSize(src), IPL_DEPTH_8U, 1);  cvCvtColor (src, canny, CV_RGB2GRAY);  cvCanny (canny, canny, 100, 200, 3);  cvDistTransform (canny, dst, CV_DIST_WELSCH, 3);  cvNamedWindow ("src", 1);  cvShowImage ("src", src);  cvNamedWindow ("dist", 1);  cvShowImage ("dist", canny);  cvWaitKey (0);  cvReleaseImage (&src);  cvReleaseImage (&canny);  cvReleaseImage (&dst);  return 0;  }  </span>


0 0
原创粉丝点击