基于图像均值消除随机噪声
- 前言
- 图像均值计算
- 去除图像噪声
- 相关链接
前言
在本节中,我们将学习如何从一组带有噪声的输入图像中估算一个无噪声的图像,所有图像都是通过使用原始(无噪声)图像像素添加独立同分布的随机噪声创建的,只需计算噪声图像的平均值/中值。
图像均值计算
令
X
X
X 为尺寸
h
×
w
h×w
h×w 的原始输入图像,并通过添加
n
n
n 个不同的随机噪声矩阵生成
n
n
n 个噪声输出图像,
E
k
E_k
Ek 是尺寸为
h
x
w
hxw
hxw 的随机噪声矩阵,因此带有噪声的图像为
X
+
E
k
X +E_k
X+Ek,其中
k
=
1
,
2
,
3
…
k = 1,2,3…
k=1,2,3…。
我们假设噪声矩阵
E
k
E_k
Ek 中的每个元素都是均值为 0
的满足独立同分布的高斯函数,
E
k
(
i
,
j
)
E^{(i,j)}_k
Ek(i,j) 表示第
k
k
k 个噪声矩阵的元素。根据中心限制定理:
lim x → ∞ E ˉ ( i , j ) σ n → 0 {\lim_{x \to \infty}} \frac {\bar E ^{(i,j)}} {\frac {\sigma} {\sqrt n}}\to 0 x→∞limnσEˉ(i,j)→0
因此,可以得到以下结果:
E ˉ ( i , j ) = ∑ k = 1 n E k ( i , j ) n {\bar E ^{(i,j)}} =\frac {\sum_{k=1}^n E_k^{(i,j)}} {n} Eˉ(i,j)=n∑k=1nEk(i,j)
即
E
ˉ
(
i
,
j
)
{\bar E ^{(i,j)}}
Eˉ(i,j) 对应于噪声矩阵中
(
i
,
j
)
(i,j)
(i,j) 元素的平均值。
这意味着,如果我们有很多带有噪声的图像,并且假设噪声满足独立同分布,通过简单计算带有噪声图像的均值,就可以去除图像中的噪音。如果我们有彩色的噪声图像,在每个颜色通道上计算均值,那么通过独立同分布假设,我们可以获得(几乎)无噪声图像。该理论适用于具有零均值的任意分布的噪声,而无需是高斯分布。
去除图像噪声
我们也可以用中位数而不是平均值来从带有噪声的图像(满足独立同分布)中估计无噪声图像,则也可以得到相似的结果。
(1) 导入所有必需的库、模块和函数,从磁盘中读取输入图像并将其转换为浮点类型:
from skimage import img_as_float
from skimage.util import random_noise
from skimage.metrics import peak_signal_noise_ratio
from skimage.io import imread
import matplotlib.pylab as plt
import numpy as np
def plot_image(image, title=None, sz=10):
plt.imshow(image)
plt.title(title, size=sz)
plt.axis('off')
im = img_as_float(imread('1.png')) # original image
(2) 通过向原始图像中添加独立同分布的高斯噪声(具有零均值)来创建 n
个带有噪声图像:
n = 100
images = np.zeros((n, im.shape[0], im.shape[1], im.shape[2]))
sigma = 0.2
for i in range(n):
images[i,...] = random_noise(im, var=sigma**2)
(3) 使用 scikit-image
库函数,计算噪声图像的平均值和中位数:
im_mean = images.mean(axis=0)
im_median = np.median(images, axis=0)
(4) 将输出图像的 PSNR
与原始无噪声图像进行比较。绘制原始图像、带有噪声图像和输出图像:
plt.figure(figsize=(10,10))
plt.subplots_adjust(left=.02, right=.98, bottom=.001, top=.96, wspace=.05, hspace=.01)
plt.subplot(221), plot_image(im, 'Original image')
plt.subplot(222), plot_image(images[0], 'Noisy PSNR: ' + str(round(peak_signal_noise_ratio(im, images[0]),3)))
plt.subplot(223), plot_image(im_mean, 'Mean PSNR: ' + str(round(peak_signal_noise_ratio(im, im_mean),3)))
plt.subplot(224), plot_image(im_median, 'Median PSNR: ' + str(round(peak_signal_noise_ratio(im, im_median),3)))
plt.show()
从上图可以看出,估计的无噪图像在视觉效果上与原始的无噪声图像类似,且同样具有较高 PSNR
。
(5) 根据给定带有噪声的图像绘制彩色通道直方图,将像素的真实值绘制为实线,将通过计算均值得到的每个彩色通道的像素估计值绘制为虚线:
plt.figure(figsize=(10,5))
plt.hist(images[:,100,100,0], color='red', alpha=0.2, label='red')
plt.hist(images[:,100,100,1], color='green', alpha=0.2, label='green')
plt.hist(images[:,100,100,2], color='blue', alpha=0.2, label='blue')
plt.vlines(im[100,100,0], 0, 20, color='red', label='original')
plt.vlines(im[100,100,1], 0, 20, color='green', label='original')
plt.vlines(im[100,100,2], 0, 20, color='blue', label='original')
plt.vlines(im_mean[100,100,0], 0, 20, color='red', linestyles='dashed', label='estimated')
plt.vlines(im_mean[100,100,1], 0, 20, color='green', linestyles='dashed', label='estimated')
plt.vlines(im_mean[100,100,2], 0, 20, color='blue', linestyles='dashed', label='estimated')
plt.legend()
plt.grid()
plt.show()
相关链接
Python图像处理【1】图像与视频处理基础
Python图像处理【2】探索Python图像处理库
Python图像处理【3】Python图像处理库应用
Python图像处理【4】图像线性变换
Python图像处理【5】图像扭曲/逆扭曲
Python图像处理【6】通过哈希查找重复和类似的图像
Python图像处理【7】采样、卷积与离散傅里叶变换
Python图像处理【8】使用低通滤波器模糊图像
Python图像处理【9】使用高通滤波器执行边缘检测
Python图像处理【10】基于离散余弦变换的图像压缩
Python图像处理【11】利用反卷积执行图像去模糊
Python图像处理【12】基于小波变换执行图像去噪
Python图像处理【13】使用PIL执行图像降噪
Python图像处理【14】基于非线性滤波器的图像去噪
Python图像处理【15】基于非锐化掩码锐化图像