其中N(x,y)对应f(x,y)中(x,y)的n×n邻域,与模板W所对应的范围对应。
当使用的平滑模板尺寸增大时,对噪声的消除效果有所增强,但是图像更模糊,可视细节逐渐减少,运算量逐步增大
则均值滤波器的计算量:O(WHn)
若使用加法结合律,将二维模板分为两个方向依次计算,就可以将计算量降低到O(WH(n+n)=2WHn)。
若使用递归的方式,还可以将计算量降低到O(WH)
四、实现:
开发环境:Windows10、python3.7、OpenCV-2、pycharm。
先贴代码吧:
import cv2
import numpy as np
import matplotlib.pyplot as plt
#加椒盐噪声的函数
def saltPepper(image, salt, pepper):
height = image.shape[0]
width = image.shape[1]
pertotal = salt + pepper #总噪声占比
noiseImage = image.copy()
noiseNum = int(pertotal * height * width)
for i in range(noiseNum):
rows = np.random.randint(0, height-1)
cols = np.random.randint(0,width-1)
if(np.random.randint(0,100)
代码中有几个函数需要在这里介绍说明一下:
参考文档:
https://docs.opencv.org/3.0-last-rst/index.html
https://www.cnblogs.com/Undo-self-blog/p/8423851.html
https://matplotlib.org/index.html
cv2.imread(filename, flags)
filename——文件名称
flags——读入类型
IMREAD_GRAYSCALE=0 #以灰度图像的格式读入
IMREAD_UNCHANGED=-1 #以原图格式读入
IMREAD_COLOR=1 #以彩色图像读入
cv2.blur(src, ksize, dst, anchor, borderType)
src——输入图像
ksize——卷积核(模板)大小
dst——输出图像
anchor——卷积内核锚点,默认参数(-1, -1)为内核中心
borderType——卷积到中心像素如何填充边界的方法
plt.subplot(nrows, ncols, index, **kwargs)
前三个参数:nrows、ncols、index——指出子图位置,分别为总行数、总列数、索引值(从1开始,从左上角增加到右下角)。也可以将前三个参数合成为一个参数,例如plt.subplot(221)就指总共有2行2列,该子图在第一个位置,这三个数都不能超过10
第四个参数:projection : {None, ‘aitoff’, ‘hammer’, ‘lambert’, ‘mollweide’, ‘polar’, ‘rectilinear’, str},可选参数,用来说明子图的类型,默认None是一个线形图
第五个参数:polar : boolean, optional。 如果选择true,就是一个极点图,上一个参数也能实现该功能。
plt.imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=None, vmin=None, vmax=None, origin=None, extent=None, shape=, filternorm=1, filterrad=4.0, imlim= , resample=None, url=None, *, data=None, **kwargs)
X——类数组或PIL图像
camp——可选参数,字符串或颜色地图中的name属性,对于RGB(A)数据,忽略此参数
其余参数含义不一一赘述。
plt.title(label, fontdict=None, loc='center', pad=None, **kwargs)
lable——标题文本(str)
fontdict——一个控制标题字体和大小的字典数据类型
默认字典为:
{'fontsize': rcParams['axes.titlesize'], 'fontweight' : rcParams['axes.titleweight'], 'verticalalignment': 'baseline', 'horizontalalignment': loc}
loc——{'center', 'left', 'right'}标题位置(str),可选参数,默认值为"center"
pad——标题相对于轴顶部的偏移量,以点为单位(float)
text——表示标题的matplotlib文本实例
plt.xticks(ticks=None, labels=None, **kwargs)
ticks——刻度线应放置的位置列表,可以传递一个空列表来禁用xticks
labels——显示标签列表,放置在给定位置,可选参数