opencv滤波及算子
背景
在学习opencv进行图片处理的过程中,无法避免的就是对图片进行预处理,一般都是要进行图片滤波,这里记录一下个人最常用的均值滤波和高斯滤波、Sobel算子
均值滤波
这是一个平滑图片的函数,它将一个区域内所有点的灰度值的平均值作为这个点的灰度值。
像该函数对领域点的灰度值进行权重相加最后设置灰度值,这样的操作又叫卷积,这样的滤波器叫线性滤波器。
函数原型
1 | void blur(InputArray src,OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT ) |
参数解释
1 | src:输入图像,即源图像,填Mat类的对象即可。该函数对通道是独立处理的,且可以处理任意通道数的图片,但需要注意,待处理的图片深度应该为CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。 |
高斯滤波
高斯滤波器能够有效的抑制噪声,平滑图像。高斯滤波器相比于均值滤波器对图像个模糊程度较小。
高斯模糊和均值模糊其原理上的唯一区别只是在于卷积核的值不同罢了。
高斯卷积核矩阵值服从二维高斯函数,也就是说一个图像与服从二维高斯分布的函数做卷积,由于高斯函数是连续的,要将二维高斯函数进行采样和离散化,最后得到服从高斯函数规律的卷积核矩阵。
函数原型
1 | void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT ) |
参数解释
1 | src:输入图片 |
Sobel算子
Sobel算子主要用于边缘检测;
边缘:是像素值发生跃迁的地方,是图像的显著特征之一,在图像特征提取, 对象检测, 模式识别等方面都有重要的作用;
如何提取边缘,对图像求它的一阶导数;delta = f(x) - f(x-1), delta越大,说明在x方向变化越大;
Sobel算子
是离散微分算子,用来计算图像灰度的近似梯度
Sobel算子功能集合高斯平滑和微分求导;
又被称为一阶微分算子,求导算子,在水平和垂直两个方向上求导,得到图像x方法与y方向梯度图像;
那么最终的图像梯度:
可以近似为:
G=|Gx|+|Gy|
Sobel算子函数原型
1 | void Sobel( InputArray src, OutputArray dst, int ddepth, |
参数解释
src表示输入的灰度图像
dst表示输出的梯度;
ddepth表示输出梯度的数据类型,必须大于输入的图像数据类型,关系如下图所示:
dx=1, dy=0表示对x方向计算梯度;
dx=0, dy=1表示对y方向计算梯度;
dx大于等于0,dy大于等于0,并且dx+dy==1
ksize: 表示Sobel算子的大小;它必须是1、3、5或7。注意:只可以是小于7 的奇数。
如果ksize<0的时候,那么使用scharr内核过滤因子。scharr的内核过滤因子大小为3。
scale 表示缩放导数的比例常数,默认情况下没有伸缩系数。
delta 表示一个可选的增量,将会加到最终的dst中,同样,默认情况下没有额外的值加到dst中。
borderType 边界类型
改进的Sobel算子
当内核大小为3时,以上Sobel可能产生比较明显的误差(毕竟,Sobel算子只是求取了导数的近似值),为了解决这一问题,OpenCV提供了Scharr函数,但该函数仅作用域大小为3的内核;计算速度与Sobel函数一样快,但结果更加精确,不怕干扰,其内核为:
Scharr算子函数原型
1 | void Scharr( InputArray src, OutputArray dst, int ddepth, |
参数解释
1 | 参数与Sobel算子基本一致; |
示例代码
Sobel算子的示例代码如下
1 | #include<opencv2\opencv.hpp> |
参考链接
https://blog.csdn.net/weixin_46196863/article/details/112209430
https://www.cnblogs.com/chenzhen0530/p/14690472.html
https://www.cnblogs.com/chenzhen0530/p/14660498.html
https://www.cnblogs.com/skyfsm/p/6879265.html