gpt4 book ai didi

c++ - Sobel 的梯度是什么意思?

转载 作者:行者123 更新时间:2023-11-28 06:57:50 27 4
gpt4 key购买 nike

我有每个像素的 Sobel 算子的梯度。在我的例子中是 320x480。但是我怎样才能将它们与方向联系起来呢?例如,我打算绘制指纹方向图。那么,我该如何开始呢?

是将梯度分成 block (例如 16x24),然后将梯度相加并除以 384 以获得平均梯度吗?然后从那里使用平均梯度从 block 的中心画一条线?

如果我错了请纠正我。谢谢。

这是我用来寻找梯度的代码

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.";
}

}

最佳答案

有几种可视化方向图的方法:

正如您所建议的,您可以按 block 绘制它,但是您必须小心“平均”方向。例如,如果将 0° 和 180° 方向平均会怎样?

更常见的是,方向被简单地映射到一个灰度值。这将可视化每个像素的梯度。例如:

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

(免责声明:不能 100% 确定 128,其中一个可能实际上必须是 127...

或者您可以将 x 和 y 梯度幅度分别映射到 rg 分量,最好是在将梯度 vector 归一化为长度 1 之后。假设 normX 是 x 方向上的归一化梯度,其值介于 -1 和 1 之间:

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

关于c++ - Sobel 的梯度是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22933449/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com