简述

接下来介绍几种opencv常用的滤波器,将介绍它们详细的原理,并且也会给出相应的代码段,但是演示图片就不放出来了,毕竟还是比较简单的。

均值滤波器

均值滤波器是一种低通滤波器,也是线性滤波器。对于一幅图像,我们都知道其像素阈值在0-255,通常来讲,滤波器所用的一个滤波模板都为奇数,这里我们以3*3为例:

python 5点滤波 python滤波算法_卷积核

中间黄色部分即为滤波器的模板(卷积核),其将用于与图像进行卷积进而滤波,对于均值滤波器,顾名思义,其像素点为中间九个像素值的均值,从而将整个图像的像素用这个均值像素代替。

给出示例代码:

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


它就完全相当于是一个均值滤波器,滤波像素值计算方法也是均值计算,如图:

python 5点滤波 python滤波算法_python 5点滤波_02

但是当


normalize=False


其并非均值,而是卷积核中所有的像素值相加,不除9,那么对于大于255的值,它会全取255进行代替,如图:

python 5点滤波 python滤波算法_高斯滤波_03

高斯滤波

先来了解一下高斯函数,实际上完全就是一个正态分布函数:

python 5点滤波 python滤波算法_卷积核_04

我简单解释一下高斯滤波的原理,仍然以最上面的那个数字图为例,假设中间的204为中心点,高斯滤波的原理就是距离中心点最近其权重系数越大,就类似这样一个图:

python 5点滤波 python滤波算法_卷积核_05

对应于:

python 5点滤波 python滤波算法_python 5点滤波_06

那么距离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()

如图:

python 5点滤波 python滤波算法_python 5点滤波_07

可以看到效果十分明显