基於梯度場和Hessian特征值分別獲得圖像的方向場


一、​我們想要求的方向場的定義為:
對於任意 一點(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);

結果:









免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM