我有每個像素的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.";
}
}
謝謝,但我仍然困惑。什麼是v?我得到的值範圍從0-256。灰度?我如何使用這些信息來畫線? – user3396218
v是一個灰度值。如果通過像這樣計算每個像素值來生成新圖像,則會得到一個圖像,其中每個像素代表該像素處的漸變方向。這只是繪製線條和(以我的經驗)更常用的替代方法。 – anderas
@andreas,我用imwrite並得到了圖像,但它看起來像這個http://i.imgur.com/Cssqmux.png這是沒有像原來的http://i.imgur.com/5PRemmw.png 我試圖用這種方式http://i.imgur.com/SwQfkHR.png。有什麼辦法嗎? – user3396218