分享

OpenCV笔记:DistTransform的使用方法

 昵称9509713 2015-04-01
DistTransform

计算输入图像的所有非零元素对其最近零元素的距离

void cvDistTransform( const CvArr* src, CvArr* dst, int distance_type=CV_DIST_L2,
int mask_size=3, const float* mask=NULL );
src 
输入 8-比特、单通道 (二值) 图像. 
dst 
含计算出的距离的输出图像(32-比特、浮点数、单通道). 
distance_type 
距离类型; 可以是 CV_DIST_L1, CV_DIST_L2, CV_DIST_C 或 CV_DIST_USER. 
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.5   4.0   3.5   3.0   3.5   4.0   4.5 
4.0   3.0   2.5   2.0   2.5   3.0   4.0
3.5   2.5   1.5   1.0   1.5   2.5   3.5 
3.0   2.0   1.0   0.0   1.0   2.0   3.0 
3.5   2.5   1.5   1.0   1.5   2.5   3.5 
4.0   3.0   2.5   2.0    2.5  3.0   4.0 
4.5   4.0   3.5   3.0    3.5  4.0   4.5

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

4.5   3.5   3.0    3.0   3.0   3.5   4.5 
3.5   3.0   2.0    2.0   2.0   3.0   3.5 
3.0   2.0   1.5    1.0   1.5   2.0   3.0 
3.0   2.0   1.0    0.0   1.0   2.0   3.0 
3.0   2.0   1.5    1.0   1.5   2.0   3.0 
3.5   3.0   2.0    2.0   2.0   3.0   3.5 
4.0   3.5   3.0    3.0   3.0   3.5   4.0

先做参数为100,200的canny转化后计算出结果按照learning opencv书上结果应该是像喷墨了一样。 

 IplImage* src = cvLoadImage("./lena.jpg");
 IplImage* dst = cvCreateImage( cvGetSize(src), IPL_DEPTH_32F,1);
 IplImage* color_dst = cvCreateImage( cvGetSize(src), 8, 1 );
 IplImage* temp=cvCreateImage(cvGetSize(src),8,1);
 cvCvtColor(src, color_dst, CV_BGR2GRAY);  
 cvCanny(color_dst,temp,100,200);
 cvDistTransform(color_dst,dst,CV_DIST_L2,5);
 cvNamedWindow( "Source", 1 );
 cvShowImage( "Source", src );
 cvNamedWindow( "dst", 1 );
 cvShowImage( "dst", dst);
 cvNamedWindow( "temp", 1 );
 cvShowImage( "temp", temp);
 cvWaitKey(0);
 return 0; 


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约