OpenCV使用Sobel和Scharr函数进行梯度计算
一、概述
案例:使用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.输出完整的梯度图像
二、代码示例
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);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
2020-02-17 RxJava2绑定流程分析之——观察者和被观察者是如何实现绑定的