Python實現(xiàn)對圖像加噪(高斯噪聲 椒鹽噪聲)
更新時間:2021年11月24日 09:40:31 作者:驪山道童
這篇文章主要介紹了展示通過Python給圖像疊加不同等級的椒鹽噪聲和高斯噪聲的代碼,相應的疊加噪聲的已編為對應的類,可實例化使用。感興趣的同學可以看看
內容簡介
展示如何給圖像疊加不同等級的椒鹽噪聲和高斯噪聲的代碼,相應的疊加噪聲的已編為對應的類,可實例化使用。以下主要展示自己編寫的:
加噪聲的代碼(高斯噪聲,椒鹽噪聲)
add_noise.py
#代碼中的noisef為信號等級,例如我需要0.7的噪聲,傳入參數(shù)我傳入的是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): 概率值,依概率執(zhí)行該操作
"""
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):
"""增加高斯噪聲
此函數(shù)用將產生的高斯噪聲加到圖片上
傳入:
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中如何使用
# 圖像變換和加噪聲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)
補充
圖像添加隨機噪聲
隨機噪聲就是通過隨機函數(shù)在圖像上隨機地添加噪聲點
def random_noise(image,noise_num):
'''
添加隨機噪點(實際上就是隨機在圖像上將像素點的灰度值變?yōu)?55即白色)
:param image: 需要加噪的圖片
:param noise_num: 添加的噪音點數(shù)目,一般是上千級別的
:return: img_noise
'''
#
# 參數(shù)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)#隨機生成指定范圍的整數(shù)
y = np.random.randint(0, cols)
img_noise[x, y, :] = 255
return img_noise
img_noise = random_noise("colorful_lena.jpg",3000)
cv2.imshow('random_noise',img_noise)
cv2.waitKey(0)
以上就是Python實現(xiàn)對圖像添加高斯噪聲或椒鹽噪聲的詳細內容,更多關于Python的資料請關注腳本之家其它相關文章!
相關文章
Python實現(xiàn)給文件添加內容及得到文件信息的方法
這篇文章主要介紹了Python實現(xiàn)給文件添加內容及得到文件信息的方法,可實現(xiàn)從文件開頭添加內容的功能,需要的朋友可以參考下2015-05-05
Python使用Keras庫中的LSTM模型生成新文本內容教程
Python語言使用金庸小說文本庫,對文本進行預處理,然后使用Keras庫中的LSTM模型創(chuàng)建和訓練了模型,根據(jù)這個模型,我們可以生成新的文本,并探索小說的不同應用2024-01-01
python線程池 ThreadPoolExecutor 的用法示例
這篇文章主要介紹了python線程池 ThreadPoolExecutor 的用法示例,幫助大家更好得理解和使用python線程池,感興趣的朋友可以了解下2020-10-10
Python中l(wèi)ogging日志記錄到文件及自動分割的操作代碼
這篇文章主要介紹了Python中l(wèi)ogging日志記錄到文件及自動分割,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08
使用Python的開發(fā)框架Brownie部署以太坊智能合約
在本文中,我們將使用Python部署智能合約。這篇文章可能是您走向智能合約和區(qū)塊鏈開發(fā)的橋梁!2021-05-05

