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

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

1、高斯分布 np.random.normal

一维:

import numpy as np
import matplotlib.pyplot as pltdef generate_gaussian_noise(mean, std_dev, size):noise = np.random.normal(mean, std_dev, size) ## 设置均值mean和标准差std_dev
mean = 0.5
std = 0.1return 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 pltdef 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 cv2def 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 cv2def 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 + noisereturn 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 Imagedef 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 + noisereturn 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()

在这里插入图片描述

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

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/223713.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【CentOS 7.9 分区】挂载硬盘为LVM操作实例

LVM与标准分区有何区别,如何选择 目录 1 小系统使用LVM的益处:2 大系统使用LVM的益处:3 优点:CentOS 7.9 挂载硬盘为LVM操作实例查看硬盘情况格式化硬盘创建PV创建VG创建LV创建文件系统并挂载自动挂载添加:注意用空格间…

VSCode SSH 连接提示: spawn UNKNOWN

随笔记录 目录 1. 背景介绍 2. 确认问题 : ssh -V 3. 解决问题 3.1 确认本地 ssh.exe 路径 3.2 修改vscode Remote.ssh:Path 3.2.1 设置 Reomte.ssh:Path - 方法一 3.2.2 设置 Reomte.ssh:Path - 方法二 1. 背景介绍 windows 系统vscode ssh remote CentOS7&#xff…

【零基础入门Docker】什么是Dockerfile Syntax

✍面向读者:所有人 ✍所属专栏:零基础入门Docker专栏https://blog.csdn.net/arthas777/category_12455882.html 目录 编写Dockerfile和Format的语法 2. MAINTAINER 3. RUN 4. ADD 6. ENTRYPOINT 7. CMD 8. EXPOSE 9. VOLUME 11. USER 12. ARG …

.NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式

之前写过使用自定义返回类的方式来统一接口数据返回格式,.Net Core webapi RestFul 统一接口数据返回格式-CSDN博客 但是这存在一个问题,不是所有接口会按照定义的数据格式返回,除非每个接口都返回我们自定义的类,这种实现起来不…

Adobe InDesign各版本安装指南

下载链接 https://pan.baidu.com/s/1VWGKDUijTTETU9sVWFjCtg?pwd0531 #2024版本 1.鼠标右击【InCopy2024(64bit)】压缩包(win11及以上系统需先点击“显示更多选项”)【解压到 InCopy2024(64bit)】。 2.打开解压后的文件夹,鼠标右击【Setup…

DevOps系列文章 : 使用dpkg命令打deb包

创建一个打包的目录,类似rpmbuild,这里创建了目录deb_build mkdir deb_build目标 我有一个hello的二进制文件hello和源码hello.c, 准备安装到/opt/helloworld目录中 步骤 在deb_build目录创建一个文件夹用于存放我的安装文件 mkdir helloworld在he…

深入探讨多模态模型和计算机视觉

近年来,机器学习领域在从图像识别到自然语言处理的不同问题类型上取得了显着进展。然而,这些模型中的大多数都对来自单一模态的数据进行操作,例如图像、文本或语音。相比之下,现实世界的数据通常来自多种模态,例如图像…

【Linux】Linux常见指令解析上

