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模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