美文网首页
计算梯度幅值和方向

计算梯度幅值和方向

作者: 冻冻妖 | 来源:发表于2017-01-10 16:03 被阅读442次

a.运用一对卷积阵列 (分别作用于X和 Y 方向,这里采用sobel算子):


Gx.png Gy.png

b.使用下列公式计算梯度幅值和方向:


梯度幅值.png

代码:

Mat SobleFilter::sobleFilte(Mat* src_mat,Mat* x_mat,Mat* y_mat,int n)
{
    Mat src=(Mat)*src_mat;
    Mat x_array=(Mat)*x_mat;
    Mat y_array=(Mat)*y_mat;

    Mat dst;
    dst.create( src.rows,src.cols, src.type() );
    double xb,xg,xr,yb,yg,yr;
    int nextX,nextY;
    for(int row=0; row<src.rows; row++)
    {
        for(int col=0; col<src.cols; col++)
        {
            for(int subRow=-n; subRow<=n; subRow++)
            {
                for(int subCol=-n; subCol<=n; subCol++)
                {
                    nextX=col+subCol;
                    nextY=row+subRow;
                    if(nextX < 0)
                    {
                        nextX = 0;
                    }
                    if(nextX > src.cols)
                    {
                        nextX = src.cols;
                    }

                    if(nextY < 0)
                    {
                        nextY = 0;
                    }
                    if(nextY > src.rows)
                    {
                        nextY = src.rows;
                    }
                    xb += x_array.at<double>(subRow+n,subCol+n)* src.at<Vec3b>(nextY,nextX)[0];
                    xg += x_array.at<double>(subRow+n,subCol+n)* src.at<Vec3b>(nextY,nextX)[1];
                    xr += x_array.at<double>(subRow+n,subCol+n)* src.at<Vec3b>(nextY,nextX)[2];

                    yb +=y_array.at<double>(subRow+n,subCol+n)* src.at<Vec3b>(nextY,nextX)[0];
                    yg +=y_array.at<double>(subRow+n,subCol+n)* src.at<Vec3b>(nextY,nextX)[1];
                    yr +=y_array.at<double>(subRow+n,subCol+n)* src.at<Vec3b>(nextY,nextX)[2];

                }
            }

            dst.at<Vec3b>(row,col)[0]=detectNum(sqrt(xb*xb+yb+yb));
            dst.at<Vec3b>(row,col)[1]=detectNum(sqrt(xg*xg+yg+yg));
            dst.at<Vec3b>(row,col)[2]=detectNum(sqrt(xr*xr+yr+yr));

            nextY=0;
            nextX=0;
            xb=xg=xr=0;
            yb=yg=yr=0;
        }
    }
    return dst;
}
///越界检测
int SobleFilter::detectNum(int value)
{
    return value < 0 ? 0 : (value > 255 ? 255 : value);
}

相关文章

  • 计算梯度幅值和方向

    a.运用一对卷积阵列 (分别作用于X和 Y 方向,这里采用sobel算子): b.使用下列公式计算梯度幅值和方向:...

  • OpenCV图像处理(十二)边缘检测算子:Canny算子

    1、Canny边缘检测步骤 ①高斯去噪②Sobel计算梯度幅值和方向③非极大值抑制④滞后阈值,其中的高阈值和低阈值...

  • Canny边缘检测

    边缘检测一般步骤 使用高斯滤波 在x和y方向上使用Sobel滤波器,在此之上求出边缘的强度和边缘的梯度 对梯度幅值...

  • HOG特征描述算子-行人检测

    1. HOG特征简介 HOG特征是一种图像局部特征,基本思路是对图像局部的梯度幅值和方向进行投票,形成基于梯度...

  • 梯度上升和梯度下降

    区别 函数上当前点对应的梯度方向是增大最快的方向,反方向是减小最快的方向 梯度上升 要计算的是函数的极大值,如最大...

  • 机器学习、深度学习 知识点总结及面试题

    一、反向传播思想: 1、计算出输出与标签间的损失函数值,然后计算其相对于每个神经元的梯度,根据梯度方向更新权值。 ...

  • 图片梯度直方图的生成

    参考博客 梯度的计算 梯度模: 梯度方向: 以上都是按照定义计算的 一阶偏导数计算(h = 1):我们发现,L的一...

  • 图像梯度

    图像梯度计算的是图像变化的速度。对于图像的边缘部分,其灰度值变化较大,梯度值也较大。一般情况下,图像梯度计算的是图...

  • 一个tensorflow小例子

    给定x和y,y=a*x+b,用梯度下降法计算a和b的值

  • 图像梯度与Sobel滤波器---OpenCV-Python开发指

    图像梯度 图像梯度计算的是图像变化的速度。对于图像的边缘部分,其灰度值变化较大,梯度值也较大;相反,对于图像中比较...

网友评论

      本文标题:计算梯度幅值和方向

      本文链接:https://www.haomeiwen.com/subject/sknumttx.html