Efficient Burst Raw Denoising:稳定噪声方差和分频率降噪
Efficient Burst Raw Denoising with Stabilization and Multi-Frequency Denoising Network
- Burst Raw Denoising必要性
- Burst Raw Image Denoising流程
- Main Contributions
- 具体方法介绍
- 集成noise prior
- CMOS sensor 噪声建模
- 噪声变换(Variance stabilization)
- 消除ISO对噪声方差的影响
- 消除真实信号值 x ∗ x^* x∗对噪声方差的影响
- 逆变换
- Multi-frame alignment
- Multi-frame denoising
- 整体架构
- 选定参考帧进行单帧降噪
- sequential多帧降噪
- Multi-frequency降噪网络
- 分频率降噪
- 频率聚合模块
- 实验细节
- Loss Function
- 数据集
- 降噪结果
- 消融实验
Burst Raw Denoising必要性
- 移动设备的普及促使移动摄像的需求剧增;
- 由于成本和空间限制,移动设备的sensor孔径和靶面小,导致成像噪声大,特别是在暗光场景;
- 由于噪声的随机性,单帧降噪效果容易丢失图像信号,burst raw denoising可利用时间维度缓解信息丢失的问题;
Burst Raw Image Denoising流程
-
噪声先验处理(noise prior)
camera拍摄参数(shutter,analog gain,digital gain等)根据环境光线变化,导致噪声水平不一致,导致难以处理。一般会基于一些先验知识对输入做变换,使其具备相同noise level。 -
帧对齐(frame alignment)
主要消除运动、抖动引起的前后帧像素位置错位,有助于更好地整合时序信息,提升降噪效果;
-
多帧降噪(multi-frame denoising)
主流方式有两种:
a) 多帧同时输入:运动估计和降噪效果更好,处理速度较快,但算力要求大;
b) 序列处理:按顺序逐帧处理,当前帧denoising的时候以上一帧的信息作为参考,算力消耗比较小;
Main Contributions
这篇论文的工作在noise prior、frame alignment、multi-frame denoising三个层面进行了创新(主要是noise prior和multi-frame denoising,frame alignment是用的某种coarse-to-fine的传统算法):
- noise prior
建模CMOS传感器的噪声,并提出一种方差稳定算法,使网络输入噪声图像的方差保持不变,降低denoising难度,可以在一定程度上降低网络大小和训练难度。 - multi-frame denoising
提出了一个多帧denoising框架,按照frame顺序融合多帧的时间信息,并设计了一个多频去噪网络来有效地处理不同频率的噪声。
具体方法介绍
集成noise prior
深度网络难以同时处理具有多种方差水平的噪声,除非网络设计的很大,但这难以在移动设备上部署。针对这个问题主要有两种解决方法:
- 显式地把噪声水平的先验信息集成到网络输入中;
- 对不同噪声水平的输入进行变换使其具备一样的方差,让网络对输入的噪声水平无感。
本篇论文选择了后者。
CMOS sensor 噪声建模
CMOS sensor的噪声来源主要有两种:
- shot noise
shot noise产生于光子-电子阶段,由于光电效应,sensor收集的光子数呈现随机性,这种随机性服从泊松分布,均值为真实信号值。shot noise与信号值本身相关,属于乘性噪声。 - read noise
read noise产生于电子-电压阶段,是电路的物理误差决定的,可建模为高斯分布,均值为0。与信号值无关,属于加性噪声。
所以,CMOS sensor的噪声可建模为:
x x x~ σ s ∗ P ( x ∗ σ s ) + N ( 0 , σ r 2 ) \sigma_s*P(\frac{x^*}{\sigma_s})+N(0, \sigma_r^2) σs∗P(σsx∗)+N(0,σr2)
x x x是观测值, x ∗ x^* x∗是没有被噪声污染的真实信号值, σ s \sigma_s σs和 σ r \sigma_r σr是噪声参数,和sensor gain(ISO)相关。
所以噪声的方差为:
V a r ( x ) = σ s ∗ x ∗ + σ r 2 Var(x)=\sigma_s*x^*+\sigma_r^2 Var(x)=σs∗x∗+σr2
推导依据:泊松分布的方差等于期望。
因为 σ s \sigma_s σs和 σ r \sigma_r σr只和sensor gain(ISO)相关。所以,当sensor型号固定时,噪声的方差只和ISO与真实信号值 x ∗ x^* x∗有关。噪声方差会随着ISO增加或亮度增加而增大。
噪声变换(Variance stabilization)
通过上面对CMOS sensor的噪声建模,我们知道噪声的方差是由ISO和真实信号值 x ∗ x^* x∗引起的。这一步的目的是对输入的带噪图像进行pixel-wise的处理,变换到一个新的空间,使其始终具备一样的方差,不受ISO和真实信号值 x ∗ x^* x∗影响。
消除ISO对噪声方差的影响
首先消除ISO变化引起的方差变化。令 x ˋ = x σ s \grave{x} = \frac{x}{\sigma_s} xˋ=σsx, x ∗ ˋ = x ∗ σ s \grave{x^*} = \frac{x^*}{\sigma_s} x∗ˋ=σsx∗, σ 2 ˋ = σ r 2 σ s 2 \grave{\sigma^2} = \frac{\sigma_r^2}{\sigma_s^2} σ2ˋ=σs2σr2推导出:
x ˋ \grave{x} xˋ ~ P ( x ∗ ˋ ) + N ( 0 , σ 2 ˋ ) P(\grave{x^*})+N(0, \grave{\sigma^2}) P(x∗ˋ)+N(0,σ2ˋ)
那么, V a r ( x ˋ ) Var(\grave{x}) Var(xˋ)= x ∗ ˋ + σ 2 ˋ \grave{x^*}+\grave{\sigma^2} x∗ˋ+σ2ˋ
消除真实信号值 x ∗ x^* x∗对噪声方差的影响
接下来要消除真实信号值 x ∗ x^* x∗引起的方差变化。
这里应用了Freeman-Tukey变换:
y = x ˋ + σ 2 ˋ + x ˋ + 1 + σ 2 ˋ y=\sqrt{\grave{x}+\grave{\sigma^2}}+\sqrt{\grave{x}+1+\grave{\sigma^2}} y=xˋ+σ2ˋ+xˋ+1+σ2ˋ
经过Freeman-Tukey变换,把原先的Possion-Gaussian分布变换成了高斯分布,且方差为1。
逆变换
噪声输入到denoising网络前经过 x ˋ = x σ s \grave{x} = \frac{x}{\sigma_s} xˋ=σsx和 y = x ˋ + σ 2 ˋ + x ˋ + 1 + σ 2 ˋ y=\sqrt{\grave{x}+\grave{\sigma^2}}+\sqrt{\grave{x}+1+\grave{\sigma^2}} y=xˋ+σ2ˋ+xˋ+1+σ2ˋ两步变换,变成和信号值 x ∗ x^* x∗无关且只有高斯噪声的信号,消除了ISO和 x ∗ x^* x∗引起的方差变化。denoising网络输出后需要进行逆变换,得到最终的denoise结果。
结合前面的变化公式,可推导出逆变换为:
I n v ( y ) = ( y 4 − 2 y 2 + 1 4 y 2 ) ∗ σ s Inv(y)=(\frac{y^{4}-2y^{2} +1}{4y^{2}})*\sigma_s Inv(y)=(4y2y4−2y2+1)∗σs
Multi-frame alignment
这部分不是重点,就简要介绍下。
考虑到计算性能因素,作者没有选择基于深度学习的多帧对齐方法,而是使用了传统的对齐方法:block matched和homography flow。
整体采用金字塔的形式,前两层使用block match进行全局的对齐,后两层使用homography flow进行局部的精细对齐。
Multi-frame denoising
整体架构
多帧去噪阶段需要从burst中聚合时间信息以产生一个帧干净的图像。然而,因为多帧之间的关系可能对建模具有挑战性,同时处理多帧不得不采用大网络。为了避免使用大网络,作者通过一系列高效的子网络按照顺序处理逐帧处理。所有子网络的结构相同,但参数不同的,整体架构如图所示。

