使用OpenCV的Sobel操作计算图像梯度方向

善良的

我正在尝试使用OpenCV的Sobel方法的结果确定图像梯度方向。

我知道这应该是一个非常简单的任务,我想我了解理论,但是实现这一目标比我想象的更具挑战性。

我希望梯度方向在0-360度之间,但是我的代码显示所有梯度都在180-270度之间。

我提交了此代码的先前版本,其中包括整数除法问题。我已经解决了这个问题,但是它并没有解决方向角受限的问题。

我已经遍历了所有代码,但是看不到哪里出了问题?谁能发现我的错误?

谢谢。

void getGradients(IplImage* original, cv::Mat* gradArray)
{
cv::Mat original_Mat(original, true);

// Convert it to gray
cv::cvtColor( original_Mat, original_Mat, CV_RGB2GRAY );
//cv::blur(original_Mat, original_Mat, cv::Size(7,7));

/// Generate grad_x and grad_y
cv::Mat grad_x = cv::Mat::zeros(original->height, original->width, CV_16S); 
cv::Mat grad_y = cv::Mat::zeros(original->height, original->width, CV_16S);

/// 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);

uchar* pixelX = grad_x.data;
uchar* pixelY = grad_y.data;
uchar* grad1 = gradArray[0].data;
uchar* grad2 = gradArray[1].data;
uchar* grad3 = gradArray[2].data;
uchar* grad4 = gradArray[3].data;
uchar* grad5 = gradArray[4].data;
uchar* grad6 = gradArray[5].data;
uchar* grad7 = gradArray[6].data;
uchar* grad8 = gradArray[7].data;
int count = 0;
int min = 999999;
int max = -1;

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

        if(directionDEG < min){min = directionDEG;}
        if(directionDEG > max){max = directionDEG;}

        if(directionDEG >= 0 && directionDEG <= 45)         { grad1[i] = 255; count++;}         
        if(directionDEG >= 45 && directionDEG <= 90)        { grad2[i] = 255; count++;}         
        if(directionDEG >= 90 && directionDEG <= 135)       { grad3[i] = 255; count++;}         
        if(directionDEG >= 135 && directionDEG <= 190)      { grad4[i] = 255; count++;}         
        if(directionDEG >= 190 && directionDEG <= 225)      { grad5[i] = 255; count++;}         
        if(directionDEG >= 225 && directionDEG <= 270)      { grad6[i] = 255; count++;}     
        if(directionDEG >= 270 && directionDEG <= 315)      { grad7[i] = 255; count++;}
        if(directionDEG >= 315 && directionDEG <= 360)      { grad8[i] = 255; count++;}

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

}

}

公牛

grad_x并且grad_y是CV_16SC1类型的Mat,也就是说,其中的每个像素占用两个字节。

但是,您声明pixelXpixelY指向8位字节的指针。因此pixelX[1]是第一梯度的第二个字节,而不是第二个梯度。

你需要

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用OpenCV的Sobel操作计算图像梯度方向

来自分类Dev

计算梯度方向

来自分类Dev

如何检测强度梯度方向

来自分类Dev

图像梯度角计算

来自分类Dev

在matlab中使用sobel掩码算子找到梯度

来自分类Dev

使用sobel的奇怪方向图。怎么了?

来自分类Dev

如何使用AWK计算梯度

来自分类Dev

在Matlab中快速计算图像的梯度

来自分类Dev

如何使用OpenCV计算图像的结构张量

来自分类Dev

如何使用OpenCV计算图像的结构张量

来自分类Dev

C ++ AMP在16位图像上使用纹理计算梯度

来自分类Dev

梯度角度的Sobel算子

来自分类Dev

在 Octave 中实现 Sobel 梯度

来自分类Dev

OpenCV Sobel滤镜可产生几乎全黑的图像

来自分类Dev

使用python计算梯度时出错

来自分类Dev

使用OpenCV和Python计算图像上的特殊元素

来自分类Dev

在使用c ++和opencv计算垫子的大小和方向时出错

来自分类Dev

opencv Sobel运算符会计算相关性吗?

来自分类Dev

使用dplyr计算数据帧中的梯度

来自分类Dev

使用Keras / Tensorflow或autograd计算验证误差wrt输入的梯度

来自分类Dev

使用梯度计算拉普拉斯算子

来自分类Dev

如何使用点积计算权重的梯度下降成本?

来自分类Dev

是否可以在react的着陆图像顶部使用线性梯度?

来自分类Dev

计算梯度更新

来自分类Dev

使用OpenCV分割图像

来自分类Dev

OpenCV计算图像坐标中的视差

来自分类Dev

OpenCV检测和计算图像功能

来自分类Dev

C# OpenCV 计算图像中的白点

来自分类Dev

估计图像线梯度(不是像素梯度)