4-4 Python学习笔记4_滤波与Gauss噪声
1.中值滤波
中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。邻域窗口通常为3X3或5X5区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。(文字引用自百度百科中值滤波)
例:以3*3矩阵为例:
1 | 3 | 7 |
---|---|---|
8 | (6) | 5 |
7 | 4 | 1 |
做中值滤波处理后第五个位置处值(6)变为(5)
注1:重复值不舍,按照从小到大顺序排列。例如上述矩阵排序为:1,1,3,4,5,6,7,7,8;中值为5
注2:此时边界无法处理,既滤波法无法有效处理边界噪声
python程序:
创建随机矩阵,对随机矩阵处理!
代码
import numpy as np
import math
A=np.random.randint(1,100,(10,10)) #生成元素为100以内数字的10*10矩阵
## 定义3阶中值滤波函数(或定义k,编写k阶滤波)
print ('原矩阵 :',A)
def midF(M): #输入矩阵M(输入参数包括k)
[s,t]=np.shape(M)
M1=M
for i in range(0,s-1):
for j in range(0,t-1):
if i==0 or j==0 or i==s-1 or j==t-1: #(k阶则改为i>=(k-1)/2等)
M1[i,j]=M[i,j]
else:
k=np.sort(M[(i-1):(i+2),(j-1):(j+2)].reshape(1,-1))
M1[i,j]=np.median(k)
return(M1)
A1=midF(A)
print('中值滤波处理后:',A1)
结果:
中值滤波基本处理孤立噪声,其中最典型的是椒盐噪声
椒盐噪声: 椒盐噪声也称为脉冲噪声,是图像中经常见到的一种噪声,它是一种随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或是两者皆有)。椒盐噪声的成因可能是影像讯号受到突如其来的强烈干扰而产生、类比数位转换器或位元传输错误等。例如失效的感应器导致像素值为最小值,饱和的感应器导致像素值为最大值。(文字引用自百度百科椒盐噪声)
下面给大家展示一个例子及代码
import numpy as np
import random
import cv2
from matplotlib import pyplot as plt
import matplotlib.image as mpimg
## 生成椒盐噪声的函数
#k<p为0-1的数字,规定生成一个0-1的随机数,若此随机数小于k则像素点为黑点,大于p为白点
def sp_noise(image,k,p):
s=image.shape[0] #矩阵维度(行)
t=image.shape[1] #列
for i in range(s): #for循环生成随机黑白点
for j in range(t):
rdn = random.random()
if rdn < k:
image[i][j] = 0
elif rdn > p:
image[i][j] = 255
return image
## 中值滤波函数
def midF(M):
s=np.shape(M)[0]
t=np.shape(M)[1]
for i in range(s):
for j in range(t):
if i==0 or j==0 or i==s-2 or j==t-2:
M[i,j]=M[i,j]
else:
k=np.sort(M[(i-1):(i+2),(j-1):(j+2)].reshape(1,-1)) #将3*3网格排序成一列
M[i,j]=np.median(k) #将此处的值设置为九个点的中值
return(M)
#将RGB图转为灰度图的函数
def rgb2gray(rgb):
return np.dot(rgb[..., :3], [0.2989, 0.5870, 0.1140])
#读取原始图像
img=mpimg.imread('qinghu.jpg')
#将图像转为灰度矩阵
img1=rgb2gray(img)
#绘制灰度图(原始)
plt.figure(1)
plt.imshow(img1,cmap=plt.get_cmap('gray'))
#椒盐噪声处理
out1 = sp_noise(img1, 0.02,0.95)
#绘制椒盐噪声处理后的图像
plt.figure(2)
plt.imshow(out1,cmap=plt.get_cmap('gray'))
#中值滤波操作椒盐噪声图片
out2 = midF(out1)
# 绘制中值滤波处理后的图像
plt.figure(3)
plt.imshow(out2,cmap=plt.get_cmap('gray'))
plt.show()
原始图像
椒盐噪声
处理后
2.均值滤波
在中值滤波打下了坚实的基础后,后面内容便可行云流水般开展了。
均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围8个像素,构成一个滤波模板,即包括目标像素本身),再用模板中的全体像素的平均值来代替原来像素值
均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。 (文字引用自百度百科均值滤波)
均值滤波代码不再赘述,只需将第一个程序中求中值np.median()改为求均值np.average()即可
3.1 GAUSSIAN 噪声
所谓高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。如果一个噪声,它的幅度分布服从高斯分布,而它的功率谱密度又是均匀分布的,则称它为高斯白噪声。高斯白噪声的二阶矩不相关,一阶矩为常数,是指先后信号在时间上的相关性。高斯白噪声包括热噪声和散粒噪声。在通信信道测试和建模中,高斯噪声被用作加性白噪声以产生加性白高斯噪声。(文字引用百度百科高斯噪声)
注:(正态分布)若随机变量X服从一个数学期望为μ、方差为σ2的正态分布,记为N(μ,σ2)。其概率密度函数为正态分布的期望值μ决定了其位置,其标准差σ决定了分布的幅度。当μ = 0,σ = 1时的正态分布是标准正态分布。(文字引用百度百科正态分布)
3.2 GAUSSIAN滤波
高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。 通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。(文字引用百度百科高斯滤波)
3.3 GAUSSIAN噪声与滤波程序
import numpy as np
import random
import cv2
from matplotlib import pyplot as plt
import matplotlib.image as mpimg
def rgb2gray(rgb):
return np.dot(rgb[..., :3], [0.2989, 0.5870, 0.1140])
#读取原始图像
img=mpimg.imread('qinghu.jpg')
#将图像转为灰度矩阵
img1=rgb2gray(img)
##gaussian噪声,期望0,标准差15
noise = np.random.normal(0, 15, img1.shape)
noisy = img1 + noise
##Gaussian滤波处理gaussian噪声图片
out=cv2.GaussianBlur(noisy,(3,3),0)
##绘图
plt.subplot(1,3,1)
plt.imshow(img1,cmap=plt.get_cmap('gray'))
plt.subplot(1,3,2)
plt.imshow(noisy,cmap=plt.get_cmap('gray'))
plt.subplot(1,3,3)
plt.imshow(out,cmap=plt.get_cmap('gray'))
plt.show()
结果: