从光子到图像——相机如何捕获世界?

news2025/1/11 1:20:11

引言

你是否想过为何我们按一下相机快门就可以将眼前广袤多彩的世界显示于一个小小的相机屏幕上?本期推文中将带着大家重现从光子转换为电子、电子转换为图像中数字驱动值的整个流程。

图片
▲人们通过相机捕获眼前的场景

从光子到电子的转换

光线首先通过光学镜头进入相机并到达传感器,再通过传感器上的微透镜聚焦。为了得到彩色图像,相机需要获得不同波段的光线,因此传感器前需加上颜色滤波器阵列。

图片
▲传感器像素前部分示意图

透过特定波段的滤波器后的光子会进入一个叫做“像素”的小型势阱。最简单的像素结构采用一个PN结作为感光机制,以及一个与之相连的Reset晶体管(RS)作为开关。在曝光时间内,PN结内的硅吸收光线。当光子的能量足够大时,硅原子中的电子便从价带被激发到导带,从而产生电子-空穴对。随后,由于PN结内电场的影响,电子-空穴对会分成两个电荷载体,而电子会流向PN结的n+端。

在该过程中,光电转换效率通常用量子效率来表征,其数值等于捕获电子数除以入射光子数。对于同一个传感器,其量子效率可认为是固定不变的。

图片
▲传感器像素结构

在光子转换为电子的整个过程中,难免会引入一些噪声。首先在曝光期间,撞击光电二极管的光子数存在数量上的涨落,通常被认为是均值为总光子数的泊松分布,并被称作为光子散粒噪声。由于泊松分布的性质,该噪声均值等于方差,即入射的光子数越多,噪声方差越大。同时,在光电转换期间,有一些聚集在光电二极管上的电子是由于热效应产生,这些电子同样服从均值为总电子数的泊松分布,通常被称为暗电流噪声。

由于传感器制造时难以保证每个像素的物理特性完全一致,所以对于不同的像素,其量子效率与热效应的影响不同,对应的光子散粒噪声与暗电流噪声的方差也不同。通常,这种噪声的空间分布被称为非均匀性。

图片
▲传感器转换总电子数公式

从电子到数字驱动值的转换

从光子转换成电子后,会进入浮动扩散节点(floating diffusion)。在浮动扩散节点中,电子被转移到浮动扩散电容并转换为电压值。电容等于电荷除以电压,所以对于同样的电子数,浮动扩散电容越小,转换后的电压值就越大。通常,由于浮动扩散电容引发的电压变化也被称为转换增益。

图片
▲浮动扩散节点在传感器中的位置

浮动扩散电容将电荷数转换成了电压值,并通过源极跟随器(source follower,SF)输出电压信号。在入射光子数极少的情况下,由于噪声的存在,最终通过浮动扩散节点转换成的电压值可能是负数。为了防止电压为负的情况,制造商通常会加上一个偏置电压。

然后,电压信号将通过一个可编程增益放大器(PGA)进一步放大,即所谓的模拟增益。

这里我们来讨论一下改变最终图像的关键参数——ISO感光度。如前所述,电荷在变为最终的电压信号过程中经过了两次增益,一次是电荷转换成电压的转换增益,另一次是PGA带来的模拟增益。同时,目前许多制造商也给相机加上了通过直接放大数字信号改变图像像素值的数字增益。我们可以在相机中调节ISO感光度来切换转换增益或者调节模拟增益和数字增益,从而改变最终图像的亮度。

图片
▲不同ISO感光度设置下拍摄的图像

经PGA放大后的电压模拟信号最终会通过一个模数转换器(ADC)转换为数字信号,即为Raw图像的数字驱动值。然后,Raw图像将进一步通过ISP流程,从而最终输出在用户眼前的图像。

图片
▲电压信号转换为数字信号流程示意图

在电荷到电压的转换过程中,通常会引入复位噪声,即前端读出噪声。在PGA放大电压信号时,也会引入一些白噪声与闪烁噪声,即所谓的后端读出噪声。同时,在模拟信号转换为数字信号的过程中,还会不可避免地引入量化噪声。其中,读出噪声通常可以建模为均值为0的高斯噪声,而量化噪声可以认为是均匀分布的噪声。

图片
▲电子转换为数字驱动值公式

总结

在本期推文中,带大家走进了相机成像流程中的微观世界,了解了光子如何转换成电子、电子又如何转换为输出图像的数字驱动值。相机捕获到的信息,不只包含真实的场景信号,还有我们不希望看到的各式各样的噪声。无论是相机里的世界还是眼前的世界,都要去伪存真、忠实还原。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《机器学习》——贝叶斯算法

贝叶斯简介 贝叶斯公式,又称贝叶斯定理、贝叶斯法则,最初是用来描述两个事件的条件概率间的关系的公式,后来被人们发现具有很深刻的实际意义和应用价值。该公式的实际内涵是,支持某项属性的事件发生得愈多,则该属性成…

【非常详细】TCP/IP协议详解

一、TCP/IP简介 TCP/IP(传输控制协议/互联网协议)是一种用于连接网络设备的协议族,广泛应用于互联网和局域网中。它提供了在不同类型的网络上进行通信的标准和方法。 二、TCP/IP模型 TCP/IP在数据包设计上采用封装和分用的策略,…

Nginx代理同域名前后端分离项目的完整步骤

