OpenCV中的滤波器
图像滤波
- 滤波的作用:一幅图像通过滤波器得到另一幅图像;其中滤波器又称为卷积核,滤波的过程被称为卷积
卷积的几个基本概念:
- 卷积核的大小:
- 卷积核一般为奇数,如3 * 3,5 * 5, 7 * 7等
- 一方面是增加padding的原因
- 另一方面是保证锚点在中间,防止位置发生偏移的原因
- 影响:在深度学习中,卷积核越大,看到的信息(感受野)越多,提取的特征越好,同时计算量也就越大
- 锚点:
- 正中心
- 边界扩充:
- 当卷积核大于1且不进行边界扩充,输出尺寸将响应缩小
- 当卷积核以标准方式进行边界扩充,则输出数据的空间尺寸将与输入相等
- 计算公式:N = (W - F + 2P) / S + 1
- N输出图像大小
- W源图大小
- F卷积核大小
- P扩充尺寸
- S步长大小
- 步长
实战图像卷积
低通滤波与高通滤波
- 低通滤波可以去除噪音或平滑图像
- 高通滤波可以帮助查找图像的边缘
图像卷积
- filter2D(src,ddepth,kernel,anchor,delta,borderType)
- src:对哪幅图像进行卷积
- ddepth:图像的位深
- kernel:卷积核
- anchor:锚点,默认为(-1,-1)
- delta:每个元素加一个delta值
- borderType:边界类型
#平滑处理
import cv2
import numpy as np
img = cv2.imread('1.png')
kernel = np.ones((5,5),np.float32) / 25
dst = cv2.filter2D(img, -1, kernel)
cv2.imshow('dst',dst)
cv2.imshow('img',img)
cv2.waitKey(0)
方盒滤波与均值滤波
方盒滤波
- 参数a的作用:
- normalize = true, a = 1/W *H (进行均值化) 方盒滤波==平均滤波
- normalize = false, a = 1 (不进行均值化)
- boxFilter(src,ddepth,ksize,anchor,normalize,borderType)
均值滤波
-
blur(src,ksize,anchor,borderType)
-
一般只设src,ksize即可,使用anchor,borderType的默认值
dst = cv2.blur(img,(5,5))
高斯滤波:
- 图像类似正态分布,中间高,两边低
- GaussianBlur(img,kernel,sigmaX,sigmaY…)
- sigmaX:钟型滤波的延展宽度,也就是最大范围到中心点有多大误差,sigma越大,图像越模糊
dst = cv2.GaussianBlur(img,(5,5),sigmaX = 1)
- sigma越大,图像越模糊,使用高斯滤波主要用于解决高斯噪点
中值滤波
-
优点:对胡椒噪音效果明显
-
medianBlur(img,ksize)
dst = cv2.medianBlur(img,(5,5))
双边滤波
- 优点:可以保留边缘,同时可以对边缘内的区域进行平滑处理
- 主要作用:进行美颜
- bilateralFilter(img,d,sigmaColor,sigmaSpace,…)
dst = cv2.bilateralFilter(img,7,20,50)
高通滤波–Scharr算子
- 与Sobel类似,只不过使用的kernel值不同
- Scharr只能求x方向或y方向的边缘
- Scharr(src,ddepth,dx,dy,scale = 1, delta = 0, borderType = BORDER_DEFAULT)
d1 = cv2.Scharr(img,cv2.CV_64F,0,1)
高通滤波–拉普拉斯算子
- 优点:可以同时求两个方向的边缘
- 缺点:对噪音敏感,一般需要先进行去噪再调用拉普拉斯
- Laplacian(img,ddepth,ksize = 1,scale = 1, borderType = BORDER_DEFAULT)
dst = cv2.Laplacian(img,cv2.CV_64F,ksize = 5)
边缘检测Canny
-
边缘检测终极大法
-
优点:边缘处理细致、操作简单
-
操作实现:
- 使用5*5高斯滤波消除噪声
- 计算图像梯度的方向(0/45/90/135)
- 取局部极大值
- 阈值计算:如果大于最大值,一定是边缘;如果低于最小值,一定不是边缘;如果在两者之间,需要判断与之前是否连贯(连贯是边缘)
-
Canny(img,minVal,maxVal,…)
dst = cv2.Canny(img,100,200)