bayer_rgb_yuv 一、整体流程Sensor 输出拜尔Bayer格式 ➔ ISP 将其转换为 RGB 格式 ➔ 最终再转换为 YUV 格式。在图像处理的专业术语中这被称为ISP Pipeline图像信号处理流水线。为了让您更清晰地掌握这个过程我们可以将这条“流水线”按照数据所处的色彩域划分为三个主要阶段1. RAW域处理清洗原始数据当光线进入相机Sensor 捕获光信号并经过 A/D 转换后输出的就是单通道的拜尔阵列RAW Data。此时数据还比较粗糙ISP 首先要对其进行“清洗”主要包括黑电平校正BLC去除传感器暗电流产生的噪声基底。镜头阴影校正LSC补偿镜头边缘的亮度衰减和颜色偏差。坏点校正DPC/BPC修复传感器上失效或异常的像素点。2. RGB域处理还原真实色彩这是整个流程中最关键的转换阶段核心任务是将马赛克般的拜尔数据变成人眼能看懂的全彩图像去马赛克Demosaic/CIP通过插值算法根据相邻像素的信息“猜出”每个像素缺失的颜色分量正式将拜尔数据转换为全彩色 RGB 图像。自动白平衡AWB校正不同光源下的色温确保白色物体不失真。色彩校正矩阵CCM调整传感器的色彩响应使其更符合人眼的视觉感知。伽马校正Gamma调整图像的明暗对比度曲线以适应屏幕显示和人眼的非线性感知特性。3. YUV域处理优化与压缩准备在得到高质量的 RGB 图像后ISP 会进行最后一步的色彩空间转换及画质增强色彩空间转换RGB to YUV将 RGB 数据分离为亮度Y和色度U/V。由于人眼对亮度比色度敏感得多这种格式可以在不损失主观画质的前提下大幅降低数据量。YUV域降噪与锐化在 YUV 域进一步抑制色度噪声并增强图像的边缘细节。色调映射与对比度加强提升画面的整体观感。二、三种核心的图像数据格式1. 拜尔格式Bayer Pattern拜尔格式是传感器输出的原始单通道数据其命名通常由“排列顺序”加“位深”组成。最常见的排列是 RGGB但在工业相机等领域也存在其他变体。按排列顺序分类常见的有 BayerRG8、BayerGB8、BayerGR8、BayerBG8 等。其中字母代表滤色片的排布方式如 RG 表示红-绿交替后面的数字 8、10、12 代表每个像素的位深度如 8位即 0-255 灰阶。按位深分类包括 BayerRG8、BayerRG10、BayerRG12 等。位深越高传感器能记录的亮度层级越丰富动态范围也越大。2. RGB 格式RGB 格式通过红R、绿G、蓝B三个通道的叠加来呈现颜色主要根据位宽和存储方式进行划分调色板类型Palettized如 RGB1、RGB4、RGB8。这些格式不直接存储真实的颜色值而是存储一个索引指向内存中的调色板例如 RGB8 用 8位表示 256种颜色。16位 RGB为了节省空间将颜色压缩至 16位。例如 RGB555红绿蓝各占 5位和 RGB565红绿蓝分别占 5、6、5位共 65536 种颜色。真彩色True ColorRGB24最标准的格式红绿蓝各占 8位总共可表现约 1670万种颜色。注意其在内存中的实际排列顺序通常为 BGR。RGB32 / ARGB32同样使用 24位表示颜色但额外保留了 8位的 Alpha 通道用于控制透明度或者保留不用。3. YUV (YCbCr) 格式YUV 格式将亮度Y和色度U/V 或 Cb/Cr分离并基于人眼对色度不敏感的特性进行了采样压缩。它通常按照两个维度进行分类按采样比例分类YUV 4:4:4完全采样每个像素都包含完整的亮度和色度信息画质最高常用于专业影视制作。YUV 4:2:2水平方向上色度减半常用于数字电视和 DVD 视频。YUV 4:2:0水平和垂直方向上的色度均减半即 4个像素共用一套色度是目前便携式视频设备、视频会议和网络流媒体中最常用的格式。按数据存储/排列方式分类Planar平面格式Y、U、V 三个分量分开存放。例如 I420IYUV和 YV12两者仅 U、V 平面的先后顺序相反。Semi-Planar半平面格式Y 分量单独存放U 和 V 分量交错存放。典型的代表是 NV12 和 NV21。Packed打包/交错格式Y、U、V 三个分量全部交错存放在一起。常见的有 YUY2YUYV、UYVY、YVYU 等。三、详解YUVJ:a:b 命名法为了描述垂直方向是否压缩而设定的一种数学规则我们把这个规则想象成在图像上画一个4列 × 2行的小网格也就是包含8个像素的参考块。这三个数字J : a : b的意思就是J (通常是4)在这个小网格里横向取 4 个亮度Y样本。a第一行奇数行里采集了多少个色度U/V样本。b第二行偶数行里采集了多少个色度U/V样本。我们用这个“网格规则”来重新拆解一下你就彻底明白了1. YUV 4:4:4 奇数行4个偶数行4个怎么理解第一行有 4 个颜色第二行也有 4 个颜色。实际画面因为横着4个像素就有4种颜色竖着两行也都有完整的颜色。这就意味着这 8 个像素里的每一个像素都有自己专属的颜色信息。没有任何偷懒全精度保留。2. YUV 4:2:2 奇数行2个偶数行2个怎么理解第一行只有 2 个颜色第二行也只有 2 个颜色。实际画面横着看4个像素只分配了2种颜色说明左右相邻的2个像素共用一种颜色。但是竖着看第二行依然有2个颜色说明上下两行的颜色是各自独立的。这就是所谓的“只在水平方向偷懒垂直方向不偷懒”。3. YUV 4:2:0 奇数行2个偶数行0个怎么理解第一行有 2 个颜色但第二行偶数行是0个颜色实际画面为什么偶数行是0因为系统觉得连第二行都懒得再采样颜色了。它直接把第一行采样的那 2 个颜色向下复制给了第二行的对应像素。结合起来看横向上2个像素共用一种颜色纵向上上下两行也共用同一种颜色。这就完美构成了一个2×2 的方块共4个像素大家伙儿共同分享同一套颜色信息。场景比喻给墙壁刷漆 现在假设你要给一面由很多小格子组成的墙涂色。每个格子都需要涂底色Y/亮度和彩色面漆UV/颜色。为了省时间、省油漆你有三种涂法1. YUV 4:4:4最精细的土豪画法怎么涂每一个小格子你都单独给它涂一次底色再单独涂一次彩色面漆。效果每个格子的颜色都精准无比毫无偏差。代价非常费时间、费油漆数据量极大。一般只有好莱坞拍电影或者做顶级海报时才这么干。2. YUV 4:2:2左右偷懒的聪明画法怎么涂底色还是每个格子都认真涂。但是涂彩色面漆时你把左右相邻的两个格子当成一个整体只调一桶颜料给这两个格子刷上相同的颜色。效果因为人眼对颜色不敏感所以就算左右两个格子颜色一模一样你也觉得挺自然的。代价彩色面漆省了一半数据量减少33%。电视台广播、高端摄像机常用这种。3. YUV 4:2:0四个一起糊弄的极致省钱画法怎么涂底色依然是每个格子单独涂。但涂彩色面漆时更狠了你把上下左右挨着的4个格子凑在一起只调一桶颜料把这4个格子全刷成一样的颜色。效果虽然这4个格子颜色完全一样但因为它们本来挨得近加上你的眼睛只看“底色亮度”所以你根本注意不到颜色被糊弄了。代价彩色面漆直接省了四分之三数据量减半这是目前B站视频、抖音、蓝光光盘最常用的格式因为它能在极小的文件体积下让你看着依然觉得画质很好。占据内存大小在 YUV 格式中每个像素的亮度Y分量通常固定占1个字节。而后面两个数字其实就是在告诉你U 和 V 的颜色分量被压缩成了多少。我们以最常见的 8位8bit量化为例来看看具体的对应关系1. YUV 4:4:4全采样无压缩数字含义每 4 个像素就对应 4 个 U 分量和 4 个 V 分量。也就是说每一个像素都有自己专属的 U 和 V。怎么算字节Y 1 字节U 1 字节V 1 字节实际占用1 1 1 3 字节 / 每个像素。(注这和标准的 RGB 图像大小是一模一样的)。2. YUV 4:2:2水平方向偷懒数字含义每 4 个像素只对应 2 个 U 分量和 2 个 V 分量。也就是说每相邻的 2 个像素共用一套 U/V 颜色信息。怎么算字节Y 1 字节U 0.5 字节因为两个像素共用一个 UV 0.5 字节因为两个像素共用一个 V实际占用1 0.5 0.5 2 字节 / 每个像素。3. YUV 4:2:0水平和垂直双重偷懒数字含义每 4 个像素只有 2 个 U 和 0 个 V其实不是这样理解。它的真实意思是不仅水平方向减半垂直方向也减半了。也就是在一个2×2 的方块里共 4 个像素大家共用一套 U/V 颜色信息。怎么算字节Y 1 字节U 0.25 字节4个像素共用1个 UV 0.25 字节4个像素共用1个 V实际占用1 0.25 0.25 1.5 字节 / 每个像素。 总结与速记口诀只要记住基准是Y1字节后面的数字就是按比例切分 U 和 V4:4:4➔ 完整的 111 3 字节4:2:2➔ 砍半的 10.50.5 2 字节4:2:0➔ 砍四分之三的 10.250.25 1.5 字节如果你有一张分辨率为宽(W) × 高(H)的图片直接用W × H × 上面的单像素字节数就能精准算出这张图在内存中到底占了多大空间啦四、relationship with csi_2BayerRAW、RGB 和 YUV 这三种格式都可以在 MIPI 接口上传输。不过在实际应用中它们通常使用不同的 MIPI 协议通道且应用场景有很大区别1. Bayer (RAW) 与 YUV 格式这两种格式主要用于摄像头到主控端SoC的数据传输使用的是MIPI CSI-2Camera Serial Interface 2协议。Bayer (RAW)这是图像传感器最原始的输出格式。在 MIPI CSI-2 中它通常被标记为 RAW8、RAW10、RAW12 等代表每个像素的位深。由于没有经过处理数据量大但保留了最多的细节非常适合传输给主控端的 ISP图像信号处理器进行后续的画质优化。YUV部分传感器内部集成了简单的 ISP可以直接输出 YUV422 或 YUV420 格式。因为 YUV 格式利用了人眼视觉特性去除了冗余的色彩信息数据量更小对传输带宽的要求更低常用于视频录制或实时预览场景。2. RGB 格式RGB 格式主要用于主控端到显示屏的视频数据传输使用的是MIPI DSIDisplay Serial Interface协议。常见的色彩深度包括 RGB56516-bit、RGB66618-bit和 RGB88824-bit。因为显示屏的液晶面板或 OLED 面板本身就是通过红、绿、蓝三原色发光来成像的所以 RGB 格式可以直接驱动屏幕显示彩色图像无需像 RAW 那样再进行复杂的转换。总结来说MIPI 并不是一种单一的数据线而是一个包含多种协议的大家族。CSI-2 协议主要负责搬运相机拍下来的“生肉”Bayer/RAW或“半成品”YUV而DSI 协议则负责把最终做好的“熟食”RGB喂给屏幕显示。3. 举例说明举例说明1080p30fps RBG888 YUV422 YUV420占MIPI带宽数据理论有效带宽 (bps) 水平像素数 × 垂直像素数 × 帧率(fps) × 每像素比特数(bpp)对于 1080p 分辨率即 1920 × 1080。我们根据您提供的三种格式逐一进行拆解和计算1. 1RGB888 格式色彩深度bppRGB888 表示红、绿、蓝三个通道各占 8位总共需要 8 × 3 24 bit/像素。计算过程1920 × 1080 × 30 fps × 24 bpp 1,492,992,000 bps。带宽结果约等于1.49 Gbps。特点由于每个像素都保留了完整的三原色信息它的带宽需求是这三种格式中最高的。1.2 YUV422 格式色彩深度bppYUV422 保留了完整的亮度Y并在水平方向上对色度U/V进行了减半采样。它通常占用 2个字节即16 bit/像素。计算过程1920 × 1080 × 30 fps × 16 bpp 995,328,000 bps。带宽结果约等于995 Mbps或 ~0.99 Gbps。特点相比 RGB888它的带宽需求减少了大约三分之一非常适合视频编码和传输。1.3 YUV420 格式色彩深度bppYUV420 不仅在水平方向上对色度减半在垂直方向上也进行了减半。也就是说4个像素共用一套颜色信息平均下来每个像素只需 1.5个字节即12 bit/像素。计算过程1920 × 1080 × 30 fps × 12 bpp 746,496,000 bps。带宽结果约等于746 Mbps。特点这是最节省带宽的格式是目前绝大多数网络流媒体和消费级视频的底层首选格式。 工程实践中的“隐藏开销”补充以上计算的仅仅是纯粹的有效图像数据带宽。在实际的 MIPI 硬件工程中真实的链路总带宽还需要加上额外的开销主要包含两部分Blanking消隐时间传感器在发送完一帧图像后行与行之间、帧与帧之间会有短暂的空白停顿期。Protocol Overhead协议开销MIPI CSI-2 协议在传输时需要在数据包中插入包头、校验码ECC/CRC、同步信号等控制信息。因此工程师在实际评估 MIPI Lane通道速率时通常会在上述理论值的基础上乘以一个1.2 到 1.25 的系数即预留 20%~25% 的余量以确保数据传输不丢帧、不卡顿。我算的是“比特率”单位是bps(bits per second)这是硬件工程师看 MIPI 物理层带宽时用的单位。图片里写的是“字节率”单位是MB/s(MegaBytes per second)这是软件工程师或系统架构师看内存占用、存储写入速度时用的单位。它们之间的换算关系非常简单1 Byte 8 bits。1. 4 RGB888 格式我的计算比特1,492,992,000 bps换算成字节1,492,992,000 ÷ 8 186,624,000 Bytes/s换算成 MB186,624,000 ÷ 1,000,000 ≈186.6 MB/s结论四舍五入就是图片里的187 MB/s。完全一致1.5 YUV422 格式我的计算比特995,328,000 bps换算成字节995,328,000 ÷ 8 124,416,000 Bytes/s换算成 MB124,416,000 ÷ 1,000,000 ≈124.4 MB/s结论四舍五入就是图片里的125 MB/s。完全一致1.6 YUV420 格式我的计算比特746,496,000 bps换算成字节746,496,000 ÷ 8 93,312,000 Bytes/s换算成 MB93,312,000 ÷ 1,000,000 ≈93.3 MB/s结论直接对应图片里的93 MB/s。完全一致 为什么会有这种区别在实际工程中这两个数据都很重要但用途不同看 MIPI 线材和芯片选型时用 bpsMIPI 接口的物理层PHY规格通常是用 Gbps 来定义的比如 MIPI D-PHY 支持 1.5Gbps/lane。你需要知道总共有多少 bit 要传过去才能决定需要几根数据线Lane。这时候必须用我刚才算的 1.49 Gbps。看内存和处理器负载时用 MB/s当数据传进 SoC 后要存入 DDR 内存或者写入 Flash 存储。内存和硬盘的读写速度通常用 MB/s 来衡量。这时候图片里的 187 MB/s 就更有参考价值了。关于单位的区别想象你要通过一根水管MIPI 接口运水图像数据。Mbps (bits)是水流的速度。硬件工程师关心这个因为 MIPI 的物理线路Lane能跑多快是固定的比如一条 Lane 跑 1Gbps如果算出来需要 1.5Gbps你就得用 2 条 Lane。MB/s (Bytes)是装了多少桶水。软件工程师关心这个因为内存DDR是按字节寻址的CPU 处理数据也是按字节算的。如果你要存一张图文件大小就是按 MB 算的。