作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
void Sobel( InputArray src, OutputArray dst, int ddepth,
int dx, int dy, int ksize = 3,
double scale = 1, double delta = 0,
int borderType = BORDER_DEFAULT );
Sobel算子是一个主要用于边缘检测的离散微分算子。它结合了高斯平滑和微分求导,用来计算图像灰度函数的近似梯度。在图像的任何一点使用此算子,都会产生对应的梯度矢量或法矢量。
Soble算子的计算步骤:
1.假设图像为I,分别在x和y方向求导。
1)水平方向将I与一个奇数大小的内核进行卷积,所得结果为Gx:
2)垂直方向将I与一个奇数大小的内核进行卷积,所得结果为Gy:
2.在图像的每一点,结合Gx和Gy求出近似梯度G:
#include
#include
#include
using namespace std;
using namespace cv;
int main()
{
Mat src = imread("test.jpg");
Mat gradx, grady, absgradx, absgrady, result;
// X方向梯度
Sobel(src, gradx, CV_16S, 1, 0, 3, 1, 1, BORDER_DEFAULT);
convertScaleAbs(gradx, absgradx);
// Y方向梯度
Sobel(src, grady, CV_16S, 0, 1, 3, 1, 1, BORDER_DEFAULT);
convertScaleAbs(grady, absgrady);
// 梯度相加
addWeighted(absgradx, 0.5, absgrady, 0.5, 0, result);
// 结果显示
imshow("src", src);
imshow("x", absgradx);
imshow("y", absgrady);
imshow("result", result);
waitKey(0);
return 0;
}
因为Sobel算子结合了高斯平滑和分化,所以结果具备一定抗噪性哦~
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!