目录 1. 前言2. ls指令3. pwd指令4. cd指令3.1 cd常见快捷指令 4. touch指令5. mkdir指令6. rmdir指令 && rm指令 (重要)6.1 rmdir指令6.2 rm指令 7. man指令 1. 前言 这篇文章我们将详细介绍一下Linux下常见的基本指令。 2. ls指令 语法: ls [选…

系列一、GitHub搜索技巧

一、GitHub搜索技巧 1.1、概述 作为程序员,GitHub大家应该都再熟悉不过了,很多时候当我们需要使用某一项技能而又无从下手时,通常会在百度(面向百度编程)或者在GitHub上通过关键字寻找相关案例,比如我想学…

Go自定义PriorityQueue优先队列使用Heap堆

题目 分析 每次找最大的,pop出来 然后折半,再丢进去 go写法 go如果想用heap,要实现less\len\swap\push\pop 但可以偷懒,用sort.IntSlice,已经实现了less\len\swap 但由于目前是大根堆,要重写一下less 因此&#xff…

PWM/PFM 自动切换升压型转换器系统(一)

通过对芯片整体设计要求的考虑,搭建全负载高效率升压型 DC-DC 转换器的整体系 统框架,对系统的工作过程和模块电路的功能进行简要阐述,对外围电路的选取进行准确计 算,分析系统的损耗来源,实现高效率的设计目标。 芯片…

机场信息集成系统系列介绍(8):基于视频分析的航班保障核心数据自动采集系统

目录 一、背景 二、相关功能规划 1、功能设计 2、其他设计要求 三、具体保障数据采集的覆盖点 四、相关性能指标要求 1、性能指标要求 2、算法指标要求 一、背景 基于视频分析的航班保障核心数据自动化采集系统,是ACDM系统建设的延伸,此类系统并…

Uniapp + Vue3 + Pinia + Vant3 框架搭建

现在越来越多项目都偏向于Vue3开发&#xff0c;想着uniapp搭配Vue3试试效果怎么样&#xff0c;接下来就是详细操作步骤。 初始化Uniapp Vue3项目 App.vue setup语法 <script setup>import {onLaunch,onShow,onHide} from dcloudio/uni-apponLaunch(() > {console.l…

LeetCode 热题100——单调栈

​ 个人主页&#xff1a;日刷百题 系列专栏&#xff1a;〖C语言小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 &#x1f30e;欢迎各位→点赞&#x1f44d;收藏⭐️留言&#x1f4dd; ​ ​ 写在前面&#xff1a; 递增单调栈&#xff1a;栈中元素从栈底到栈顶依次增大 递减单调栈…

【新版】软考 - 系统架构设计师(总结笔记)

个人总结学习笔记&#xff0c;仅供参考&#xff01;&#xff01;&#xff01;! →点击 笔者主页&#xff0c;欢迎关注哦&#xff08;互相学习&#xff0c;共同成长&#xff09; 笔记目录 &#x1f4e2;【系统架构设计系列】系统架构设计专业技能 计算机组成与结构操作系统信…

【Java探索之旅】我与Java的初相识(完):注释,标识符,关键字

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Java入门到精通 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. Java的注释方式二. 标识符三. 关键字四. 全篇总结 &#x1f4d1;前言 在Java编程…

vue2 之 实现pdf电子签章

一、前情提要 1. 需求 仿照e签宝&#xff0c;实现pdf电子签章 > 拿到pdf链接&#xff0c;移动章的位置&#xff0c;获取章的坐标 技术 : 使用fabric pdfjs-dist vuedraggable 2. 借鉴 一位大佬的代码仓亏 : 地址 一位大佬写的文章 &#xff1a;地址 3. 优化 在大佬的代码…

QT中网络编程之发送Http协议的Get和Post请求

文章目录 HTTP协议GET请求POST请求QT中对HTTP协议的处理1.QNetworkAccessManager2.QNetworkRequest3.QNetworkReply QT实现GET请求和POST请求Get请求步骤Post请求步骤 测试结果 使用QT的开发产品最终作为一个客户端来使用&#xff0c;很大的一个功能就是要和后端服务器进行交互…

【mongoose】 Model.create() no longer accepts a callback 报错解决

在最新版的 mongoose 操作 MongoDB 数据库的时候&#xff0c;当我们插入一条数据时候&#xff0c;会报错 &#xff1a;Model.create() no longer accepts a callback&#xff0c;看了很多文章都说是&#xff0c;版本太高&#xff0c;都妥协选择了降低回旧版本&#xff0c;但我就…

从0开始学会nvm管理工具(node卸载,nvm安装以及使用)

NVM管理工具 一、nvm介绍 在工作中&#xff0c;我们可能同时在进行2个或者多个不同的项目开发&#xff0c;每个项目的需求不同&#xff0c;进而不同项目必须依赖不同版本的NodeJS运行环境&#xff0c;这种情况下&#xff0c;对于维护多个版本的node将会是一件非常麻烦的事情&…