sobel算子_OpenCV 学习:4 Sobel算子

1 背景介绍
图像底层的处理对象,比如图像的噪点、边缘、直线、圆、特征点等为目的。那么本章主要解决的问题是如何提取图形中的边缘?是我们关心中的重点。那么,其数学原理是一阶离散差分的形式。故我们知道把一个图像处理转变为灰度图像,就是处理这张图像的每个像素灰度的变化,那么在边缘处,灰度变化比较明显(对应着其梯度或者灰度矢量的变化)。
2 Sobel算子的形式
- 图像处理绝大数在卷积操作,Opencv 会提供一个
或者
或者其他大小的 kernel,也就是卷积核。对于卷积核操作,首先我们要明白卷积原理。
卷积公式:
我擦,看到他的定义瞬间懵掉了。那么他到底解释的什么?我给出引用其他小伙伴的卷积解释卷积到底是什么?我还是一脸雾水,当我看到以下证明时,我才完全明白其来源和含义:
设二维连续型随机变量
那么:
则:
其实,卷积函数就是二阶积分一种特殊情况的一元积分形式。
- Sobel 卷积算子,
轴方向的变化和
轴方向的变化

看到
若
那么在
具体计算方式如下:
其中
那么,改点的灰度梯度为:
如果梯度
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
#include
#include
#include
#include 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 运行结果
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
