码迷,mamicode.com
首页 > 其他好文 > 详细

基于梯度场和Hessian特征值分别获得图像的方向场

时间:2017-08-26 22:47:44      阅读:458      评论:0      收藏:0      [点我收藏+]

标签:win   str   scalar   公式   hessian   否则   运算   view   lte   

一、?我们想要求的方向场的定义为:
对于任意一点(x,y),该点的方向可以定义为其所在脊线(或谷线)位置的切线方向与水平轴之间的夹角:
技术分享
将一条直线顺时针或逆时针旋转 180°,直线的方向保持不变。
因此,指纹方向场的取值范围一般定义为[0,π)或[-π/2, π/2),前闭后开区间的意义在于保证方向场取值的唯一性。
二、基于梯度场计算方向场
论文 《Analyzing Oriented Patterns》 网址:https://wenku.baidu.com/view/f741d931cc175527072208f7.html
概述:核心思想便是对其二倍角的分量进行平均,
流程:给定指纹图像I ,其梯度可以表示为技术分享表示x方向的梯度和y方向的梯度
根据已有的梯度场,分别计算
技术分享
W简单理解就是卷积运算
方向场的计算公式为:
技术分享
继续可得方向场一致性

技术分享
当所有的方向都互相平行时,方向场一致性取最大值 1;反之,当所有的方向都相反时,方向场一致性取最小值 0;在这两种极端情况之间,其值相应的也在 0与 1 之间变化。因此,方向场一致性可以作为方向场有序程度的度量。所以最后结果要做一个0-1之间的normalize.
实现:
//变量
    Mat img = cv::imread"e:/template/finger.bmp",0); 
    Mat matX;Mat matY;
    Mat Gxx;Mat Gyy;Mat Gxy;//和论文标识对应
    Mat matTheta;//方向场 
    Mat matCoh;//方向场一致性
    //实验图片
    /*Mat matTst = Mat(Size(11,11),CV_8UC1,Scalar(0));
    line(matTst,Point(5,0),Point(5,11),Scalar(255));
    line(matTst,Point(0,5),Point(11,5),Scalar(255));*/
    Mat matTst = img.clone();
    //x方向求导
    Sobel(matTst,matX,CV_16SC1,1,0);
    //y方向求导
    Sobel(matTst,matY,CV_16SC1,0,1);
    //转换为float计算,否则后面算爆掉
    matX.convertTo(matX,CV_32FC1);
    matY.convertTo(matY,CV_32FC1);
    //计算3个G
    Gxx = matX.mul(matX);
    Gyy = matY.mul(matY);
    Gxy = matX.mul(matY);
    Mat kernel8 = Mat(Size(8,8),CV_32FC1,Scalar(1));
    filter2D(Gxx,Gxx,Gxx.depth(),kernel8);
    filter2D(Gyy,Gyy,Gyy.depth(),kernel8);
    filter2D(Gxy,Gxy,Gxy.depth(),kernel8);
    //计算方向场
    Mat matTmp = 2 * Gxy;
    matTmp = matTmp / (Gxx - Gxy);
    matTheta = Mat(matTst.size(),CV_32FC1,Scalar(0));
    for (int i = 0 ;imatTmp.rows;i++)
        for (int j = 0 ;j<matTmp.cols;j++)
            matTheta.at<float>(i,j) =     0.5 * atan(matTmp.at<float>(i,j)) + 3.1415926/2;
    //计算方向场一致性
    matTmp = Gxx - Gyy;
    matTmp = matTmp.mul(matTmp);
    Mat matTmp2 =  4*Gxy.mul(Gxy);
    matTmp += matTmp2;
    cv::sqrt(matTmp,matCoh);
    matCoh = matCoh / (Gxx+Gxy);
    //显示结果
    normalize(matTheta,matTheta,0,1,NORM_MINMAX);
    normalize(matCoh,matCoh,0,1,NORM_MINMAX);
结果:
技术分享
技术分享
技术分享
三、基于hessian特征值的方向场
原理:
参考frangi相关知识
代码:https://github.com/ntnu-bioopt/libfrangi
github frangi项目
调用:
//hessian方法
    frangi2d_opts_t opts;
    opts.sigma_start = DEFAULT_SIGMA_START;
    opts.sigma_end = DEFAULT_SIGMA_END;
    opts.sigma_step = DEFAULT_SIGMA_STEP;
    opts.BetaOne = DEFAULT_BETA_ONE//ignore blob-like structures?
    opts.BetaTwo = DEFAULT_BETA_TWO//appropriate background suppression for this specific image, but can change. 
    opts.BlackWhite = true;
    Mat J;Mat Scale;Mat directions;
    img.convertTo(img,CV_32FC1,1.0/255);
    frangi2d(img,J,Scale,directions,opts);

结果:
技术分享








基于梯度场和Hessian特征值分别获得图像的方向场

标签:win   str   scalar   公式   hessian   否则   运算   view   lte   

原文地址:http://www.cnblogs.com/jsxyhelu/p/7436550.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!