空间域滤波利用像素邻域的灰度关系进行计算
邻域:以图像某像素为中心的m×n个像素称为它的邻域,m,n为奇数
邻域操作的工具:模板(mask)
输出图像 ( x , y ) (x, y) (x,y)像素点的灰度等于邻域中各像素的灰度加权求和;模板中的值是系数值,而不是灰度值。
在待处理图像中逐点移动掩模,每点响应等于模板系数与模板对应像素灰度值的乘积之和:
g ( x , y ) = R = k 0 s 0 + k 1 s 1 + ⋅ ⋅ ⋅ + k 8 s 8 g(x,y) = R = k_0s_0 + k_1s_1+···+k_8s_8 g(x,y)=R=k0s0+k1s1+⋅⋅⋅+k8s8
图像平滑作用:
平滑空间滤波器的分类
平均模板, 输出邻域内的简单平均值,也称均值滤波器。
一 般 : m × n 平 均 模 板 R = 1 m ⋅ n ∑ i = 1 m ⋅ n Z i 一般:m\times n平均模板\\ R = \frac{1}{m·n}\sum_{i=1}^{m·n}Z_i 一般:m×n平均模板R=m⋅n1i=1∑m⋅nZi
Code
import matplotlib.pyplot as plt
import numpy as np
import cv2 as cv
# 平滑线性滤波器:均值滤波器
def meanfilter(img,mask_shape):
"""
:param img: 输入的灰度图
:param mask_shape: 模板形状
:return: 返回滤波后的图像
"""
if mask_shape[0]!=mask_shape[1] or mask_shape[0]%2!=1 or mask_shape[1]%2!=1:
print("The mask shape should be Singluar!")
return np.array([]).reshape((0,0))
mask = np.ones(mask_shape)/(mask_shape[0]*mask_shape[1])
cp_img = np.copy(img)
row,col = mask.shape
# 边界补零处理
r = (row-1)//2
c = (col-1)//2
rb = np.zeros((r,cp_img.shape[1]))
temp = np.vstack([rb,cp_img,rb])
cb = np.zeros((temp.shape[0],c))
last = np.hstack([cb,temp,cb])
mem = np.zeros(cp_img.shape)
# 加权求和
for i in range(r,last.shape[0]-r):
for j in range(c,last.shape[1]-c):
mem[i-r][j-c] = np.sum(mask*last[i-r:i+r+1,j-c:j+c+1])
return mem
if __name__=="__main__":
img = cv.imread("10.png")
img = cv.cvtColor(img, cv.COLOR_RGB2GRAY)
filter_img_1 = meanfilter(img, (3,3))
filter_img_2 = meanfilter(img, (5,5))
filter_img_3 = meanfilter(img, (7,7))
filter_img_4 = meanfilter(img, (9,9))
filter_img_5 = meanfilter(img, (15,15))
filter_img = {'img': img, 'mask=3x3': filter_img_1, 'mask=5x5': filter_img_2, 'mask=7x7': filter_img_3,'mask=9x9': filter_img_4, 'mask=15x15': filter_img_5}
i = 1
for k,v in filter_img.items():
plt.subplot(2, 3, i)
plt.imshow(v,cmap="gray")
plt.axis('off') # 去掉坐标轴
plt.title("{}".format(k))
i+=1
plt.show()
高斯平滑滤波器
平均模板对领域内的所有像素具有相同权重,容易造成图像迅速模糊。
改进:领域中心具有较大权重,边缘较小权重。
模板:二维高斯函数离散化。
Example:
w = 1 16 × { 1 2 1 2 4 2 1 2 1 } w = \frac{1}{16}\times\left\{ \begin{matrix} 1 & 2 & 1 \\ 2 & 4 & 2 \\ 1 & 2 & 1 \\ \end{matrix} \right\} w=161×⎩⎨⎧121242121⎭⎬⎫
虽然均值滤波器对噪声有抑制作用,但同时会使图像变得模糊。即使是加权均值滤波,改善的效果也是有限的。为了既消除噪声又保持细节(不模糊),必须改换滤波器的设计思路。
非线性滤波器:
响应基于邻域中像素的统计排序,由排序结果决定的值代替中心像素的值。又称统计排序滤波器。
最常见的是 中值滤波器。其次还有 最大值滤波器,最小值滤波器。
中值滤波器设计思想:
示例:
邻域平均与中值滤波的比较:
邻域平均滤波器在去掉孤立脉冲时模糊了图象,中值滤波器在去掉孤立脉冲时不影响图象
Code
import matplotlib.pyplot as plt
import numpy as np
import cv2 as cv
# 中值滤波
def medianfilter(img,m):
"""
:param img: 输入灰度图像
:param m: 进行中值滤波的领域窗口大小
:return cp_last: 滤波后的图像
"""
cp_img = np.copy(img)
row, col = m,m
# 边界补零处理
r = (row - 1) // 2
c = (col - 1) // 2
rb = np.zeros((r, cp_img.shape[1]))
temp = np.vstack([rb, cp_img, rb])
cb = np.zeros((temp.shape[0], c))
last = np.hstack([cb, temp, cb])
cp_last = np.copy(last)
for i in range(r, last.shape[0] - r):
for j in range(c, last.shape[1] - c):
cp_last[i][j] = np.median(last[i - r:i + r + 1, j - c:j + c + 1])
return cp_last
if __name__=="__main__":
img = cv.imread("11.png")
img = cv.cvtColor(img, cv.COLOR_RGB2GRAY)
mask_size = 3 # 表示领域窗口大小为 3x3
median_filter_img = medianfilter(img=img,m=mask_size)
mean_filter_img = meanfilter(img,(3,3))
median = cv.medianBlur(img,3)
plt.subplot(2, 2, 1)
plt.imshow(img,cmap="gray")
plt.axis('off')
plt.title("original_img")
plt.subplot(2, 2, 2)
plt.imshow(mean_filter_img,cmap="gray")
plt.axis('off')
plt.title("mean_filter_img")
plt.subplot(2, 2, 4)
plt.imshow(median,cmap="gray")
plt.axis('off')
plt.title("cv_median")
plt.subplot(2, 2, 3)
plt.imshow(median_filter_img,cmap="gray")
plt.axis('off')
plt.title("median_filter_img")
plt.show()
下面的两幅 original_img
分别是带椒盐噪声和 高斯噪声 的图片,经过 均值滤波器 和 中值滤波器过滤后,可以看出明显的对比效果。
平滑滤波适用于高斯噪声污染的噪声,中值滤波器适用于椒盐噪声污染的图像。
椒盐噪声: 也称为脉冲噪声,是图像中经常见到的一种噪声,它是一种随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或是两者皆有)。椒盐噪声的成因可能是影像讯号受到突如其来的强烈干扰而产生、类比数位转换器或位元传输错误等
高斯噪声是指它的概率密度函数服从高斯分布,即正态分布的一类噪声。常见的高斯噪声包括起伏噪声、宇宙噪声、热噪声和散粒噪声等等
统计滤波器:
中值滤波器
主要用途:去除噪声
计算公式: R = m i d { z k ∣ k = 1 , 2 , … , 9 } R = mid \{z_k | k = 1,2,…,9\} R=mid{zk∣k=1,2,…,9}
最大值滤波器
主要用途:寻找最亮点
计算公式: R = m a x { z k ∣ k = 1 , 2 , … , 9 } R = max \{z_k | k = 1,2,…,9\} R=max{zk∣k=1,2,…,9}
最小值滤波器
主要用途:寻找最暗点
计算公式: R = m i n { z k ∣ k = 1 , 2 , … , 9 } R = min \{z_k | k = 1,2,…,9\} R=min{zk∣k=1,2,…,9}
高斯噪声包括起伏噪声、宇宙噪声、热噪声和散粒噪声等等
统计滤波器:
中值滤波器
主要用途:去除噪声
计算公式: R = m i d { z k ∣ k = 1 , 2 , … , 9 } R = mid \{z_k | k = 1,2,…,9\} R=mid{zk∣k=1,2,…,9}
最大值滤波器
主要用途:寻找最亮点
计算公式: R = m a x { z k ∣ k = 1 , 2 , … , 9 } R = max \{z_k | k = 1,2,…,9\} R=max{zk∣k=1,2,…,9}
最小值滤波器
主要用途:寻找最暗点
计算公式: R = m i n { z k ∣ k = 1 , 2 , … , 9 } R = min \{z_k | k = 1,2,…,9\} R=min{zk∣k=1,2,…,9}