內容簡介
展示如何給圖像疊加不同等級的椒鹽噪聲和高斯噪聲的代碼,相應的疊加噪聲的已編為對應的類,可實例化使用。以下主要展示自己編寫的:
加噪聲的代碼(高斯噪聲,椒鹽噪聲)
add_noise.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
#代碼中的noisef為信號等級,例如我需要0.7的噪聲,傳入參數我傳入的是1-0.7 from PIL import Image import numpy as np import random import torchvision.transforms as transforms norm_mean = ( 0.5 , 0.5 , 0.5 ) norm_std = ( 0.5 , 0.5 , 0.5 ) class AddPepperNoise( object ): """增加椒鹽噪聲 Args: snr (float): Signal Noise Rate p (float): 概率值,依概率執行該操作 """ def __init__( self , snr, p = 0.9 ): assert isinstance (snr, float ) and ( isinstance (p, float )) # 2020 07 26 or --> and self .snr = snr self .p = p def __call__( self , img): """ Args: img (PIL Image): PIL Image Returns: PIL Image: PIL image. """ if random.uniform( 0 , 1 ) < self .p: img_ = np.array(img).copy() h, w, c = img_.shape signal_pct = self .snr noise_pct = ( 1 - self .snr) mask = np.random.choice(( 0 , 1 , 2 ), size = (h, w, 1 ), p = [signal_pct, noise_pct / 2. , noise_pct / 2. ]) mask = np.repeat(mask, c, axis = 2 ) img_[mask = = 1 ] = 255 # 鹽噪聲 img_[mask = = 2 ] = 0 # 椒噪聲 return Image.fromarray(img_.astype( 'uint8' )).convert( 'RGB' ) else : return img class Gaussian_noise( object ): """增加高斯噪聲 此函數用將產生的高斯噪聲加到圖片上 傳入: img : 原圖 mean : 均值 sigma : 標準差 返回: gaussian_out : 噪聲處理后的圖片 """ def __init__( self , mean, sigma): self .mean = mean self .sigma = sigma def __call__( self , img): """ Args: img (PIL Image): PIL Image Returns: PIL Image: PIL image. """ # 將圖片灰度標準化 img_ = np.array(img).copy() img_ = img_ / 255.0 # 產生高斯 noise noise = np.random.normal( self .mean, self .sigma, img_.shape) # 將噪聲和圖片疊加 gaussian_out = img_ + noise # 將超過 1 的置 1,低于 0 的置 0 gaussian_out = np.clip(gaussian_out, 0 , 1 ) # 將圖片灰度范圍的恢復為 0-255 gaussian_out = np.uint8(gaussian_out * 255 ) # 將噪聲范圍搞為 0-255 # noise = np.uint8(noise*255) return Image.fromarray(gaussian_out).convert( 'RGB' ) def image_transform(noisef): """對訓練集和測試集的圖片作預處理轉換 train_transform:加噪圖 _train_transform:原圖(不加噪) test_transform:測試圖(不加噪) """ train_transform = transforms.Compose([ transforms.Resize(( 256 , 256 )), # 重設大小 #transforms.RandomCrop(32,padding=4), AddPepperNoise(noisef, p = 0.9 ), #加椒鹽噪聲 #Gaussian_noise(0, noisef), # 加高斯噪聲 transforms.ToTensor(), # 轉換為張量 # transforms.Normalize(norm_mean,norm_std), ]) _train_transform = transforms.Compose([ transforms.Resize(( 256 , 256 )), #transforms.RandomCrop(32,padding=4), transforms.ToTensor(), # transforms.Normalize(norm_mean,norm_std), ]) test_transform = transforms.Compose([ transforms.Resize(( 256 , 256 )), #transforms.RandomCrop(32,padding=4), transforms.ToTensor(), # transforms.Normalize(norm_mean,norm_std), ]) return train_transform, _train_transform, test_transform |
在pytorch中如何使用
1
2
3
4
5
6
|
# 圖像變換和加噪聲train_transform為加噪圖,_train_transform為原圖,test_transform為測試圖 noisef為傳入的噪聲等級 train_transform,_train_transform,test_transform = image_transform(noisef) training_data = FabricDataset_file(data_dir = train_dir,transform = train_transform) _training_data = FabricDataset_file(data_dir = _train_dir,transform = _train_transform) testing_data = FabricDataset_file(data_dir = test_dir,transform = test_transform)<font face = "Arial, Verdana, sans-serif" ><span style = "white-space: normal;" > < / span>< / font> |
補充
圖像添加隨機噪聲
隨機噪聲就是通過隨機函數在圖像上隨機地添加噪聲點
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
def random_noise(image,noise_num): ''' 添加隨機噪點(實際上就是隨機在圖像上將像素點的灰度值變為255即白色) :param image: 需要加噪的圖片 :param noise_num: 添加的噪音點數目,一般是上千級別的 :return: img_noise ''' # # 參數image:,noise_num: img = cv2.imread(image) img_noise = img # cv2.imshow("src", img) rows, cols, chn = img_noise.shape # 加噪聲 for i in range (noise_num): x = np.random.randint( 0 , rows) #隨機生成指定范圍的整數 y = np.random.randint( 0 , cols) img_noise[x, y, :] = 255 return img_noise |
1
2
3
|
img_noise = random_noise( "colorful_lena.jpg" , 3000 ) cv2.imshow( 'random_noise' ,img_noise) cv2.waitKey( 0 ) |
以上就是Python實現對圖像添加高斯噪聲或椒鹽噪聲的詳細內容,更多關于Python的資料請關注服務器之家其它相關文章!
原文鏈接:https://blog.csdn.net/qq_41858510/article/details/121485126