Reduzierung Des Blindbildrauschens Mittels Gibbs-Diffusion
Blinde Bildentrauschung basierend auf Gibbs-Diffusion

Einführung in das Tutorial
GDiff steht für Gibbs-Diffusion, eine Methode zur blinden Rauschunterdrückung nach Bayes, die das Posterior-Sampling-Problem von Signal- und Rauschparametern löst. Es basiert auf einem Gibbs-Sampler, der die Sampling-Schritte mit einem vorab trainierten Diffusionsmodell (das das Signal priorisiert) und einem Hamiltonian-Monte-Carlo-Sampler abwechselt. Das Papier stellt seine Anwendungen in der natürlichen Bildrauschunterdrückung und Kosmologie (Analyse der kosmischen Mikrowellenhintergrundstrahlung) vor. Die Ergebnisse der Studie sindDem Lärm lauschen: Blinde Rauschunterdrückung mit Gibbs-Diffusion"
Das offizielle Dokument gibt nur die Testmethode an, die darin besteht, ein klares Originalbild einzugeben, Rauschen darüber zu legen und dann einen Vergleich zwischen nicht-blinder Rauschunterdrückung und blinder Rauschunterdrückung durchzuführen.
Effektdemonstration
Bei der offiziellen Effektdemonstration wird ein klares Originalbild eingegeben, Rauschen mit bestimmten Parametern darüber gelegt und anschließend eine blinde Rauschunterdrückung durchgeführt.
Die folgenden Abbildungen zeigen von links nach rechts: das Bild nach der Überlagerung des Rauschens, das Originalbild, den Blindentrauschungseffekt und den entrauschten posterioren Mittelwert

