图像处理之scharr 滤波器

924 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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; 
}

效果图:

原图

2.png

效果图1

3.png

效果图2

4.png

效果图3

5.png