平滑线性滤波器
图像去噪这一块内容庞杂,我本来打算和形态学处理一样用一篇博客介绍完整,但是当所有目录列出来后,还是打算分4篇博客进行介绍分别为空间域3篇和频率域1篇
这篇博客主要是空间域线性滤波
噪声类型为:
- 高斯噪声,
- 白噪声,
- 胡椒噪声,
效果方面为:
- 不(或者是非刻意)保边缘
- 保边缘
均值滤波
善于高斯噪声,其中分为两类均值滤波分别为:算术均值,几何均值
算术均值:即求模板内的像素值平均值,理解:
- 假如当前点为平滑区域的点,那么与周围像素一起算均值后,其值必定保持不变
- 假如当前点为噪声点,那么与周围像素一起算均值后,其值必定减小,达到去噪效果
- 如果当前点为边缘区域的点,那么与周围像素一起算均值后,其值必定减小,则使得边缘变得模糊
几何均值:算是一个鸡肋滤波,基本无法使用,虽然可以有保边缘的作用,但是效果并不突出,在博客后面我补充了一个新的保边缘滤波故这里不做介绍
故算术均值滤波去高斯噪声不保边缘
代码如下: 其中不包含
import cv2
import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
def show(f, s, a, b, c):
plt.subplot(a, b, c)
plt.imshow(f, "gray")
plt.axis('on')
plt.title(s)
# 高斯噪声函数单行
def wgn(x, snr):
snr = 10 ** (snr / 10.0)
xpower = np.sum(x ** 2) / len(x)
npower = xpower / snr
return np.random.randn(len(x)) * np.sqrt(npower)
def main():
original = plt.imread("lena.tiff", 0)
rows, cols = original.shape
original_noise = original.copy().astype(np.float64)
# 生成噪声图像,信噪比为10
for i in range(cols):
original_noise[:, i] += wgn(original_noise[:, i], 10)
mask = np.ones(9).reshape(3, 3)
ImageDenoise = np.zeros(original.shape)
for i in range(1, rows - 1):
for j in range(1, cols - 1):
ImageDenoise[i, j] = np.mean(original[i - 1:i +