python-opencv之图像滤波(blur,boxFilter,GaussianBlur,medianBlur)

1. blur(均值滤波)

均值滤波从频域来看,它是一种低通滤波器,高频信号会被滤掉。均值滤波可以帮助消除图像尖锐噪声,实现图像平滑,模糊等功能。理想的均值滤波是用每个像素和它周围像素计算出来的平均值替换图像中每个像素。
均值滤波器一般是使用下面的模板和图像做卷积来实现。
在这里插入图片描述
即以当前像素点为中心,求窗口内所有灰度值的和,以其平均值作为中心像素新的灰度值。

均值滤波有平均均值滤波和加权均值滤波。分别如下所示:

左边是平均均值滤波 ,右边是加权均值滤波
python-opencv之图像滤波(blur,boxFilter,GaussianBlur,medianBlur)_第1张图片
均值滤波可以模糊图像从而得到图像的大致描述。

2. boxFilter(方框滤波)

方框滤波和均值滤波的原理是类似的,因为均值滤波是方框滤波的归一化表现。在OpenCV中,方框滤波使用的模板如下:
python-opencv之图像滤波(blur,boxFilter,GaussianBlur,medianBlur)_第2张图片
从方框滤波的模板可以看到,如果α = 1,那么就是方框滤波,不进行归一化;如果α != 1那么就进行归一化操作。

以5*5的卷积核为例,如果normalize == true,那么就是均值滤波,模板如下:
python-opencv之图像滤波(blur,boxFilter,GaussianBlur,medianBlur)_第3张图片
如果normalize != true,那么就是计算邻域像素和,不平均,卷积核如下:
python-opencv之图像滤波(blur,boxFilter,GaussianBlur,medianBlur)_第4张图片

3. GaussianBlur(高斯滤波)

高斯滤波是一种线性平滑滤波,适用于消除高斯噪声(高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声)。高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。

一维高斯分布
python-opencv之图像滤波(blur,boxFilter,GaussianBlur,medianBlur)_第5张图片
通常我们在使用的时候都取标准正态分布。这时候
在这里插入图片描述
以3*3的模板为例,给出高斯滤波的卷积核
python-opencv之图像滤波(blur,boxFilter,GaussianBlur,medianBlur)_第6张图片
从卷积核可以看到,每一个像素点的权值不是全部相同的。更突出了中心点在像素平滑后的权重,相比于均值滤波而言,有着更好的平滑效果。

medianBlur(中值滤波)

中值滤波是一种典型的非线性滤波,是基于排序统计理论的一种能够有效抑制噪声的非线性信号处理技术,基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值,让周围的像素值接近真实的值从而消除孤立的噪声点。该方法在取出脉冲噪声、椒盐噪声的同时能保留图像的边缘细节。这些优良特性是线性滤波所不具备的。
中值滤波会取当前像素点及其周围临近像素点(一共有奇数个像素点)的像素值,将这些像素值排序,然后将位于中间位置的像素值作为当前像素点的像素值。
python-opencv之图像滤波(blur,boxFilter,GaussianBlur,medianBlur)_第7张图片

将其邻域设置为3×3大小,对其3×3邻域内像素点的像素值进行排序(升序降序均可),按升序排序后得到序列值为:[66,78,90,91,93,94,95,97,101]。在该序列中,处于中心位置(也叫中心点或中值点)的值是“93”,因此用该值替换原来的像素值78,作为当前点的新像素值。中值滤波效果如下:
python-opencv之图像滤波(blur,boxFilter,GaussianBlur,medianBlur)_第8张图片

代码实例

import cv2
import matplotlib.pyplot as plt
import numpy as np


img = cv2.imread("./lena-noisedimage.png",cv2.IMREAD_COLOR)
print(img.shape)
img = cv2.resize(img,[256,256])
blur = cv2.blur(img,(3,3))
boxfliter = cv2.boxFilter(img,-1,(3,3),normalize=True)
Gaussian = cv2.GaussianBlur(img,(3,3),1)
media = cv2.medianBlur(img,5)
#kernel = np.array([0,-1,0,-1,5,-1,0,-1,0])
#fliter2d = cv2.filter2D(img,-1,kernel)# 不同的效果由卷积核决定
#res = np.hstack((img,blur,boxfliter,Gaussian,media,fliter2d))
res = np.hstack((img,blur,boxfliter,Gaussian,media))
cv2.imshow("lena",res)
cv2.waitKey(0)
cv2.destroyAllWindows()

python-opencv之图像滤波(blur,boxFilter,GaussianBlur,medianBlur)_第9张图片
参考连接:https://cloud.tencent.com/developer/article/1601443

你可能感兴趣的:(Python,OpenCV,opencv,python,计算机视觉)