Diffusion扩散模型学习:图片高斯加噪

发布时间:2023年12月23日

高斯分布即正态分布;图片高斯加噪即把图片矩阵每个值和一个高斯分布的矩阵上的对应值相加

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()

在这里插入图片描述

文章来源:https://blog.csdn.net/weixin_42357472/article/details/135174158
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。