本文以下OpenCV都简写成"cv2"的形式,所有img都默认为一张图片
关联文章:
OpenCV和图像处理(一)
四、图像滤波
0、了解OpenCV卷积操作
kernel = np.array([[1, 1, 0], [1, 0, -1], [0, -1, -1]], np.float32) # 定义一个核
result = cv2.filter2D(src, -1, kernel=kernel)
r'''
和深度学习不同,OpenCV的卷积核是自己设置的,而深度学习可以自行学习到。
cv2.filter2D(src, ddepth, kernel)是常用的三个参数
src:指输入的图像
ddepth:
表示目标图像的所需深度,它包含有关图像中存储的数据类型的信息,
unsigned char(CV_8U),signed char(CV_8S),unsigned short(CV_16U)等,
当ddepth=-1时,表示输出图像与原图像有相同的深度。
kernel:就是自己设置的核
'''
1、常见滤波种类
滤波器可以分为:高通、低通、带通(中通)和带阻
滤波按照空间可分为 时域滤波 和 频域滤波
2、时域滤波
时域滤波常用的有均值滤波、高斯滤波、中值滤波、双边滤波、拉普拉斯高通滤波和USM锐化操作 等
2-1:均值滤波
均值滤波字面上理解就是平均值,其卷积核(3x3为例)如下:
1 9 [ 1 1 1 1 1 1 1 1 1 ] \frac{1}{9} \left[ \begin{matrix} 1&1&1\\ 1&1&1\\ 1&1&1 \end{matrix} \right] 91⎣⎡111111111⎦⎤
result = cv2.blur(img, (5,5)) # ksize=(5,5)
2-2:高斯滤波
高斯滤波的卷积核类似一个二维的高斯函数,其卷积核(3x3为例)如下:
[ 1 2 1 2 4 2 1 2 1 ] \left[ \begin{matrix} 1&2&1\\ 2&4&2\\ 1&2&1 \end{matrix} \right] ⎣⎡121242121⎦⎤
result = cv2.GaussianBlur(img, (5, 5), 0) # ksize是tuple,和下面中值作对比...
r'''
(5, 5)是ksize高斯内核大小,ksize.width和ksize.height可以不同,但它们都必须为正数和奇数,
也可以为零,然后根据sigma计算得出。
0==>sigmaX:X方向上的高斯核标准偏差。
sigmaY:Y方向上的高斯核标准差。(上面没写)
如果sigmaY为零,则将其设置为等于sigmaX;
如果两个sigmas为零,则分别从ksize.width和ksize.height计算得出。
为了完全控制结果,建议指定所有ksize,sigmaX和sigmaY。
'''
2-3:中值滤波
中值滤波将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。
result = cv2.medianBlur(img, 5) # 注意此时ksize是int,不是tuple
2-4:双边滤波
双边滤波是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折中处理 。
result = cv2.bilateralFilter(img,9,75,75)
r'''
src:输入图像
d:过滤时周围每个像素领域的直径
sigmaColor:在color space中过滤sigma。参数越大,临近像素将会在越远的地方mix。
sigmaSpace:在coordinate space中过滤sigma。参数越大,那些颜色足够相近的的颜色的影响越大。
'''
2-5:拉普拉斯滤波
高通滤波需要自己定义一个滤波器,其卷积核(3x3为例)如下:
L a p l a c e = [ 0 − 1 0 − 1 5 − 1 0 − 1 0 ] Laplace=\left[ \begin{matrix} 0&-1&0\\ -1&5&-1\\ 0&-1&0 \end{matrix} \right] Laplace