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);

浙公网安备 33010602011771号