整个降噪过程分为两阶段:
选定参考帧进行单帧降噪
第一步对参考帧执行单帧预去噪,主要有两点好处:
1)单独处理参考帧会强调参考帧相对于其他替代帧的优先级并生成中间结果。在论文实验中也可以观察到,对参考帧做预降噪得到中间结果 I 0 I_0 I0,比直接使用带噪的参考帧表现更好。
2)第一阶段只在参考帧上执行单帧去噪,不需要考虑帧之间的时间关系。因此,为了提高效率,可以采用轻量级网络,降低计算消耗。
sequential多帧降噪
为了降低计算成本,在该阶段按顺序处理剩余的N-1帧。参考帧的单帧去噪产生的中间结果 I 0 I_0 I0经由N−1个独立子网络 S 1 S_1 S1、 S 2 S_2 S2,…, S N − 1 S_{N-1} SN−1依次细化。
具体的数据流向,子网络 S i S_i Si将前一个子网络的中间结果 I i − 1 I_{i-1} Ii−1和第 i i i帧作为输入,生成细化的中间结果 I i I_i Ii。最后,子网络 S N − 1 S_{N−1} SN−1的中间结果 I N − 1 I_{N−1} IN−1作为最终的去噪输出。
这种方式在降低计算成本的同时,也考虑到了相邻帧之间的时间信息,而且逐帧细化的方式也会输出更好的降噪结果。
Multi-frequency降噪网络
去噪神经网络通常擅长去除高频噪声,但在处理低频噪声方面表现的不是特别好。因此,子网络将整个图像的去噪拆分为多个频率域的去噪,每个子网络由多频去噪和多频聚合模块组成,结构如图所示:

