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

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

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

Diffusion扩散模型学习:图片高斯加噪_第1张图片
二维矩阵(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()

Diffusion扩散模型学习:图片高斯加噪_第2张图片

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)

Diffusion扩散模型学习:图片高斯加噪_第3张图片
Diffusion扩散模型学习:图片高斯加噪_第4张图片

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

Diffusion扩散模型学习:图片高斯加噪_第5张图片
如果是直接矩阵相加:

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

Diffusion扩散模型学习:图片高斯加噪_第6张图片

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

Diffusion扩散模型学习:图片高斯加噪_第7张图片
或者

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

Diffusion扩散模型学习:图片高斯加噪_第8张图片

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

4、加噪和去噪初级效果实验

每次加噪声、去噪的噪声是一样的固定,方便查看效果

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像
image = cv2.imread(r"C:\Users\loong\Downloads\ma.jpg")

image1 = image
# 创建一个用于展示所有图片的画布
fig, axs = plt.subplots(2, 5, figsize=(15, 6))

# 在第一个位置显示原图像
axs[0, 0].imshow(cv2.cvtColor(image1, cv2.COLOR_BGR2RGB))
axs[0, 0].axis('off')
axs[0, 0].set_title('Original Image')


# 生成噪声图像
noise = np.random.normal(0, 15, image.shape).astype(np.uint8)  # 降低噪声幅度

# 在每一步添加噪声并展示图像
for i in range(1, 5):
    
    
    # 使用 cv2.add 函数添加噪声
    noisy_image_cv2 = 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


# 在第五个位置显示原图像
axs[1, 0].imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
axs[1, 0].axis('off')
axs[1, 0].set_title('Noisy Image')

for i in range(6, 10):

    noisy_image_cv = image - noise
    # 在画布上显示图像
    axs[i//5, i%5].imshow(cv2.cvtColor(noisy_image_cv, cv2.COLOR_BGR2RGB))
    axs[i//5, i%5].axis('off')
    axs[i//5, i%5].set_title(f'Noisy Image {i}')
    image = noisy_image_cv

# 显示最终的画布
plt.tight_layout()
plt.show()





下面第一行:第一张是原图,后面四张是依次加噪后图片
下面第二行:第一张是第一行加噪的最后一张,后面四张是依次去噪后图片

你可能感兴趣的:(多模态,学习,python,开发语言)