高斯分布即正态分布;图片高斯加噪即把图片矩阵每个值和一个高斯分布的矩阵上的对应值相加
1、高斯分布 np.random.normal
一维:
import numpy as np
import matplotlib.pyplot as plt
def generate_gaussian_noise(mean, std_dev, size):
noise = np.random.normal(mean, std_dev, size) ## 设置均值mean和标准差std_dev
mean = 0.5
std = 0.1
return noise
# 生成高斯噪声
mean = 0
std_dev = 1
size = 10000
noise = generate_gaussian_noise(mean, std_dev, size)
# 打印部分噪声数据
print(noise[:10])
# 绘制噪声分布直方图
plt.hist(noise, bins=50, density=True)
plt.xlabel('Value')
plt.ylabel('Probability Density')
plt.title('Gaussian Noise Distribution')
plt.show()
二维矩阵(10*10的案例):
import numpy as np
import matplotlib.pyplot as plt
def generate_gaussian_noise(mean, std_dev, size):
noise = np.random.normal(mean, std_dev, size)
return noise
# 生成高斯噪声矩阵
mean = 0
std_dev = 1
size = (10, 10)
noise_matrix = generate_gaussian_noise(mean, std_dev, size)
# 绘制矩阵图像
plt.imshow(noise_matrix, cmap='gray')
plt.colorbar() # 添加颜色条
plt.title('Gaussian Noise Matrix')
plt.show()
2、矩阵相加 cv2.add(matrix1, matrix2)、matrix1+matrix2
每个值对应相加
import numpy as np
import cv2
# 创建两个矩阵
matrix1 = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]], dtype=np.uint8)
matrix2 = np.array([[10, 20, 30],
[40, 50, 60],
[70, 80, 90]], dtype=np.uint8)
# 使用 cv2.add 函数相加两个矩阵;也可以直接matrix1+matrix2,两种结果可能不一样,cv2.add加噪会更多
result = cv2.add(matrix1, matrix2)
# 打印相加结果
print(result)
3、图片高斯加噪
1)一维图片加噪:
import numpy as np
import cv2
def add_gaussian_noise(image, mean, std_dev):
# 生成与图像大小相同的高斯分布随机噪声
noise = np.random.normal(mean, std_dev, image.shape).astype(np.uint8)
print(type(noise),noise.shape,noise)
# 将噪声添加到原始图像
noisy_image = cv2.add(image, noise)
return noisy_image
# 读取原始图像
image = cv2.imread(r"C:\Users\loong\Downloads\ma.jpg", 0) # 灰度图像
print("image:",image.shape)
# 添加高斯噪声
noisy_image = add_gaussian_noise(image, mean=0, std_dev=30)
# 显示原始图像和添加噪声后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Noisy Image', noisy_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
如果是直接矩阵相加:
import numpy as np
import cv2
def add_gaussian_noise(image, mean, std_dev):
# 生成与图像大小相同的高斯分布随机噪声
noise = np.random.normal(mean, std_dev, image.shape).astype(np.uint8)
print(type(noise),noise.shape,noise)
# 将噪声添加到原始图像
noisy_image = image + noise
return noisy_image
# 读取原始图像
image = cv2.imread(r"C:\Users\loong\Downloads\ma.jpg", 0) # 灰度图像
print("image:",image.shape)
# 添加高斯噪声
noisy_image = add_gaussian_noise(image, mean=0, std_dev=30)
# 显示原始图像和添加噪声后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Noisy Image', noisy_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
2)三维图片加噪:
import numpy as np
from PIL import Image
def add_gaussian_noise(image, mean, std_dev):
noise = np.random.normal(mean, std_dev, image.shape).astype(np.uint8)
print(type(noise),noise.shape,noise)
noisy_image = image + noise
return noisy_image
# 读取 JPG 图片
image_path = r"C:\Users\loong\Downloads\ma.jpg"
image = Image.open(image_path)
# 将 PIL 图片转换为 NumPy 数组
image_array = np.array(image)
print("image:",image_array.shape)
# 设置高斯噪声参数
mean = 0
std_dev = 30
# 添加高斯噪声
noisy_image = add_gaussian_noise(image_array, mean, std_dev)
# 显示原图和带噪声图像
original_image = Image.fromarray(image_array)
noisy_image = Image.fromarray(noisy_image.astype(np.uint8))
original_image.show(title='Original Image')
noisy_image.show(title='Noisy Image')
或者
import cv2
import numpy as np
# 读取图像
image = cv2.imread(r"C:\Users\loong\Downloads\ma.jpg")
# 生成噪声图像
noise = np.random.normal(0, 25, image.shape).astype(np.uint8)
# 使用 cv2.add 函数添加噪声
noisy_image_cv2 = cv2.add(image, noise)
# 显示原图和添加噪声后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Noisy Image (cv2.add)', noisy_image_cv2)
cv2.waitKey(0)
cv2.destroyAllWindows()
3)模拟Diffusion正向扩散多次加噪效果
加噪10次
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像
image = cv2.imread(r"C:\Users\loong\Downloads\ma.jpg")
# 创建一个用于展示所有图片的画布
fig, axs = plt.subplots(2, 5, figsize=(15, 6))
# 在第一个位置显示原图像
axs[0, 0].imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
axs[0, 0].axis('off')
axs[0, 0].set_title('Original Image')
# 在每一步添加噪声并展示图像
for i in range(1, 10):
# 生成噪声图像
noise = np.random.normal(0, 1.5, image.shape).astype(np.uint8) # 降低噪声幅度
# 使用 cv2.add 函数添加噪声
noisy_image_cv2 = cv2.add(image, noise)
# 在画布上显示图像
axs[i//5, i%5].imshow(cv2.cvtColor(noisy_image_cv2, cv2.COLOR_BGR2RGB))
axs[i//5, i%5].axis('off')
axs[i//5, i%5].set_title(f'Noisy Image {i}')
# 更新原图像为添加噪声后的图像,用于下一步的噪声添加
image = noisy_image_cv2
# 显示最终的画布
plt.tight_layout()
plt.show()