一、為輸入圖像添加鹽噪聲(白色噪點(diǎn))
def salt_noise(src, percetage):
NoiseImg = copy(src)
NoiseNum = int(percetage * src.shape * src.shape)
for i in range(NoiseNum):
randX = random.random_integers(0, src.shape - 1)
randY = random.random_integers(0, src.shape - 1)
NoiseImg[randX, randY] = 255
return NoiseImg
這個(gè)函數(shù) salt_noise(src, percentage) 的作用是向輸入的圖像 src 中添加鹽噪聲。具體來說,它會(huì)在圖像中隨機(jī)選取一定比例的像素點(diǎn),并將這些像素點(diǎn)的數(shù)值設(shè)置為255(白色),從而模擬鹽噪聲的效果。
函數(shù)參數(shù)解釋:
src: 輸入的原始圖像,即待添加噪聲的圖像。
percentage: 添加鹽噪聲的比例,即在圖像中被修改為白色的像素點(diǎn)占總像素點(diǎn)數(shù)量的比例。
函數(shù)實(shí)現(xiàn)步驟:
復(fù)制輸入的原始圖像,以免修改原始圖像。
計(jì)算需要添加鹽噪聲的像素點(diǎn)數(shù)量 NoiseNum,該數(shù)量由輸入的百分比 percentage 與圖像總像素點(diǎn)數(shù)量相乘得到。
使用循環(huán)遍歷 NoiseNum 次,每次在圖像中隨機(jī)選擇一個(gè)像素點(diǎn),并將其像素值設(shè)為255(白色),從而添加鹽噪聲。
返回添加噪聲后的圖像 NoiseImg。
二、椒鹽噪聲
def pepper_salt_noise(src, percetage):
NoiseImg = copy(src)
NoiseNum = int(percetage * src.shape * src.shape)
for i in range(NoiseNum):
randX = random.random_integers(0, src.shape - 1)
randY = random.random_integers(0, src.shape - 1)
if random.random_integers(0, 1) <= 0.9:
NoiseImg[randX, randY] = 0
else:
NoiseImg[randX, randY] = 255
return NoiseImg
pepper_salt_noise(src, percentage) 的作用是向輸入的圖像 src 中添加椒鹽噪聲。椒鹽噪聲是一種同時(shí)包含鹽(白色)和胡椒(黑色)噪聲的圖像噪聲模型。
函數(shù)參數(shù)解釋:
src: 輸入的原始圖像,即待添加噪聲的圖像。
percentage: 添加椒鹽噪聲的比例,即在圖像中被修改為鹽或胡椒顏色的像素點(diǎn)占總像素點(diǎn)數(shù)量的比例。
函數(shù)實(shí)現(xiàn)步驟:
復(fù)制輸入的原始圖像,以免修改原始圖像。
計(jì)算需要添加椒鹽噪聲的像素點(diǎn)數(shù)量 NoiseNum,該數(shù)量由輸入的百分比 percentage 與圖像總像素點(diǎn)數(shù)量相乘得到。
使用循環(huán)遍歷 NoiseNum 次,每次在圖像中隨機(jī)選擇一個(gè)像素點(diǎn),并根據(jù)概率決定將其像素值設(shè)為0(黑色)或255(白色),從而模擬椒鹽噪聲。
返回添加噪聲后的圖像 NoiseImg。
三、高斯噪聲
def gasuss_noise(image, mean=0, var=0.001):
image = np.array(image / 255, dtype=float)
noise = np.random.normal(mean, var ** 0.5, image.shape)
out = image + noise
if out.min() < 0:
low_clip = -1.
else:
low_clip = 0.
out = np.clip(out, low_clip, 1.0)
out = np.uint8(out * 255)
return out
這段代碼定義了一個(gè)名為 gauss_noise(image, mean=0, var=0.001) 的函數(shù),用于向輸入的圖像添加高斯噪聲。高斯噪聲是一種常見的噪聲類型,符合高斯分布。
函數(shù)參數(shù)解釋:
image: 輸入的原始圖像。
mean: 高斯噪聲的均值,默認(rèn)為0。
var: 高斯噪聲的方差,默認(rèn)為0.001。
函數(shù)實(shí)現(xiàn)步驟:
將輸入的圖像轉(zhuǎn)換為浮點(diǎn)數(shù)數(shù)組,范圍從0到1。
使用 np.random.normal() 生成均值為 mean,方差為 var 的高斯噪聲數(shù)組,與原始圖像形狀相同。
將生成的高斯噪聲數(shù)組與原始圖像相加,得到帶有噪聲的圖像。
對(duì)輸出進(jìn)行裁剪,確保像素值范圍在 [0, 1] 之間。
將處理后的圖像乘以255并轉(zhuǎn)換為無符號(hào)8位整數(shù),以便正確顯示圖像。
import cv2
import random
import numpy as np
from numpy import *
from matplotlib import pyplot as plt
from copy import copy
def gasuss_noise(image, mean=0, var=0.001):
image = np.array(image / 255, dtype=float)
noise = np.random.normal(mean, var ** 0.5, image.shape)
out = image + noise
if out.min() < 0:
low_clip = -1.
else:
low_clip = 0.
out = np.clip(out, low_clip, 1.0)
out = np.uint8(out * 255)
return out
def salt_noise(src, percetage):
NoiseImg = copy(src)
NoiseNum = int(percetage * src.shape * src.shape)
for i in range(NoiseNum):
randX = random.random_integers(0, src.shape - 1)
randY = random.random_integers(0, src.shape - 1)
NoiseImg[randX, randY] = 255
return NoiseImg
def pepper_salt_noise(src, percetage):
NoiseImg = copy(src)
NoiseNum = int(percetage * src.shape * src.shape)
for i in range(NoiseNum):
randX = random.random_integers(0, src.shape - 1)
randY = random.random_integers(0, src.shape - 1)
if random.random_integers(0, 1) <= 0.9:
NoiseImg[randX, randY] = 0
else:
NoiseImg[randX, randY] = 255
return NoiseImg
#
img = cv2.imread('../data/0001.jpg', 0)
img1 = gasuss_noise(img, 0.1, 0.02)
img2 = salt_noise(img, 0.1)
img3 = pepper_salt_noise(img, 0.2)
plt.subplot(221)
plt.imshow(img, cmap='gray')
plt.title('img')
plt.axis('off')
plt.subplot(222)
plt.imshow(img1, cmap='gray')
plt.title('img_gasuss_noise')
plt.axis('off')
plt.subplot(223)
plt.imshow(img2, cmap='gray')
plt.title('salt_noise')
plt.axis('off')
plt.subplot(224)
plt.imshow(img3, cmap='gray')
plt.title('pepper_salt_noise')
plt.axis('off')
plt.show()