Scharr算子
虽然Sobel算子可以有效地提取图像边缘,但是对图像中较弱的边缘提取效果较差,因此,为了有效地提取出较弱的边缘
需要将像素值间的差距增大,于是引入Scharr算子,Scharr算子是对Sobel算子差异性的增强
因此两者在检测图像边缘的原理和使用方式上相同,Scharr算子的边缘检测滤波的尺寸为 3x3 ,因此也被称为Scharr滤波器
在X方向和Y方向上的边缘检测算子如
Gx :
Gy: 
OpenCV4提供了对图像提取Scharr边缘的Scharr()函数
Scharr()函数原型:
void Scharr(InputArray src,
OutputArray dst,
int ddepth,
int dx,
int dy,
double scale = 1,
double delta = 0,
int borderType = BORDER_DEFAULT
)
- src:待边缘提取的图像
- dst:输出图像,与输入图像src具有相同的尺寸和通道数,数据类型由第三个参数ddepth控制
- ddepth:输出图像的数据类型(深度),根据输入图像的数据类型不同,拥有不同的取值范围(表:图像卷积)
当赋值为-1时,输出图像的数据类型自动选择
- dx:X方向的差分阶数
- dy:Y方向的差分阶数
- ksize:Sobel算子的尺寸,必须是1、3、5或者7
- scale:对导数计算结果进行缩放因子,默认系数为1,表示不缩放
- delta:偏值,在计算结果中加上偏值
- borderType:像素外推选择标志,默认为BORDER_DEFAULT,表示不包含边界值的倒序填充(2.3.4仿射变换)
该函数利用Scharr算子提取图像中边缘信息,与Sobel函数相同,前两个参数为输入图像和输出图像,第三个参数为输出图像的数据类型
由于提取边缘信息时可能出现负数,因此不要使用CV_8U数据类型的输出图像,因为于Scharr算子方向不一致的边缘梯度会在
CV_8U中消失,使得图像边缘提取不准确
第四、五个参数分别是X方向边缘和Y方向边缘的标志,该函数默认的滤波器尺寸为3x3,且无法改变
最后3个参数分别为图像缩放因子、偏值和图像外推填充方法的标志,多数情况下使用默认参数
示例:
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
//读取图像,黑白图像边缘检测结果较为明显
Mat img = imread("E:\\CLion\\opencv_xin\\SG\\SG_0.jpg",IMREAD_ANYCOLOR);
if (img.empty())
{
cout << "error" << endl;
return -1;
}
Mat resultX,resultY,resultXY;
//X方向一阶边缘
Scharr(img,resultX,CV_16S,1,0);
convertScaleAbs(resultX,resultX);
//Y方向一阶边缘
Scharr(img,resultY,CV_16S,0,1);
convertScaleAbs(resultY,resultY);
//整幅图像的一阶边缘
resultXY = resultX + resultY;
//显示图像
imshow("resultX",resultX);
imshow("resultY",resultY);
imshow("resultXY",resultXY);
waitKey(0);
return 0;
}