分频率降噪
首先,对输入做两次down-sample,每次分辨率缩小为原来的 1 4 \frac{1}{4} 41,得到三种分辨率的input map:{ m 0 , m 1 , m 2 m^0, m^1, m^2 m0,m1,m2}。
同一种pattern的噪声,在不同分辨率的input map中所表现的频率也不一样。当前分辨率的低频噪声在下一级input map中就表现为高频了(因为每down-sample一次,就会remove一些高频分量)。
在input map的 s c a l e = i scale=i scale=i,即输入为 m i m^i mi时,负责该scale的降噪子网络记为 F i F^i Fi, F i F^i Fi由 E i E^i Ei和 D i D^i Di组成,该scale的输出为 O i O^i Oi, F i F^i Fi学习的是残差。
O i = D i ( E i ( m i ) ) + m i O^i=D^i(E^i(m^i))+m^i Oi=Di(Ei(mi))+mi
从上图可以看出,除最上层之外, D i D^i Di的输入不仅有 E i ( m i ) E^i(m^i) Ei(mi),还有上一层的输出 O i + 1 O^{i+1} Oi+1,具体地有:
O 2 = D 2 ( E 2 ( m 2 ) ) + m 2 O^2=D^2(E^2(m^2))+m^2 O2=D2(E2(m2))+m2
O 1 = D 1 ( c o n c a t ( E 1 ( m 1 ) , O 2 ) ) + m 1 O^1=D^1(concat(E^1(m^1),O^2))+m^1 O1=D1(concat(E1(m1),O2))+m1
O 0 = D 0 ( c o n c a t ( E 0 ( m 0 ) , O 1 ) ) + m 0 O^0=D^0(concat(E^0(m^0),O^1))+m^0 O0=D0(concat(E0(m0),O1))+m0
相当于先在 m 2 m^2 m2层级,去除图像中的低频噪声,得到 O 2 O^2 O2;
然后在 m 1 m^1 m1层级,基于去除低频噪声的 O 2 O^2 O2,继续去除中频噪声,得到 O 1 O^1 O1;
最后,在 m 0 m^0 m0层级,基于去除中频噪声的 O 1 O^1 O1,继续去除高频噪声,得到 O 0 O^0 O0。
频率聚合模块
经过多频降噪网络,得到去除掉高、中、低频噪声的干净频率分量{ O 0 , O 1 , O 2 O^0,O^1,O^2 O0,O1,O2},需要把各分量组合起来得到完整的降噪结果。
n 1 = ↓ ( O 0 ) − O 1 n^1=\downarrow ({O^0})-O^1 n1=↓(O0)−O1
n 2 = ↓ ( O 1 ) − O 2 n^2=\downarrow ({O^1})-O^2 n2=↓(O1)−O2
I = O 0 − ↑ ( n 1 ) − ↑ ( ↑ ( n 2 ) ) I=O^0-\uparrow(n^1)-\uparrow(\uparrow(n^2)) I=O0−↑(n1)−↑(↑(n2))
n 1 n^1 n1相当于 O 0 O^0 O0里残留的中频噪声, n 2 n^2 n2相当于 O 1 O^1 O1里残留的低频噪声,在 O 0 O^0 O0里把 n 1 n^1 n1和 n 2 n^2 n2减掉,就得到了干净的图像。
实验细节
Loss Function
训练使用的损失函数主要是L1,包括RAW域的L1 loss和RGB域的L1 loss,除此之外,还有一项梯度约束项。
L r = L 1 ( y ∗ , y ^ ) + w 1 ∗ L 1 ( ▽ y ∗ , ▽ y ^ ) + w 2 ∗ L 1 ( I S P ( I n v ( y ∗ ) , I S P ( I n v ( y ^ ) ) ) ) L_r=L_1(y^*,\hat{y})+w1*L_1(\bigtriangledown y^*,\bigtriangledown {\hat{y}})+w2*L_1(ISP(Inv(y^*),ISP(Inv(\hat{y})))) Lr=L1(y∗,y^)+w1∗L1(▽y∗,▽y^)+w2∗L1(ISP(Inv(y∗),ISP(Inv(y^))))
数据集
CRVD和KPN synthetic dataset。这两个数据集包含了复杂多样的RAW数据,涉及到不同sensor,不同ISO,不同场景等,可以反映模型的降噪效果以及泛化性。
降噪结果