前后端分离项目,前后端共用一个域名。通过域名后的 url 前缀来区别前后端项目。 以 vue php 项目为例。直接上 server 模块的 nginx 配置。 server{ listen 80; #listen [::]:80 default_server ipv6onlyon; server_name demo.com;#二配置项目域名 index index.ht…

C++中的表达式

文章目录 算数操作符位操作符bitset对象或整型值的使用将位移操作符用作IO 赋值操作符赋值操作符的右结合性赋值操作具有低优先级 自增和自减操作符条件操作符sizeof操作符优先级new和delete表达式类型转换何时发生隐式转换显示转换旧式强制类型转换 C中的表达式由一个或多个操…

WebSocket 测试入门篇

Websocket 是一种用于 H5 浏览器的实时通讯协议,可以做到数据的实时推送,可适用于广泛的工作环境,例如客服系统、物联网数据传输系统, 基础介绍 我们平常接触最多的是 http 协议的接口,http 协议是请求与响应的模式&…

海外招聘丨 弗拉瑞克商学院—博士研究员:智能家居技术业务和能源管理中的数据分析和人工智能

雇主简介 Vlerick 是一所领先的国际商学院……与众不同。是的,我们提供完全认可的世界一流教育课程,将理论知识和实践见解完美结合。是的,我们是一家领先的学术机构,拥有创新和独立研究的悠久传统。是的,我们拥有国际…

NUTTX移植到STM32

STM32移植NUTTX 1. Ubuntu下搭建开发环境1.1 先决条件1.2 下载 NuttX1.3 使用Make 进行编译1.4 烧录运行 2.通过NUTTX点亮LED2.1 部署操作系统2.2 修改配置文件2.3 编译运行程序 开发板:DshanMCUF407 官方开发文档:安装 — NuttX latest 文档 参考文档&…

Redis 优化秒杀(异步秒杀)

目录 为什么需要异步秒杀 异步优化的核心逻辑是什么? 阻塞队列的特点是什么? Lua脚本在这里的作用是什么? 异步调用创建订单的具体逻辑是什么? 为什么要用代理对象proxy调用createVoucherOrder方法? 对于代码的详细…

Python 中的错误处理与调试技巧

💖 欢迎来到我的博客! 非常高兴能在这里与您相遇。在这里,您不仅能获得有趣的技术分享,还能感受到轻松愉快的氛围。无论您是编程新手,还是资深开发者,都能在这里找到属于您的知识宝藏,学习和成长…

关于腾讯4K算法搭建使用

准备国内服务器一台,轻量服务器请尽量开全端口安装linux,centos7.6-7.9系统,记住纯净系统,然后安装宝塔宝塔安装环境为nginx1.24,7.2(PHP版本没有要求),Mysql5.7(没有要求) 准备活动完毕!!! 上传…

工艺参数优化、工程设计优化!GRNN神经网络+NSGAII多目标优化算法(Matlab)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.GRNN神经网络NSGAII多目标优化算法,工艺参数优化、工程设计优化(Matlab完整源码和数据) 多目标优化是指在优化问题中同时考虑多个目标的优化过程。在多目标优化中,通…

【Rust自学】11.6. 控制测试运行:并行和串行(连续执行)测试

喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 11.6.1. 控制测试的运行方式 cargo test和cargo run一样,cargo test也会编译代…

nginx负载均衡-基于端口的负载均衡(一)

注意: (1) 做负载均衡技术至少需要三台服务器:一台独立的负载均衡器,两台web服务器做集群 一、nginx分别代理后端web1 和 web2的三台虚拟主机 1、web1(nginx-10.0.0.7)配置基于端口的虚拟主机 [rootOldboy extra]# …

DDcGAN_多分辨率图像融合的双鉴别条件生成对抗网络_y译文马佳义

摘要: 在本文中,我们提出了一种新的端到端模型,称为双鉴别条件生成对抗网络(DDcGAN),用于融合不同分辨率的红外和可见光图像。我们的方法建立了一个生成器和两个鉴别器之间的对抗博弈。生成器的目的是基于特…

【C++/控制台】2048小游戏

源代码&#xff1a; #include <iostream> #include <windows.h> #include <stdio.h> #include <math.h> #include <stdlib.h> #include <conio.h> #include <time.h>// #define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME)…

【Rust自学】11.5. 在测试中使用Result<T, E>

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 11.5.1. 测试函数返回值为Result枚举 到目前为止&#xff0c;测试运行失败的原因都是因为触…

最新版IDEA新建web项目--小白也能看懂

引言&#xff1a; 此方法适用于 IntelliJ IDEA 2024.1.4 最新版本。 我最初使用的是 Tomcat 8.0.23 版本&#xff0c;搭配 JDK 17。由于 Tomcat 8.0.23 使用了已经被弃用的 JVM 参数&#xff0c;故将 Tomcat 版本更换为 10.1.1。 如果你使用 JDK 17&#xff0c;建议使用 Tom…

ue5玩家角色添加武器。切换武器位置,手上武器放到背上。演示一下人体插槽和武器的连接。仅仅演示,实际项目不是这么用的

把第一人称资源包导进来 这就是我们枪的骨骼网格体 我们找到这个骨骼 右手添加插槽 取个名字 因为武器上也有动画&#xff0c;所有武器单独写个蓝图类 新建一个蓝图类 BP_Weapon 把枪的蓝图拖到人的静态网格体下&#xff0c;成为一个部分 选中BP_Weapon的父类套接字…

微信小程序防止重复点击事件

直接写在app.wpy里面&#xff0c;全局可以调用 // 防止重复点击事件preventActive(fn) {const self this;if (this.globalData.PageActive) {this.globalData.PageActive false;if (fn) fn();setTimeout(() > {self.globalData.PageActive true;}, 3000); //设置该时间内…

Docker入门之docker基本命令

Docker入门之docker基本命令 官方网站&#xff1a;https://www.docker.com/ 1. 拉取官方镜像并创建容器&#xff08;以redis为例&#xff09; 拉取官方镜像 docker pull redis# 如果不需要添加到自定义网络使用这个命令&#xff0c;如需要&#xff0c;直接看第二步 docker r…