基于Pytorch的自然图像降噪
时间: 2025-04-21 11:33:14 浏览: 24
### 使用 PyTorch 实现自然图像降噪
#### 构建 CNN 去噪模型
为了有效去除自然图像中的噪声,可以采用基于卷积神经网络 (CNN) 的方法。该方法利用深层结构自动提取特征并重建干净图像[^1]。
```python
import torch
from torch import nn, optim
from torchvision.transforms.functional import to_tensor, to_pil_image
from PIL import Image
class DnCNN(nn.Module):
def __init__(self, num_layers=17, num_features=64):
super(DnCNN, self).__init__()
layers = [
nn.Conv2d(1, num_features, kernel_size=3, padding=1),
nn.ReLU(inplace=True)
]
for _ in range(num_layers - 2):
layers.append(
nn.Sequential(
nn.Conv2d(num_features, num_features, kernel_size=3, padding=1),
nn.BatchNorm2d(num_features),
nn.ReLU(inplace=True))
)
layers.append(nn.Conv2d(num_features, 1, kernel_size=3, padding=1))
model = nn.Sequential(*layers)
# 初始化权重
for m in model.modules():
if isinstance(m, nn.Conv2d):
nn.init.kaiming_normal_(m.weight.data, mode='fan_in')
model[-1].weight.data.normal_(mean=0.0, std=0.01) # 输出层特殊初始化
setattr(model, 'model', model)
setattr(self, '_modules', {'model': model})
def forward(x):
out = x.clone()
residual = self.model(out)
return x - residual
def train_model(dataloader, device="cuda"):
net = DnCNN().to(device)
criterion = nn.MSELoss() # 定义均方误差作为损失函数
optimizer = optim.Adam(net.parameters(), lr=0.001) # Adam优化算法
epochs = 50
for epoch in range(epochs):
running_loss = 0.0
for noisy_img, clean_img in dataloader:
inputs, labels = noisy_img.to(device), clean_img.to(device)
outputs = net(inputs)
loss = criterion(outputs, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
running_loss += loss.item()
print(f'Epoch [{epoch+1}/{epochs}], Loss: {running_loss/len(dataloader):.4f}')
```
此代码片段展示了如何创建一个简单的DnCNN(Deep Convolutional Neural Network),用于执行自然图像的去噪操作。注意,在实际应用中还需要准备合适的训练数据集以及调整超参数以获得最佳效果。
#### 数据预处理与增强
对于输入图片,通常会加入高斯白噪音模拟真实场景下的干扰情况,并将其转换成张量形式以便于后续计算:
```python
transform = transforms.Compose([
lambda x: Image.open(x).convert('L'), # 转灰度图
lambda x: np.array(x)[np.newaxis,...],
lambda x: add_noise(x), # 添加随机噪声
ToTensor(),
])
```
上述变换链将原始彩色照片转为单通道灰度版本,并施加人工合成的噪声污染,最后转化为适合传递给PyTorch模型的形式。
阅读全文
相关推荐


