消融实验

相关文章:
Efficient Burst Raw Denoising:稳定噪声方差和分频率降噪
Efficient Burst Raw Denoising with Stabilization and Multi-Frequency Denoising Network Burst Raw Denoising必要性Burst Raw Image Denoising流程Main Contributions具体方法介绍集成noise priorCMOS sensor 噪声建模噪声变换(Variance stabilization…...
Ansible的使用2
#### 一、Ansible变量 ##### facts变量 > facts组件是Ansible用于采集被控节点机器的设备信息,比如IP地址、操作系统、以太网设备、mac 地址、时间/日期相关数据,硬件信息等 - setup模块 - 用于获取所有facts信息 shell ## 常用参数 filter…...
Springboot JPA ShardingSphere 根据年分表java详细代码Demo
一、项目结构 src/main/java ├── com.example │ ├── config │ │ └── TableInitializer.java # 动态建表配置 │ ├── entity │ │ └── Order.java # JPA实体类 │ ├── repository │ │ └── OrderRepository.j…...
mapbox进阶,使用本地dem数据,加载hillshade山体阴影图层
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️hillshade 山体阴影图层 api1.3.1 ☘️…...
【C++】Stack Queue 仿函数
📝前言: 这篇文章我们来讲讲STL中的stack和queue。因为前面我们已经有了string、vector和list的学习基础,所以这篇文章主要关注一些stack和queue的细节问题,以及了解一下deque(缝合怪)和priority_queue &am…...
代码随想录_单调栈
代码随想录_单调栈 739.每日温度 739. 每日温度 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,…...
C++类与对象进阶知识深度解析
目录 一、再谈构造函数 (一)构造函数体赋值 (二)初始化列表 (三)成员变量初始化顺序 (四)explicit关键字 二、static成员 (一)概念 (二&am…...
BoostSearch搜索引擎项目 —— 测试用例设计 + web自动化测试代码
web自动化代码: https://gitee.com/chicken-c/boost-search/tree/master/AutoTest...
【Ansible自动化运维】一、初步了解,开启自动化运维之旅
在当今数字化时代,随着企业 IT 基础设施规模的不断扩大,传统的手工运维方式逐渐显得力不从心。自动化运维技术应运而生,其中 Ansible 凭借其简洁易用、功能强大的特点,成为众多运维工程师和开发人员的首选工具。本篇文章将从基础概…...
AI日报 - 2025年4月9日
🌟 今日概览(60秒速览) ▎🤖 AGI突破 | DeepSeek AI推出自我原则批判调优(SPCT)新方法 通过GRMs自我创建和批判原则,性能媲美671B参数大模型 ▎💼 商业动向 | NVIDIA发布Llama-Nemotron-Ultra 253B模型 开放权重和训练数据&#x…...
2025年二级建造师考前冲刺题库
二建考前冲刺练习通常会涵盖考试的重点和高频考点,考生在做题过程中可以加深对这些知识点的理解和记忆,提高对重点知识的掌握程度。 建设工程法规及相关知识 1、单选题:关于建设工程中代理的说法,正确的是( …...
蓝桥·20264-祝福语--找连续字串的长度
#include <iostream> using namespace std; int main() {// 请在此输入您的代码//最小字典序,一定是全a,找s的最长字串a,结果就是该字串长度加1(t不能是s的子串)//所以这道题就变成了,找s中字串a出现的长度strin…...
条件概率、概率乘法公式、全概率公式和贝叶斯 (Bayes) 公式
定义 设 P ( A ) > 0 P(A) > 0 P(A)>0,若在随机事件 A A A发生的条件下随机事件 B B B发生的概率记作 P ( B ∣ A ) P(B|A) P(B∣A),定义 P ( B ∣ A ) P ( A B ) P ( A ) P(B|A) \frac{P(AB)}{P(A)} P(B∣A)P(A)P(AB) 则称 P ( B ∣ A ) …...
pdf转latex
Doc2X(https://doc2x.noedgeai.com/) Doc2X 是一个由 NoEdgeAI 提供的在线工具,主要用于将 PDF 文件(尤其是学术论文、报告等文档)转换为 LaTeX 格式。LaTeX 是一种高质量排版系统,广泛应用于学术界和出版…...
【Unity】Unity Transform缩放控制教程:实现3D模型缩放交互,支持按钮/鼠标/手势操作
【Unity 】Transform缩放控制教程:实现3D模型缩放交互,支持按钮/鼠标/手势操作 在Unity开发中,Transform组件承担着场景中物体的空间信息控制,包括位置、旋转和缩放。而缩放(Scale)操作,作为三…...
【Linux篇】缓冲区的工作原理:如何影响你程序的输入输出速度
从内存到磁盘:缓冲区如何提升文件I/O效率 一. 缓冲区1.1 什么是缓冲区1.2 为什么要引入缓冲区1.3 缓冲区类型1.4 FILE1.4.1 基本概念1.4.2 FILE 结构体的作用1.4.3 FILE 的工作机制 二. 最后 在程序开发中,缓冲区是一个经常被提及却不容易深入理解的概念…...
kotlin,Android,jetpack compose,日期时间设置
AI生成,调试出来学习,这些小组件会用了,就可以组合一个大点的程序了。 package com.example.mydatetimeimport android.app.AlertDialog import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.co…...
ASP.NET图书馆借阅系统(源码+lw+部署文档+讲解),源码可白嫖!
摘要 近些年来,随着科技的飞速发展,互联网的普及逐渐延伸到各行各业中,给人们生活带来了十分的便利,图书馆借阅系统利用计算机网络实现信息化管理,使图书信息、图书借阅、归还的管理发展和服务水平有显著提升。 本文拟…...
LeetCode算法题(Go语言实现)_35
题目 给你一棵根为 root 的二叉树,请你返回二叉树中好节点的数目。 「好节点」X 定义为:从根到该节点 X 所经过的节点中,没有任何节点的值大于 X 的值。 一、代码实现 func goodNodes(root *TreeNode) int {if root nil {return 0}return d…...
vi/vim常用快捷键
那么今天我们继续昨天没有介绍完的vi编辑器,来看看常用的一些快捷键,方便我们对文件的编辑. 1.拷贝当前行yy,拷贝当前行向下的5行5yy,并粘贴(输入p) 2.删除当前行dd,删除当前行向下的5行5d 3.在文件中查找某个单词[命令模式/关键字,回车查找,输入n就是查找下一个] ⭐️&…...
JVM核心机制:类加载×字节码引擎×垃圾回收机制
🚀前言 “为什么你的Spring应用启动慢?为什么GC总是突然卡顿?答案藏在JVM的核心机制里! 本文将用全流程图解字节码案例,带你穿透三大核心机制: 类加载:双亲委派如何防止恶意代码入侵ÿ…...
opencv无法设置禁用RGB转换问题
树莓派连接摄像头,摄像头输出格式为YUYV(YUV422)。 通过执行 v4l2-ctl --list-formats --device/dev/video0 可以看的具体的摄像头的数据格式。 使用opencv获取视频流,通过cap.set(cv2.CAP_PROP_CONVERT_RGB, 0)设置禁用自动转换RGB格式,但是打印输出…...
k8s 1.30.6版本部署(使用canal插件)
#系统环境准备 参考 https://blog.csdn.net/dingzy1/article/details/147062698?spm1001.2014.3001.5501 #配置下载源 curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/Release.key |gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyri…...
GZ036区块链卷一 EtherStore合约漏洞详解
题目 pragma solidity >0.8.3;contract EtherStore {mapping(address > uint) public balances;function deposit() public payable {balances[msg.sender] msg.value;emit Balance(balances[msg.sender]);}function withdraw() public {uint bal balances[msg.sender…...
MCP+Blender创建电力塔
MCP(Model Context Protocol)与Blender的结合是当前AI与3D建模领域的热门技术,它通过协议化的方式让Claude等AI模型直接控制Blender,实现自动化3D建模。 1. 功能与原理 • 核心能力:用户通过自然语言指令(…...
什么是RACI矩阵,应用在什么场景?
一、什么是RACI RACI矩阵是一种用于明确项目或任务中角色与责任的管理工具,通过定义不同人员在任务中的参与程度来避免职责不清的问题。以下是其核心要点: RACI的含义 ● R(Responsible)执行者:直接完成任务…...
Selenium自动化:玩转浏览器,搞定动态页面爬取
嘿,各位爬虫爱好者和自动化达人们!是不是经常遇到这种情况:信心满满地写好爬虫,requests一把梭,结果抓下来的HTML里,想要的数据空空如也?定睛一看,原来数据是靠JavaScript动态加载出…...
QAI AppBuilder 快速上手(8): 图像修复应用实例2
LaMa-Dilated模型旨在通过扩张卷积技术实现高效的图像擦除和修复。该模型采用先进的卷积神经网络架构,能够处理复杂的图像输入,并填补图像中的缺失部分,使修复后的图像更加自然和逼真。LaMa-Dilated不仅在图像编辑领域表现出色,还…...
`ConstantPositionProperty` 的使用与应用
ConstantPositionProperty 的使用与应用 1. 什么是 ConstantPositionProperty? ConstantPositionProperty 是 Cesium 中用于表示实体位置的属性类。它表示一个实体在三维空间中的位置是固定的,不会随时间变化。与动态位置属性(如 SampledPo…...
【计网】作业4
一. 单选题(共22题,64分) 1. (单选题)主机甲采用停止-等待协议向主机乙发送数据,数据传输速率是4kb/s,单向传播时延为30ms,忽略确认帧的发送时延。当信道利用率等于80%时,数据帧的长度为&#…...
