OpenCV使用Sobel和Scharr函数进行梯度计算

1、概述

  案例:使用Sobel和Scharr函数计算梯度图像

  相关函数介绍:  

Sobel (
InputArray Src // 输入图像
OutputArray dst// 输出图像,大小与输入图像一致
int depth // 输出图像深度. 
Int dx.  // X方向,几阶导数
int dy // Y方向,几阶导数. 
int ksize, SOBEL算子kernel大小,必须是1、3、5、7、
double scale  = 1
double delta = 0
int borderType = BORDER_DEFAULT
)
ps:
  1.后三个参数可以不传,直接默认效果就不错
  2.次函数可以分别计算x方向和y方向的梯度
Scharr (
InputArray Src // 输入图像
OutputArray dst// 输出图像,大小与输入图像一致
int depth // 输出图像深度. 
Int dx.  // X方向,几阶导数
int dy // Y方向,几阶导数. 
double scale  = 1
double delta = 0
int borderType = BORDER_DEFAULT
)
ps:
  1.后三个参数可不传直接使用默认
  2.次函数也可以计算x方向的梯度和y方向闪的梯度

  执行步骤:

  1.使用高斯模糊去除噪声

  2.使用cvtColor转灰度图像

  3.使用sobel或者scharr计算x方向和y方向的梯度

  4.使用convertScaleAbs去图像像素绝对值

  5.使用addWeighted对x方向和y方向的梯度进行权重相加得到一个完整的梯度

  6.输出完整的梯度图像

2、代码示例

Mat src = imread(filePath);
    if(src.empty()){
        return;
    }
    imshow("src",src);//输出原图
    Mat sobel_X,sobel_y,scharr_x,scharr_y,sobel_result,scharr_result,dst;
    //高斯模糊去噪声
    GaussianBlur(src,dst,Size(5,5),0);
    //转灰度值
    cvtColor(dst,dst,COLOR_BGR2GRAY);
    //x方向及y方向做地图计算
    Sobel(dst,sobel_X,CV_16S,1,0,3);//此处卷积核大小为1的效果也比较好,如果5以上效果会非常差(仅限我用的那张图片,实际情况需要根据原始图像的线条来)
    Sobel(dst,sobel_y,CV_16S,0,1,3);
    //计算图像像素绝对值并输出
    convertScaleAbs(sobel_X,sobel_X);
    convertScaleAbs(sobel_y,sobel_y);
    //对x及y方向上的梯度图像做权重相加
    addWeighted(sobel_X,0.5,sobel_y,0.5,1,sobel_result);
    imshow("sobel_result",sobel_result);

    //使用Scharr函数计算x方向及y方向的梯度图像
    Scharr(dst,scharr_x,CV_16S,1,0);
    Scharr(dst,scharr_y,CV_16S,0,1);
    //计算绝对值并输出
    convertScaleAbs(scharr_x,scharr_x);
    convertScaleAbs(scharr_y,scharr_y);
    //x方向和y方向进行权重相加
    addWeighted(scharr_x,0.5,scharr_y,0.5,1,scharr_result);
    imshow("scharr_result",scharr_result);

 本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值