計算梯度幅值和方向

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);
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 不同圖像灰度不同,邊界處一般會有明顯的邊緣,利用此特征可以分割圖像。需要說明的是:邊緣和物體間的邊界并不等同,邊緣...
    大川無敵閱讀 13,925評論 0 29
  • 1、閾值分割 1.1 簡介 圖像閾值化分割是一種傳統的最常用的圖像分割方法,因其實現簡單、計算量小、性能較穩定而成...
    木夜溯閱讀 22,640評論 9 15
  • 這篇文章總結比較全面:http://blog.csdn.net/timidsmile/article/detail...
    rogerwu1228閱讀 1,874評論 0 3
  • 前些天看了一期《奇葩說》,辯題是《高學歷女生做全職太太是浪費嗎》,當時蔡康永說高學歷經歷過什么,是其他人不知道的,...
    卓韻閱讀 469評論 0 3
  • 2017.7.23 1.子知持后,則可言持身矣。 2.“舉而措之天下之民,謂之事業”一切功名富貴都不是事業,只是職...
    微與之期閱讀 1,167評論 0 1