1. 程式人生 > >基於梯度場和Hessian特征值分別獲得圖像的方向場

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

htm name tar 我們 值範圍 con tco png mali

一、?我們想要求的方向場的定義為:
對於任意一點(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 ;i< matTmp.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/libfrangigithub 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);
結果:技術分享





來自為知筆記(Wiz)

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