开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第26天
1 scharr 滤波器
我们一般直接称scharr为滤波器,而不是算子。上文已经讲到,它在OpenCV中主要是配合Sobel算子的运算而存在的。下面让我们直接来看看其函数讲解。
2 计算图像差分:Scharr()函数
使用Scharr滤波器运算符计算x或y方向的图像差分。其实它的参数变量和Sobel基本上是一样的,除了没有ksize核的大小。
C++:
void Scharr(
InputArray src,//源图
OutputArray dst,//目标图
int ddepth,//图像深度
int dx,//x方向上的差分阶数
int dy,//y方向上的差分阶数
double scale=1,//缩放因子
double delta=0,// delta值
intborderType=BORDER_DEFAULT//边界模式
)
(1)第一个参数,InputArray类型的src,为输入图像,填Mat类型即可。
(2)第二个参数,OutputArray 类型的dst,即目标图像,函数的输出参数,需要和源图片有一样的尺寸和类型。
(3)第三个参数,int类型的ddepth,输出图像的深度,支持如下 src.depth()和ddepth的组合:
- 若src.depth()=CV_8U,取ddepth=-1/CV_16S/CV_32F/CV_64F
- 若 src.depth()=CV_16U/CV_16S,取ddepth=-1/CV_32F/CV_64F
- 若src.depth()=CV_32F,取ddepth=-1/CV_32F/CV_64F
- 若 src.depth()=CV_64F,取ddepth=-1/CV_64F
(4)第四个参数,int类型dx,x方向上的差分阶数。
(5)第五个参数,int类型dy,y方向上的差分阶数。
(6)第六个参数,double类型的scale,计算导数值时可选的缩放因子,默认值是1,表示默认情况下是没有应用缩放的。我们可以在文档中查阅getDerivKernels的相关介绍,来得到这个参数的更多信息。
(7)第七个参数,double类型的delta,表示在结果存入目标图(第二个参数dst)之前可选的delta值,有默认值0。
(8)第八个参数,int类型的 borderType,边界模式,默认值为BORDER DEFAULT。这个参数可以在官方文档中borderInterpolate处得到更详细的信息。
不难理解,如下两者是等价的,即:
Scharr(src, dst, ddepth, dx, dy, scale, delta, borderType);
与
Sobel(src, dst, ddepth, dx, dy, CV_SCHARR, scale, delta, borderType);
3 示例
代码:
//---------------------------------【头文件、命名空间包含部分】----------------------------
// 描述:包含程序所使用的头文件和命名空间
//---------------------------------------------------------------------------------------
#include <opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
//-----------------------------------【main( )函数】--------------------------------------------
// 描述:控制台应用程序的入口函数,我们的程序从这里开始
//---------------------------------------------------------------------------------------------
int main( )
{
//【0】创建 grad_x 和 grad_y 矩阵
Mat grad_x, grad_y;
Mat abs_grad_x, abs_grad_y,dst;
//【1】载入原始图
Mat src = imread("1.jpg"); //工程目录下应该有一张名为1.jpg的素材图
//【2】显示原始图
imshow("【原始图】Scharr滤波器", src);
//【3】求 X方向梯度
Scharr( src, grad_x, CV_16S, 1, 0, 1, 0, BORDER_DEFAULT );
convertScaleAbs( grad_x, abs_grad_x );
imshow("【效果图】 X方向Scharr", abs_grad_x);
//【4】求Y方向梯度
Scharr( src, grad_y, CV_16S, 0, 1, 1, 0, BORDER_DEFAULT );
convertScaleAbs( grad_y, abs_grad_y );
imshow("【效果图】Y方向Scharr", abs_grad_y);
//【5】合并梯度(近似)
addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, dst );
//【6】显示效果图
imshow("【效果图】合并梯度后Scharr", dst);
waitKey(0);
return 0;
}
效果图:
原图
效果图1
效果图2
效果图3