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


文章图片
首先给出为图像增加噪声的代码 。
#-*-coding:utf-8-*-importcv2importnumpyasnp#读取图片img=cv2.imread(''test.jpg'',cv2.IMREAD_UNCHANGED)rows,cols,chn=img.shape#加噪声foriinrange(5000):x=np.random.randint(0,rows)y=np.random.randint(0,cols)img[x,y,:]=255cv2.imshow(''noise'',img)#等待显示cv2.waitKey(0)cv2.destroyAllWindows()
输出结果如下所示:
凤仙郡天下杂谈|图像处理 | 图像平滑之均值滤波、方框滤波、高斯滤波及中,Python
文章图片
凤仙郡天下杂谈|图像处理 | 图像平滑之均值滤波、方框滤波、高斯滤波及中,Python
文章图片
均值滤波
1.原理
均值滤波是指任意一点的像素值 , 都是周围N*M个像素值的均值 。 例如下图中 , 红色点的像素值为蓝色背景区域像素值之和除25 。
凤仙郡天下杂谈|图像处理 | 图像平滑之均值滤波、方框滤波、高斯滤波及中,Python
文章图片
其中红色区域的像素值均值滤波处理过程为:((197+25+106+156+159)+(149+40+107+5+71)+(163+198+**226**+223+156)+(222+37+68+193+157)+(42+72+250+41+75))/25
其中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
文章图片
在图像简单平滑中 , 算法利用卷积模板逐一处理图像中每个像素 , 这一过程可以形象地比作对原始图像的像素一一进行过滤整理 , 在图像处理中把邻域像素逐一处理的算法过程称为滤波器 。 平滑线性滤波器的工作原理是利用模板对邻域内像素灰度进行加权平均 , 也称为均值滤波器 。
代码如下所示: