简述
接下来介绍几种opencv常用的滤波器,将介绍它们详细的原理,并且也会给出相应的代码段,但是演示图片就不放出来了,毕竟还是比较简单的。
均值滤波器
均值滤波器是一种低通滤波器,也是线性滤波器。对于一幅图像,我们都知道其像素阈值在0-255,通常来讲,滤波器所用的一个滤波模板都为奇数,这里我们以3*3为例:
中间黄色部分即为滤波器的模板(卷积核),其将用于与图像进行卷积进而滤波,对于均值滤波器,顾名思义,其像素点为中间九个像素值的均值,从而将整个图像的像素用这个均值像素代替。
给出示例代码:
import cv2
import matplotlib.pyplot as plt
import numpy as np
min = cv2.imread("1.jpg")
min = cv2.blur(min,(3,3))
cv2.imshow("result", min)
cv2.waitKey(0)
cv2.destroyAllWindows()
方框滤波器
事实上,方框滤波器与均值滤波器是基本上一样的:
import cv2
import matplotlib.pyplot as plt
import numpy as np
min = cv2.imread("1.jpg")
min = cv2.boxFilter(min,-1,(3,3),normalize=True)
cv2.imshow("result", min)
cv2.waitKey(0)
cv2.destroyAllWindows()
boxFilter则为i方框滤波函数,当
normalize=True
它就完全相当于是一个均值滤波器,滤波像素值计算方法也是均值计算,如图:
但是当
normalize=False
其并非均值,而是卷积核中所有的像素值相加,不除9,那么对于大于255的值,它会全取255进行代替,如图:
高斯滤波
先来了解一下高斯函数,实际上完全就是一个正态分布函数:
我简单解释一下高斯滤波的原理,仍然以最上面的那个数字图为例,假设中间的204为中心点,高斯滤波的原理就是距离中心点最近其权重系数越大,就类似这样一个图:
对应于:
那么距离204越近则其权重系数越大,它跟均值滤波还是有很大不同的,均值滤波对于204周围的75和24这两个较小值非常的不友好,会导致误差较大。但是高斯滤波表示,离我近的,吃嘛嘛香,离我远的,说话分量就没有那么重了,不管你值有多大或者多小。我们看一下代码:
import cv2
import matplotlib.pyplot as plt
import numpy as np
min = cv2.imread("1.jpg")
min = cv2.GaussianBlur(min,(3,3),1)
cv2.imshow("result", min)
cv2.waitKey(0)
cv2.destroyAllWindows()
中值滤波
顾名思义,找中位数嘛,仍然以那个图为例,我们将值从小到大排列一下:
24 75 78 104 113 121 154 204 235
那么中间值就是113了。
当然了,相比大家也发现了,中值滤波器卷积核大小必定要是奇数的,否则就没有所谓的中值,也会报错。
中值滤波对于去除椒盐噪声特别的有效,我们先来看一下椒盐噪声的原理:
椒盐噪声是由图像传感器,传输信道,解码处理等产生的黑白相间的亮暗点噪声。椒盐噪声是指两种噪声,一种是盐噪声(salt noise)盐=白色(255),另一种是胡椒噪声(pepper noise),椒=黑色(0)。前者是高灰度噪声,后者属于低灰度噪声。一般两种噪声同时出现,呈现在图像上就是黑白杂点。对于彩色图像,则表现为在单个像素BGR三个通道随机出现的255与0,如下图所示。
事实上就是取值为0和255的,这两种很极端的数值。
而中值滤波的取值恰恰是中间值,所以会将这些极端值过滤掉,代码如下:
import cv2
import matplotlib.pyplot as plt
import numpy as np
min = cv2.imread("3.jpg")
result = cv2.medianBlur(min,5)
cv2.imshow("ori",min)
cv2.imshow("result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
如图:
可以看到效果十分明显