![bdde53b64d4f1a9ccb462775ad3164e4.png](https://i-blog.csdnimg.cn/blog_migrate/fd9e38c13afa48a9863521003fa6cae1.png)
1 背景介绍
图像底层的处理对象,比如图像的噪点、边缘、直线、圆、特征点等为目的。那么本章主要解决的问题是如何提取图形中的边缘?是我们关心中的重点。那么,其数学原理是一阶离散差分的形式。故我们知道把一个图像处理转变为灰度图像,就是处理这张图像的每个像素灰度的变化,那么在边缘处,灰度变化比较明显(对应着其梯度或者灰度矢量的变化)。
2 Sobel算子的形式
- 图像处理绝大数在卷积操作,Opencv 会提供一个
或者
或者其他大小的 kernel,也就是卷积核。对于卷积核操作,首先我们要明白卷积原理。
卷积公式:
我擦,看到他的定义瞬间懵掉了。那么他到底解释的什么?我给出引用其他小伙伴的卷积解释卷积到底是什么?我还是一脸雾水,当我看到以下证明时,我才完全明白其来源和含义:
设二维连续型随机变量
那么:
则:
其实,卷积函数就是二阶积分一种特殊情况的一元积分形式。
- Sobel 卷积算子,
轴方向的变化和
轴方向的变化
![dea98aae6181ad565a5479c409e3693f.png](https://i-blog.csdnimg.cn/blog_migrate/6a20b42cc7dde370a13dd7827860743f.png)
看到
若
那么在
具体计算方式如下:
其中
那么,改点的灰度梯度为:
如果梯度
Sobel算子根据像素点上下、左右邻点灰度加权差,在边缘处达到极值这一现象检测边缘。对噪声具有平滑作用,提供较为精确的边缘方向信息,边缘定位精度不够高。当对精度要求不是很高时,是一种较为常用的边缘检测方法。
3 API 函数介绍
void cv::Sobel( InputArray _src, OutputArray _dst, int ddepth, int dx, int dy,
int ksize, double scale, double delta, int borderType )
第一个参数:_src 输入的源影像
第二个参数:_dst输出的目标影像,大小和通道数与源影像相同。深度由ddepth来决定
第三个参数:目标影像的深度;当源源影像的深度为CV_8U时,一般ddepth选择为CV_16S
第四个参数:x方向上的导数因子
第五个参数:Y方向上的导数因子
第六个参数:
如果ksize<0的时候,那么使用scharr内核过滤因子。scharr的内核过滤因子大小为3。
dx大于等于0,dy大于等于0,并且dx+dy==1
#include <opencv2/core/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char **argv)
{
Mat image = imread("/Users/cc/Desktop/OpenCV/demo/MyOpenCvDemo/MyDemo/swk.jpeg");
if (image.empty())
{
cout << "could not find the image resource ..." << endl;
return -1;
}
Mat grayImg;
cvtColor(image, grayImg, COLOR_BGR2GRAY);
Mat sobelx;
Sobel(grayImg, sobelx, CV_32F, 1, 0);
double minVal, maxVal;
minMaxLoc(sobelx, &minVal, &maxVal);
Mat draw;
sobelx.convertTo(draw, CV_8U, 255.0 / (maxVal - minVal), -minVal * 255.0 / (maxVal - minVal));
namedWindow("My Image", CV_WINDOW_AUTOSIZE);
imshow("My Image", draw);
waitKey(0);
return 0;
}
4 运行结果
![8070e857f3ddd26ab71568479ee0eead.png](https://i-blog.csdnimg.cn/blog_migrate/ea1ac4c2df6a432fa0d366797df5e9c6.jpeg)