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
输出结果如下图所示:
文章插图
核设置为(10,10)和(20,20)会让图像变得更加模糊 。
文章插图
如果设置为(1,1)处理结果就是原图,核中每个权重值相同,称为均值 。
文章插图
方框滤波
方框滤波和均值滤波核基本一致,区别是需不需要均一化处理 。OpenCV调用boxFilter函数实现方框滤波 。函数如下:
result = cv2.boxFilter(原始图像, 目标图像深度, 核大小, normalize属性)
其中,目标图像深度是int类型,通常用“-1”表示与原始图像一致;核大小主要包括(3,3)和(5,5),如下所示 。
文章插图
normalize属性表示是否对目标图像进行归一化处理 。当normalize为true时需要执行均值化处理,当normalize为false时,不进行均值化处理,实际上为求周围各像素的和,很容易发生溢出,溢出时均为白色,对应像素值为255 。
文章插图
在图像简单平滑中,算法利用卷积模板逐一处理图像中每个像素,这一过程可以形象地比作对原始图像的像素一一进行过滤整理,在图像处理中把邻域像素逐一处理的算法过程称为滤波器 。平滑线性滤波器的工作原理是利用模板对邻域内像素灰度进行加权平均,也称为均值滤波器 。
文章插图
代码如下所示:
#encoding:utf-8
import 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表示进行归一化处理,此时与均值滤波相同,输出结果如下图所示:文章插图
下面是图像左上角处理前后的像素结果:
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-8
import 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
输出结果如下图所示:文章插图
上图很多像素为白色,因为图像求和结果几乎都是255 。如果设置的是2*2矩阵,只取四个像素结果要好些 。
result = cv2.boxFilter(source, -1, (2,2), normalize=0)
文章插图
文章插图
高斯滤波
为了克服简单局部平均法的弊端(图像模糊),目前已提出许多保持边缘、细节的局部平滑算法 。它们的出发点都集中在如何选择邻域的大小、形状和方向、参数加平均及邻域各店的权重系数等 。
推荐阅读
- 教你用Python批量下载静态页面图片
- 用 Python 高效智能管理文件夹
- Python 100个样例代码
- 用Python从头开始实现简单遗传算法
- Pyqtgraph是Python平台上一种功能强大的2D/3D绘图库
- Python的10个神奇的技巧
- 程序员用Python实现自动化控制键盘和鼠标
- Python语法之Django框架-安装
- 一篇文章搞定Python连接mysql数据库模块PyMySQL
- 一篇文章搞懂Python协程