Einführung in blindes Denoising und nicht-blindes Denoising
Blind Denoising und Non-Blind Denoising sind zwei Methoden zur Rauschunterdrückung in der Bildverarbeitung und Signalverarbeitung. Ihr Hauptunterschied liegt im Grad der Vorhersage von Rauschinformationen.
Blinde Rauschunterdrückung
Definition: Blinde Rauschunterdrückung bezeichnet die Rauschunterdrückung ohne Kenntnis der Rauscheigenschaften oder des Rauschmodells. Bei dieser Methode ist kein Vorwissen über Rauschen erforderlich, sondern zur Rauschunterdrückung werden die Informationen des Bildes oder Signals selbst verwendet.
Merkmale:
- Unabhängig vom Rauschmodell: Art, Verteilung oder Intensität des Rauschens müssen nicht bekannt sein.
- Starke Anpassungsfähigkeit: Kann auf verschiedene Arten von Rauschen und Signalumgebungen angewendet werden.
- Hohe Komplexität: Da das Rauschmodell keine Hilfe bietet, erfordert die blinde Rauschunterdrückung normalerweise komplexere Algorithmen und mehr Rechenressourcen.
Nicht-blinde Rauschunterdrückung
Definition: Unter nicht-blinder Rauschunterdrückung versteht man die Rauschunterdrückung, wenn die Rauscheigenschaften oder das Rauschmodell bekannt sind. Diese Methode nutzt Vorkenntnisse zum Rauschen, um den Rauschunterdrückungsprozess zu optimieren.
Merkmale:
- Abhängigkeit vom Rauschmodell: Es erfordert Vorkenntnisse über Art, Verteilung und Intensität des Rauschens.
- Bessere Wirkung: Wenn das Rauschmodell bekannt ist, kann es für bestimmte Rauscharten optimiert werden, um eine bessere Rauschunterdrückung zu erzielen.
- Eingeschränkter Anwendungsbereich: Für unterschiedliche Arten von Rauschen sind unterschiedliche Modelle und Parameter erforderlich, und der Anwendungsbereich ist geringer als bei der blinden Rauschunterdrückung.
So führen Sie das Lernprogramm aus
Dieses Tutorial ist in zwei Teile gegliedert. Der erste Teil ist „Blind Denoising of Blurred Images“, der in der Datei start.ipynb (diese Datei) ausgeführt werden kann. Hier können Sie zur blinden Rauschunterdrückung ein unscharfes Bild mit Rauschen übergeben. Der zweite Teil ist „Clear Image Superimposed Noise and Denoising“, der in der Datei test.ipynb ausgeführt wird. Dies ist eine Vereinfachung des offiziellen Dokuments und kann verwendet werden, um klare Bilder mit überlagertem Rauschen zu übergeben, um den Unterschied zwischen dem blinden Rauschunterdrückungsmodell und dem nicht blinden Rauschunterdrückungsmodell zu vergleichen.
Wenn Sie benutzerdefinierte Bilder verwenden müssen, laden Sie die Bilder einfach hoch, ändern Sie die Pfade der Bilder, die Sie verarbeiten möchten, und führen Sie sie nacheinander aus. (Der Bildname muss auf Englisch sein)
Teil 1: Blinde Rauschunterdrückung unscharfer Bilder (start.ipynb)
Importieren Sie erforderliche Pakete
import sys, time
import torch
import numpy as np
import matplotlib.pyplot as plt
import corner
import arviz as az
from PIL import Image
sys.path.append('..')
from gdiff.data import ImageDataset, get_colored_noise_2d
from gdiff.model import load_model
import gdiff.hmc_utils as iut
from gdiff.utils import ssim, psnr, plot_power_spectrum, plot_list_of_images
plt.rcParams.update(
{
'text.usetex': False,
'font.family': 'stixgeneral',
'mathtext.fontset': 'stix',
}
)
Bildlese- und Vorverarbeitungsfunktionen, Verwendung stammt aus dem offiziellen Dokument data.py
#图片读取与预处理,方法来自官方文档 data.py
def readimg(filename):
from torchvision import transforms
img=Image.open(filename)
trans = transforms.Compose([transforms.Resize(256),
transforms.CenterCrop(256),
transforms.RandomHorizontalFlip(),
transforms.ToTensor()])
img=trans(img)
return img
Nachfolgend finden Sie die offizielle Methode zum Lesen von Datensätzen, die in diesem Dokument nicht verwendet wird. Benutzer können ihre eigenen Datensätze in ihren Ordnern ablegen und einige kleinere Änderungen vornehmen, um eine Stapelverarbeitung zu erreichen (im Datenordner können nur einige Ordnernamen ausgewählt werden).
#
# PARAMETERS 官方数据读取与噪声参数,模型选择
#
# Dataset and sample 读取官方数据集
dataset_name = "CBSD68" # Choices among "imagenet_train", "imagenet_val", "CBSD68", "McMaster", "Kodak24"
dataset = ImageDataset(dataset_name, data_dir='./data')
sample_id = 0 # np.random.randint(len(dataset))
# Noise 准备叠在在清晰图片上的噪声
phi_true = -0.4 # Spectral index -> between -1 and 1 (\varphi in the paper)
sigma_true = 0.1 # Noise level
# Device
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
# Model 选择模型,有 5000 与 10000 步迭代模型可选
diffusion_steps = 5000 # Number of diffusion steps: 5000 or 10000
model = load_model(diffusion_steps=diffusion_steps,
device=device,
root_dir='./model_checkpoints')
model.eval()
# Inference
num_chains = 4 # Number of HMC chains
n_it_gibbs = 50 # Number of Gibbs iterations after burn-in
n_it_burnin = 25 # Number of burn-in iterations
Lesen Sie als Nächstes das Bild, das entrauscht werden muss. Das in diesem Tutorial verwendete Bild ist beispielsweise „3_noisy.png“ im Home-Verzeichnis. Ändern Sie in img=readimg('3_noisy.png') einfach den Pfad in '3_noisy.png'.
Bei der A6000 mit einer einzelnen Karte dauert die Verarbeitung eines einzelnen Bildes mehrere Minuten.
#
# DENOISING 在此处读入的图片为高噪声图,在此处进行降噪处理
#
# 读取自己的高噪声图片,用于去噪
img=readimg('3_noisy.png')
x = img.to(device).unsqueeze(0)
# Our DDPM has discrete timestepping -> we get the time step closest to the chosen noise level
sigma_true_timestep, sigma_true = model.get_closest_timestep(torch.tensor([sigma_true]), ret_sigma=True)
alpha_bar_t = model.alpha_bar_t[sigma_true_timestep.cpu()].reshape(-1, 1, 1, 1).to(device)
print(f"Time step corresponding to noise level {sigma_true.item():.3f}: {sigma_true_timestep.item()}")
yt = torch.sqrt(alpha_bar_t) * x # Noisy image normalized for the diffusion model 归一化图像
# Non-blind denoising (for reference) 非盲去噪 即已知噪声参数的情况下去噪
print("Denoising in non-blind setting...")
t0 = time.time()
x_hat_nonblind = model.denoise_samples_batch_time(yt,
sigma_true_timestep.unsqueeze(0),
phi_ps=phi_true)
t1 = time.time()
print(f"Non-blind denoising took {t1-t0:.2f} seconds")
# Blind denoising with GDiff 基于 GDiff 的盲去噪
print("Denoising in blind setting (GDiff)...")
t0 = time.time()
phi_hat_blind, x_hat_blind = model.blind_denoising(x, yt,
num_chains_per_sample=num_chains,
n_it_gibbs=n_it_gibbs,
n_it_burnin=n_it_burnin)
t1 = time.time()
print(f"Blind denoising took {t1-t0:.2f} seconds")
# Denoised posterior mean estimate 去噪的后验均值估计
x_hat_blind_pmean = x_hat_blind[:, n_it_burnin:].mean(dim=(0, 1))
Zeitschritt entsprechend dem Rauschpegel 0,100: 134 Rauschunterdrückung in nicht blinder Einstellung ... Die nicht blinde Rauschunterdrückung dauerte 4,48 Sekunden. Rauschunterdrückung in blinder Einstellung (GDiff) ...
0%| | 0/75 [00:00
Anpassen der Schrittweite mithilfe von 300 Iterationen. Schrittweite festgelegt auf: Tensor([0,0179, 0,0181, 0,0179, 0,0194], Gerät='cuda:0')
100%|██████████| 75/75 [08:52<00:00, 7,10 s/it]
Die Blindentrauschung dauerte 532,30 Sekunden
#
# Plot of a reconstruction 展示结果 顺序为:原始图片 非盲去噪 盲去噪 去噪的后验均值
#
data = [x[0],
x_hat_blind[0, -1],
x_hat_blind_pmean]
data = [d.to(device) for d in data]
labels_base = [r"True $\mathbf{x}$",
r"Denoised $\hat{\mathbf{x}}$ (blind)",
r"Denoised $E[\mathbf{x}\,|\,\mathbf{y}]$ (blind)"]
labels = [labels_base[0] ,
labels_base[1] ,
labels_base[2] ]
plot_list_of_images(data, labels)
plot_power_spectrum(data, labels_base, figsize=(12, 3.5))
Beschneiden der Eingabedaten auf den gültigen Bereich für imshow mit RGB-Daten ([0..1] für Gleitkommazahlen oder [0..255] für Ganzzahlen).

