凤仙郡天下杂谈|图像处理 | 图像平滑之均值滤波、方框滤波、高斯滤波及中,Python( 二 )


其中5*5的矩阵称为核 , 针对原始图像内的像素点 , 采用核进行处理 , 得到结果图像 。
提取1/25可以将核转换为如下形式:
2.代码
Python调用OpenCV实现均值滤波的核心函数如下:
result=cv2.blur(原始图像,核大小)
其中 , 核大小是以(宽度 , 高度)表示的元祖形式 。 常见的形式包括:核大小(3 , 3)和(5 , 5) 。
凤仙郡天下杂谈|图像处理 | 图像平滑之均值滤波、方框滤波、高斯滤波及中,Python
文章图片
代码如下所示:
#encoding:utf-8importcv2importnumpyasnpimportmatplotlib.pyplotasplt#读取图片img=cv2.imread('test01.png')source=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#均值滤波result=cv2.blur(source,(5,5))#显示图形titles=['SourceImage','BlurImage']images=[source,result]foriinxrange(2):plt.subplot(1,2,i+1),plt.imshow(images[i],'gray')plt.title(titles[i])plt.xticks([]),plt.yticks([])plt.show()
输出结果如下图所示:
核设置为(10 , 10)和(20 , 20)会让图像变得更加模糊 。
如果设置为(1 , 1)处理结果就是原图 , 核中每个权重值相同 , 称为均值 。
凤仙郡天下杂谈|图像处理 | 图像平滑之均值滤波、方框滤波、高斯滤波及中,Python
文章图片
方框滤波
方框滤波和均值滤波核基本一致 , 区别是需不需要均一化处理 。 OpenCV调用boxFilter()函数实现方框滤波 。 函数如下:
result=cv2.boxFilter(原始图像,目标图像深度,核大小,normalize属性)
其中 , 目标图像深度是int类型 , 通常用“-1”表示与原始图像一致;核大小主要包括(3 , 3)和(5 , 5) , 如下所示 。
凤仙郡天下杂谈|图像处理 | 图像平滑之均值滤波、方框滤波、高斯滤波及中,Python
文章图片
normalize属性表示是否对目标图像进行归一化处理 。 当normalize为true时需要执行均值化处理 , 当normalize为false时 , 不进行均值化处理 , 实际上为求周围各像素的和 , 很容易发生溢出 , 溢出时均为白色 , 对应像素值为255 。
凤仙郡天下杂谈|图像处理 | 图像平滑之均值滤波、方框滤波、高斯滤波及中,Python
文章图片
在图像简单平滑中 , 算法利用卷积模板逐一处理图像中每个像素 , 这一过程可以形象地比作对原始图像的像素一一进行过滤整理 , 在图像处理中把邻域像素逐一处理的算法过程称为滤波器 。 平滑线性滤波器的工作原理是利用模板对邻域内像素灰度进行加权平均 , 也称为均值滤波器 。
代码如下所示:
#encoding:utf-8importcv2importnumpyasnpimportmatplotlib.pyplotasplt#读取图片img=cv2.imread('test01.png')source=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#方框滤波result=cv2.boxFilter(source,-1,(5,5),normalize=1)#显示图形titles=['SourceImage','BoxFilterImage']images=[source,result]foriinxrange(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])#[[115180106]#[8315272]#[555855]]print(result[0:3,0:3,0])#[[929078]#[928977]#[828072]]
如果省略参数normalize , 则默认是进行归一化处理 。 如果normalize=0则不进行归一化处理 , 像素值为周围像素之和 , 图像更多为白色 。
#encoding:utf-8importcv2importnumpyasnpimportmatplotlib.pyplotasplt#读取图片img=cv2.imread('test01.png')source=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#方框滤波result=cv2.boxFilter(source,-1,(5,5),normalize=0)#显示图形titles=['SourceImage','BoxFilterImage']images=[source,result]foriinxrange(2):plt.subplot(1,2,i+1),plt.imshow(images[i],'gray')plt.title(titles[i])plt.xticks([]),plt.yticks([])plt.show()