OpenCV卷积操作
filter2D(src,ddpeth,kernel)使用不同大小和尺寸的卷积核来对图像进行平滑/锐化/轮廓效果
去噪算子
方盒滤波
boxFilter(src,ddepth,dsize,normalize)方盒滤波单当normalize = True时,相当于均值滤波
均值滤波
Blur(src,dsize),均值滤波的卷积核就是卷积核内部的值都一样,且加起来等于1
高斯滤波
GaussianBlur(src,ksize,sigmaX,sigmaY),如果不指定sigmaX或者sigmaY会从ksize计算卷积核
$G(x,y) = \frac{1}{2\pi\sigma^2}e^{-\frac{x^2+y^2}{2\sigma^2}}$用来计算高斯值
高斯滤波用作于处理高斯噪声,即符合高斯分布的噪声
双边滤波(相当于磨皮效果)
bilateralFilter(src,d,sigmaColor,sigmaSpace)
d是指ksize
sigmaColor是灰度距离的sigma值
sigmaSpace是空间距离的sigma值
双边滤波是一个与空间距离有关的高斯函数和一个与灰度距离有关的高斯函数相乘得到的
双边滤波可以很好的保留边缘
双边滤波也可以处理高斯噪声,但是对于椒盐噪声处理效果很差
中值滤波
medianBlur(src,ksize)
假如有一个数组[1236789],取其中的中间值作为卷积后的结果值即可
中值滤波对于椒盐噪声处理效果很好
高通滤波算子
Sobel算子
Sobel(src,ddepth,ksize,dx,dy)
Sobel算子是对图像求一阶导数,也就是使用离散差分算子近似梯度,梯度变化越大的地方,说明就是边缘
Sobel算子要分别对x和y求梯度,最后对梯度的值相加
Sobel算子对噪声敏感
Scharr沙尔算子
Scharr(src,ddepth,dx,dy)
当kernel大于3时,Sobel算子可能会产生较为明显的误差(近似梯度),Scharr采用3x3的卷积核,使用了不同的卷积核,放大了像素变换的情况
其余和Sobel算子一样
Laplacian算子
Laplacian(src,ddepth,ksize)
由于Sobel算子只计算了一阶导数,如果对一阶导数继续求导呢?当二阶导数为0时,我们可以利用这一点去寻找图像的边缘
对x方向和y方向分别求2次差分,差分后的结果相加后,就可以得到Laplacian算子的卷积核[[0,1,0],[1,-4,1],[0,1,0]]
Laplacian算子可以同时求两个方向的梯度
Laplacian算子对噪声敏感,所以需要提前去噪
Canny算子
Canny(src,ddepth,maxval,minval)
Canny算子是边缘检测的最优算法:低错误率、高定位性、最小响应
步骤:
1.去噪
2.计算x方向和y方向的梯度$G = \sqrt{G_x^2+G_y^2},G=G_x^2+G_y^2,$再计算$$\theta = arctan\frac{G_y}{G_x}$$
3.非极大值抑制
在同一方向上选择梯度值最大的,其余抑制(归零)
4.滞后阈值
当梯度值大于maxval时,将它看做边缘
当梯度值大于maxval,小于minval时,如果它的周围有边缘,那就把它归为边缘,如果没有,则舍弃
当梯度值小于minval时,直接舍弃
Canny算子对噪声也是比较敏感的,所以也需要提前去噪