Python 图像处理 | 图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波( 二 )

images = [source, result] for i in xrange(2): plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray') plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show输出结果如下图所示:

Python 图像处理 | 图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波

文章插图
核设置为(10,10)和(20,20)会让图像变得更加模糊 。
Python 图像处理 | 图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波

文章插图
如果设置为(1,1)处理结果就是原图,核中每个权重值相同,称为均值 。
Python 图像处理 | 图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波

文章插图
方框滤波
方框滤波和均值滤波核基本一致,区别是需不需要均一化处理 。OpenCV调用boxFilter函数实现方框滤波 。函数如下:
result = cv2.boxFilter(原始图像, 目标图像深度, 核大小, normalize属性)
其中,目标图像深度是int类型,通常用“-1”表示与原始图像一致;核大小主要包括(3,3)和(5,5),如下所示 。
Python 图像处理 | 图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波

文章插图
normalize属性表示是否对目标图像进行归一化处理 。当normalize为true时需要执行均值化处理,当normalize为false时,不进行均值化处理,实际上为求周围各像素的和,很容易发生溢出,溢出时均为白色,对应像素值为255 。
Python 图像处理 | 图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波

文章插图
在图像简单平滑中,算法利用卷积模板逐一处理图像中每个像素,这一过程可以形象地比作对原始图像的像素一一进行过滤整理,在图像处理中把邻域像素逐一处理的算法过程称为滤波器 。平滑线性滤波器的工作原理是利用模板对邻域内像素灰度进行加权平均,也称为均值滤波器 。
Python 图像处理 | 图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波

文章插图
代码如下所示:
#encoding:utf-8import cv2 import numpy as np import matplotlib.pyplot as plt#读取图片img = cv2.imread('test01.png')source = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#方框滤波result = cv2.boxFilter(source, -1, (5,5), normalize=1)#显示图形titles = ['Source Image', 'BoxFilter Image'] images = [source, result] for i in xrange(2): plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray') plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show代码中使用5*5的核,normalize=1表示进行归一化处理,此时与均值滤波相同,输出结果如下图所示:
Python 图像处理 | 图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波

文章插图
下面是图像左上角处理前后的像素结果:
print(source[0:3, 0:3, 0])#[[115 180 106]# [ 83 152 72]# [ 55 58 55]]print(result[0:3, 0:3, 0])#[[92 90 78]# [92 89 77]# [82 80 72]]如果省略参数normalize,则默认是进行归一化处理 。如果normalize=0则不进行归一化处理,像素值为周围像素之和,图像更多为白色 。
#encoding:utf-8import cv2 import numpy as np import matplotlib.pyplot as plt#读取图片img = cv2.imread('test01.png')source = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#方框滤波result = cv2.boxFilter(source, -1, (5,5), normalize=0)#显示图形titles = ['Source Image', 'BoxFilter Image'] images = [source, result] for i in xrange(2): plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray') plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show输出结果如下图所示:
Python 图像处理 | 图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波

文章插图
上图很多像素为白色,因为图像求和结果几乎都是255 。如果设置的是2*2矩阵,只取四个像素结果要好些 。
result = cv2.boxFilter(source, -1, (2,2), normalize=0)
Python 图像处理 | 图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波

文章插图
Python 图像处理 | 图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波

文章插图
高斯滤波
为了克服简单局部平均法的弊端(图像模糊),目前已提出许多保持边缘、细节的局部平滑算法 。它们的出发点都集中在如何选择邻域的大小、形状和方向、参数加平均及邻域各店的权重系数等 。


推荐阅读