使用Scharr滤波器运算符计算x或y方向的图像差分。其实它的参数变量和Sobel基本上是一样的,除了没有ksize核的大小。
Scharr(src, grad_y, CV_16S, 0, 1, 1, 0, BORDER_DEFAULT);
- 若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
第八个参数, int类型的borderType,边界模式,默认值为BORDER_DEFAULT。
opencv实例代码如下
#include "stdafx.h"
#include
#include
#include
using namespace cv;
using namespace std;
int main()
{
Mat src,src1,dst,grad_x, grad_y, abs_grad_x, abs_grad_y;
src1 = imread("1.jpg");
imshow("【原始图】", src1);
resize(src1, src, Size(src1.cols / 2, src1.rows / 2), (0, 0), (0, 0), 3);
Scharr(src, grad_x, CV_16S, 1, 0, 1, 0, BORDER_DEFAULT);
convertScaleAbs(grad_x, abs_grad_x);
imshow("【效果图】X方向的Scharr", abs_grad_x);
Scharr(src, grad_y, CV_16S, 0, 1, 1, 0, BORDER_DEFAULT);
convertScaleAbs(grad_y, abs_grad_y);
imshow("【效果图】Y方向的Scharr", abs_grad_x);
addWeighted(abs_grad_x, 0.5,
abs_grad_y, 0.5,
0,//图1与图2作和后添加的数值
dst);
imshow("【效果图】合并梯度后的Scharr", dst);
waitKey(0);
return 0;
}