备注
前往结尾 下载完整示例代码。或在 Binder 上通过浏览器运行此示例。
去噪一张图片#
在这个例子中,我们使用总变差、双边和小波去噪滤波器对一张有噪声的图片进行去噪处理。
总变差和对边算法通常会产生带有平坦区域和锐利边缘的“海报化”图像。通过控制去噪与忠实于原始图像之间的权衡,可以改变海报化的程度。
总变差滤波器#
此过滤器的结果是一张图像,其总变差范数最小,同时尽可能接近初始图像。总变差是图像梯度的L1范数。
双边滤波器#
双边滤波器是一种边缘保持和噪声降低的滤波器。它根据像素的空间接近度和辐射相似性进行平均。
小波去噪滤波器#
小波去噪滤波器依赖于图像的小波表示。噪声由小波域中的小值表示,这些值被设置为0。
在彩色图像中,小波去噪通常在 YCbCr 色彩空间 中进行,因为在单独的色彩通道中去噪可能会导致更明显的噪声。
Estimated Gaussian noise standard deviation = 0.14848405436861947
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers). Got range [-0.008903191917004503..0.8256882813783929].
import matplotlib.pyplot as plt
from skimage.restoration import (
denoise_tv_chambolle,
denoise_bilateral,
denoise_wavelet,
estimate_sigma,
)
from skimage import data, img_as_float
from skimage.util import random_noise
original = img_as_float(data.chelsea()[100:250, 50:300])
sigma = 0.155
noisy = random_noise(original, var=sigma**2)
fig, ax = plt.subplots(nrows=2, ncols=4, figsize=(8, 5), sharex=True, sharey=True)
plt.gray()
# Estimate the average noise standard deviation across color channels.
sigma_est = estimate_sigma(noisy, channel_axis=-1, average_sigmas=True)
# Due to clipping in random_noise, the estimate will be a bit smaller than the
# specified sigma.
print(f'Estimated Gaussian noise standard deviation = {sigma_est}')
ax[0, 0].imshow(noisy)
ax[0, 0].axis('off')
ax[0, 0].set_title('Noisy')
ax[0, 1].imshow(denoise_tv_chambolle(noisy, weight=0.1, channel_axis=-1))
ax[0, 1].axis('off')
ax[0, 1].set_title('TV')
ax[0, 2].imshow(
denoise_bilateral(noisy, sigma_color=0.05, sigma_spatial=15, channel_axis=-1)
)
ax[0, 2].axis('off')
ax[0, 2].set_title('Bilateral')
ax[0, 3].imshow(denoise_wavelet(noisy, channel_axis=-1, rescale_sigma=True))
ax[0, 3].axis('off')
ax[0, 3].set_title('Wavelet denoising')
ax[1, 1].imshow(denoise_tv_chambolle(noisy, weight=0.2, channel_axis=-1))
ax[1, 1].axis('off')
ax[1, 1].set_title('(more) TV')
ax[1, 2].imshow(
denoise_bilateral(noisy, sigma_color=0.1, sigma_spatial=15, channel_axis=-1)
)
ax[1, 2].axis('off')
ax[1, 2].set_title('(more) Bilateral')
ax[1, 3].imshow(
denoise_wavelet(noisy, channel_axis=-1, convert2ycbcr=True, rescale_sigma=True)
)
ax[1, 3].axis('off')
ax[1, 3].set_title('Wavelet denoising\nin YCbCr colorspace')
ax[1, 0].imshow(original)
ax[1, 0].axis('off')
ax[1, 0].set_title('Original')
fig.tight_layout()
plt.show()
脚本总运行时间: (0 分钟 4.772 秒)