2014-04-08 38 views
0

我有每個像素的Sobel算子的梯度。在我的情況下320x480。但是,我怎樣才能將它們與方向聯繫起來呢?舉個例子,我打算繪製指紋的方向圖。那麼,我該如何開始?索貝爾的梯度是什麼意思?

它是通過將梯度分成塊(例如16x24),然後將梯度相加在一起並潛水它384得到平均梯度?然後從那裏用平均梯度從塊的中心畫一條線?

糾正我,如果我錯了。謝謝。

這裏是我用來尋找梯度

cv::Mat original_Mat=cv::imread("original.bmp", 1); 

cv::Mat grad = cv::Mat::zeros(original_Mat.size(), CV_64F); 

cv::Mat grad_x = cv::Mat::zeros(original_Mat.size(), CV_64F); 
cv::Mat grad_y = cv::Mat::zeros(original_Mat.size(), CV_64F); 

/// Gradient X 
cv::Sobel(original_Mat, grad_x, CV_16S, 1, 0, 3); 

/// Gradient Y 
cv::Sobel(original_Mat, grad_y, CV_16S, 0, 1, 3); 

short* pixelX = grad_x.ptr<short>(0); 
short* pixelY = grad_y.ptr<short>(0); 

int count = 0; 
int min = 999999; 
int max = -1; 
int a=0,b=0; 

for(int i = 0; i < grad_x.rows * grad_x.cols; i++) 
{ 
    double directionRAD = atan2(pixelY[i], pixelX[i]); 
    int directionDEG = (int)(180 + directionRAD/CV_PI * 180); 

    //printf("%d ",directionDEG); 
    if(directionDEG < min){min = directionDEG;} 
    if(directionDEG > max){max = directionDEG;} 


    if(directionDEG < 0 || directionDEG > 360) 
    { 
     cout<<"Weird gradient direction given in method: getGradients."; 
    } 

} 

回答

1

有幾種方法,以可視化的定向地圖代碼:

如你所說,你可以借鑑它逐塊的,但你將不得不小心「平均」的方向。例如,如果您平均方向0°和180°會發生什麼?

更常見的是,方向只是映射到灰度值。這將可視化每像素的梯度。例如爲:

int v = (int)(128+directionRAD/CV_PI * 128); 

(聲明:不是100%肯定的128,其中一人實際上可能是一個127 ......

或者你可以映射x和y梯度值來的rg組件,分別,理想的梯度向量標準化爲長度1.假設normX之後是在x方向上與和1 -1之間的值的歸一化梯度:

int red = (int)((normX + 1)*127.5); 
int green= (int)((normY + 1)*127.5); 
+0

謝謝,但我仍然困惑。什麼是v?我得到的值範圍從0-256。灰度?我如何使用這些信息來畫線? – user3396218

+0

v是一個灰度值。如果通過像這樣計算每個像素值來生成新圖像,則會得到一個圖像,其中每個像素代表該像素處的漸變方向。這只是繪製線條和(以我的經驗)更常用的替代方法。 – anderas

+0

@andreas,我用imwrite並得到了圖像,但它看起來像這個http://i.imgur.com/Cssqmux.png這是沒有像原來的http://i.imgur.com/5PRemmw.png 我試圖用這種方式http://i.imgur.com/SwQfkHR.png。有什麼辦法嗎? – user3396218

0

平均取決於Sobel內核大小。

使用CV_32FC或CV_64FC代替CV_16S會更好。

你也可以使用cv :: phase方法加速你的代碼。

看到我的答案在這裏:Sobel operator for gradient angle

+0

謝謝。從你的方法獲得的角度與我的方法是一樣的嗎?你能否告訴我如何從這裏開始繪製地圖? – user3396218

+0

我認爲HOG visuzlizer應該是最合適的:(請看這裏)http://www.juergenwiki.de/work/wiki/doku.php?id=public:hog_descriptor_computation_and_visualization –

+0

你也可以繪製並非所有的,但除最大箱或平均(N最強)箱並繪製每個塊的結果。 –