Python實(shí)現(xiàn)對(duì)圖像加噪(高斯噪聲 椒鹽噪聲)
內(nèi)容簡(jiǎn)介
展示如何給圖像疊加不同等級(jí)的椒鹽噪聲和高斯噪聲的代碼,相應(yīng)的疊加噪聲的已編為對(duì)應(yīng)的類,可實(shí)例化使用。以下主要展示自己編寫的:
加噪聲的代碼(高斯噪聲,椒鹽噪聲)
add_noise.py
#代碼中的noisef為信號(hào)等級(jí),例如我需要0.7的噪聲,傳入?yún)?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ù)用將產(chǎn)生的高斯噪聲加到圖片上
傳入:
img : 原圖
mean : 均值
sigma : 標(biāo)準(zhǔn)差
返回:
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.
"""
# 將圖片灰度標(biāo)準(zhǔn)化
img_ = np.array(img).copy()
img_ = img_ / 255.0
# 產(chǎn)生高斯 noise
noise = np.random.normal(self.mean, self.sigma, img_.shape)
# 將噪聲和圖片疊加
gaussian_out = img_ + noise
# 將超過(guò) 1 的置 1,低于 0 的置 0
gaussian_out = np.clip(gaussian_out, 0, 1)
# 將圖片灰度范圍的恢復(fù)為 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):
"""對(duì)訓(xùn)練集和測(cè)試集的圖片作預(yù)處理轉(zhuǎn)換
train_transform:加噪圖
_train_transform:原圖(不加噪)
test_transform:測(cè)試圖(不加噪)
"""
train_transform = transforms.Compose([
transforms.Resize((256, 256)), # 重設(shè)大小
#transforms.RandomCrop(32,padding=4),
AddPepperNoise(noisef, p=0.9), #加椒鹽噪聲
#Gaussian_noise(0, noisef), # 加高斯噪聲
transforms.ToTensor(), # 轉(zhuǎn)換為張量
# 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為測(cè)試圖 noisef為傳入的噪聲等級(jí)
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)
補(bǔ)充
圖像添加隨機(jī)噪聲
隨機(jī)噪聲就是通過(guò)隨機(jī)函數(shù)在圖像上隨機(jī)地添加噪聲點(diǎn)
def random_noise(image,noise_num):
'''
添加隨機(jī)噪點(diǎn)(實(shí)際上就是隨機(jī)在圖像上將像素點(diǎn)的灰度值變?yōu)?55即白色)
:param image: 需要加噪的圖片
:param noise_num: 添加的噪音點(diǎn)數(shù)目,一般是上千級(jí)別的
: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)#隨機(jī)生成指定范圍的整數(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實(shí)現(xiàn)對(duì)圖像添加高斯噪聲或椒鹽噪聲的詳細(xì)內(nèi)容,更多關(guān)于Python的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Pygame實(shí)現(xiàn)小球躲避實(shí)例代碼
大家好,本篇文章主要講的是Pygame實(shí)現(xiàn)小球躲避實(shí)例代碼,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12
uwsgi啟動(dòng)django項(xiàng)目的實(shí)現(xiàn)步驟
本文主要介紹了uwsgi啟動(dòng)django項(xiàng)目的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
Python實(shí)現(xiàn)給文件添加內(nèi)容及得到文件信息的方法
這篇文章主要介紹了Python實(shí)現(xiàn)給文件添加內(nèi)容及得到文件信息的方法,可實(shí)現(xiàn)從文件開(kāi)頭添加內(nèi)容的功能,需要的朋友可以參考下2015-05-05
Python使用Keras庫(kù)中的LSTM模型生成新文本內(nèi)容教程
Python語(yǔ)言使用金庸小說(shuō)文本庫(kù),對(duì)文本進(jìn)行預(yù)處理,然后使用Keras庫(kù)中的LSTM模型創(chuàng)建和訓(xùn)練了模型,根據(jù)這個(gè)模型,我們可以生成新的文本,并探索小說(shuō)的不同應(yīng)用2024-01-01
python線程池 ThreadPoolExecutor 的用法示例
這篇文章主要介紹了python線程池 ThreadPoolExecutor 的用法示例,幫助大家更好得理解和使用python線程池,感興趣的朋友可以了解下2020-10-10
Python中l(wèi)ogging日志記錄到文件及自動(dòng)分割的操作代碼
這篇文章主要介紹了Python中l(wèi)ogging日志記錄到文件及自動(dòng)分割,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
基于python實(shí)現(xiàn)可視化生成二維碼工具
這篇文章主要介紹了基于python實(shí)現(xiàn)可視化生成二維碼工具,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
使用Python的開(kāi)發(fā)框架Brownie部署以太坊智能合約
在本文中,我們將使用Python部署智能合約。這篇文章可能是您走向智能合約和區(qū)塊鏈開(kāi)發(fā)的橋梁!2021-05-05

