边缘检测Sobel算子使用效果图
原始图
X方向效果图
Y方向效果图
整体方向效果图
1、Sobel算子简介
Sobel算法是像素图像边缘检测中最重要的算子之一,在机器学习、数字媒体、计算机视觉等信息科技领域起着举足轻重的作用。在技术上,它是一个离散的一阶差分算子,用来计算图像亮度函数的一阶梯度之近似值。在图像的任何一点使用此算子,将会产生该点对应的梯度矢量或是其法矢量。
2、算子分析
Sobel 算子是一个离散的一阶微分算子,用来计算图像灰度函数的近似梯度。
在空间域上Sobel算子很容易实现,执行速度快,对部分噪声具有平滑作用,还能够提供较为精确的边缘方向信息,缺点是边缘定位精度不够高。边缘是指一个物体与另一个物体的分界处,一般边缘内外处都会有灰度值上的差异,Sobel算子就是通过像素点空间邻域内上下,左右相邻点的灰度加权运算,求取物体边缘。
经典Sobel的卷积因子为:
对于待检测边缘的图像I,分别在水平(X)方向和垂直方向(Y)方向求导,方法是分别图像I与卷积核Gx和Gy进行卷积,公式表述如下:
之后对求得的水平和垂直方向的梯度图像上的每一点执行:
G即为Sobel求得的梯度图像。
3、代码参考
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main()
{
//【1】创建矩阵
Mat g_x, g_y;
Mat a_x, a_y, dst;
//【2】载入原始图
Mat src = imread("F://3.png");
//【3】显示原始图
imshow("src", src);
//【4】求X方向梯度
Sobel(src, g_x, CV_16S, 1, 0, 3, 1, 1, BORDER_DEFAULT);
convertScaleAbs(g_x, a_x);
imshow("X_效果图", a_x);
//【5】求Y方向梯度
Sobel(src, g_y, CV_16S, 0, 1, 3, 1, 1, BORDER_DEFAULT);
convertScaleAbs(g_y, a_y);
imshow("Y_效果图", a_y);
//【6】合并梯度(近似)
addWeighted(a_x, 0.5, a_y, 0.5, 0,dst);
imshow("整体方向",dst);
waitKey(0);
return 0;
}