我想向 MNIST 数据集添加可逆噪声以进行一些实验。
这是我正在尝试的自动提款机:
import torchvision.transforms as transforms
from torchvision.datasets import MNIST
from torch.utils.data import DataLoader
from PIL import Image
import torchvision
def display_img(pixels, label = None):
plt.imshow(pixels, cmap="gray")
if label:
plt.title("Label: %d" % label)
plt.axis("off")
plt.show()
class NoisyMNIST(torchvision.datasets.MNIST):
def __init__(self, root, train=True, transform=None, target_transform=None, download=False):
super(NoisyMNIST, self).__init__(root, train=train, transform=transform, target_transform=target_transform, download=download)
def __getitem__(self, index):
img, target = self.data[index], self.targets[index]
img = Image.fromarray(img.numpy(), mode="L")
if self.transform is not None:
img = self.transform(img)
# add the noise
noise_level = 0.3
noise = self.generate_safe_random_tensor(img) * noise_level
noisy_img = img + noise
return noisy_img, noise, img, target
def generate_safe_random_tensor(self, img):
"""generates random noise for an image but limits the pixel values between -1 and 1"""
min_values = torch.clamp(-1 - img, max=0)
max_values = torch.clamp(1 - img, min=0)
return torch.rand(img.shape) * (max_values - min_values) + min_values
# Define transformations to apply to the data
transform = transforms.Compose([
transforms.ToTensor(), # Convert images to tensors
transforms.Normalize((0.1307,), (0.3081,)),
])
train_dataset = NoisyMNIST(root='./data', train=True, download=True, transform=transform)
test_dataset = NoisyMNIST(root='./data', train=False, download=True, transform=transform)
np_noise = train_dataset[img_id][1]
np_data = train_dataset[img_id][0]
display_img(np_data_sub_noise, 4)
理想情况下,这将为我提供常规 MNIST 数据集以及嘈杂的 MNIST 图像和添加的噪声集合。鉴于此,我假设我可以从噪声图像中减去噪声并返回到原始图像,但我的图像操作是不可逆的。
任何指针或代码片段将不胜感激。以下是我目前通过代码获得的图像:
原图:
添加噪音:
对于有噪声的图像减去噪声:
不要存储您产生的噪音。
存储噪声,即干净主体和噪声主体之间的差异。 您可以安全地减去那些值。
当您将噪声应用于由整数组成的图片时,您将得到整数上溢/下溢/环绕(200 + 200 = 400,mod 256)或饱和度(200 + 200 = 255,剪裁)。这就是您所看到的差异的根源。
请记住,有损图像压缩是有损。由于您似乎关心精确的像素值,因此您应该只想使用无损压缩。