长生栈 长生栈
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Living Team

编程技术分享
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 计算机视觉

  • ESP32开发

  • Linux系统移植

  • 快速开始

  • 多媒体(Mutimedia)

  • 音频开发(Audio)

  • 编程小知识

  • 图像处理算法

    • 图像格式及查看方法
      • 一、图像处理流程概述
      • 二、Bayer Raw 格式
        • 2.1 Bayer 阵列
        • 2.2 像素深度(bpp)
        • 2.3 Plain Raw(Unpacked Raw)
        • 2.4 MIPI Raw(Packed Raw)
      • 三、Demosaic(去马赛克)
        • 3.1 基本原理
        • 3.2 常见算法
      • 四、YUV 色彩空间
        • 4.1 为什么需要 YUV
        • 4.2 YUV 采样格式
        • 4.3 YUV 存储格式
        • Planar(平面格式)
        • Semi-Planar(半平面格式)
        • 4.4 NV12 与 NV21
      • 五、JPEG 压缩
        • 5.1 压缩原理
        • 5.2 为什么可以"有损"
      • 六、常用图像查看工具
        • 6.1 命令行工具
        • 6.2 专业 YUV 查看工具
        • 6.3 Bayer Raw 查看
      • 七、总结
  • 技术
  • 图像处理算法
DC Wang
2026-07-19
目录

图像格式及查看方法

# 图像格式及查看方法

本文梳理了数码相机图像处理流程中涉及的关键中间格式,涵盖 Bayer Raw(Plain/MIPI)、Demosaic、YUV 色彩空间以及 RGB 等常见格式的特点与区别,帮助读者理解图像从 sensor 采集到最终显示的完整数据变换过程。

# 一、图像处理流程概述

在数码相机或手机拍照的整个 pipeline 中,图像数据会经历多次格式转换。大致流程如下:

image-20260719144540783

理解每一种中间格式的特点,对于图像调试(IQ tuning)、算法开发以及问题定位都至关重要。


# 二、Bayer Raw 格式

# 2.1 Bayer 阵列

Sensor(图像传感器)表面覆盖着一层 Bayer 滤色阵列,每个感光单元只能接收 一种颜色 的光(红/绿/蓝)。之所以绿色采样点比红蓝多一倍,是因为人眼对绿色波段最敏感。

常见的 Bayer 排列方式:

排列名称 第一行 第二行 说明
RGGB R G G B 最通用的排列
BGGR B G G R 常见于某些 Sony sensor
GRBG G R B G 较少见
GBRG G B R G 较少见

同一个 sensor 的 Bayer 排列方式是固定的,由 sensor 的硬件设计决定。

# 2.2 像素深度(bpp)

每个像素用多少 bit 来记录亮度信息,称为 像素深度(bits per pixel, bpp)。常见 bpp 有:8、10、12、14、16。bpp 越高,记录的亮度层次越丰富,动态范围越大,但同时数据量也更大。

# 2.3 Plain Raw(Unpacked Raw)

Plain Raw 是一种"未打包"的存储方式。以 bpp = 10 为例:

  • 每个像素占用 2 字节(16 bit)
  • 有效数据占低 10 bit,高 6 bit 填 0(或空置)
  • 优点:读取简单,按字节对齐
  • 缺点:浪费存储空间(约 37.5% 的空间被浪费)
Plain Raw (bpp=10) 单个像素存储示意:
┌─────────────────┬─────┐
│   10bit 有效数据  │空置  │
└─────────────────┴─────┘
     16 bit (2 byte)
1
2
3
4
5

# 2.4 MIPI Raw(Packed Raw)

MIPI Raw 是一种"打包"存储方式,将多个像素的 bit 紧密排列,不浪费空间。以 bpp = 10 为例:

  • 4 个像素共 $4 \times 10 = 40$ bit = 5 字节
  • 每个像素的低 8 bit 依次存入前 4 个字节
  • 每个像素的高 2 bit 拼起来存入第 5 个字节
MIPI Raw 打包方式(bpp=10, 4像素→5字节):

像素:   P0[9:0]    P1[9:0]    P2[9:0]    P3[9:0]

Byte0: P0[7:0]   ← P0 的低 8bit
Byte1: P1[7:0]   ← P1 的低 8bit
Byte2: P2[7:0]   ← P2 的低 8bit
Byte3: P3[7:0]   ← P3 的低 8bit
Byte4: [P3[9:8] | P2[9:8] | P1[9:8] | P0[9:8]]  ← 4个像素的高2bit拼成1字节
1
2
3
4
5
6
7
8
9

注意:第 5 个字节中 4 个像素高 2 bit 的排列顺序取决于具体平台(高通、MTK 等可能有差异),实际调试时需查阅对应 datasheet。


# 三、Demosaic(去马赛克)

Bayer Raw 中每个像素只有一种颜色分量,需要通过 插值算法 利用周围像素的数据,还原出每个位置完整的 R、G、B 三个分量,这个过程叫 Demosaic(去马赛克)。

# 3.1 基本原理

以 RGGB 排列为例,对于某个 R 像素位置:

  • 该位置缺少 G 和 B
  • 用周围邻居的 G 值做插值得到该位置的 G
  • 用周围邻居的 B 值做插值得到该位置的 B
  • 同理,G 位置需要补 R 和 B,B 位置需要补 R 和 G

# 3.2 常见算法

算法 全称 特点
双线性插值 Bilinear Interpolation 最简单,速度快,但边缘易出现伪色和锯齿
VNG Variable Number of Gradients 根据梯度方向自适应插值,效果优于双线性
AHD Adaptive Homogeneity-Directed 先做颜色空间转换再做方向判断,效果好
Malvar-He-Cutler — 高质量线性滤波器,许多 ISP 的默认算法
AI Demosaic — 近年用深度学习做去马赛克,效果最好但算力要求高

经过 Demosaic 后,图像格式变为 RGB888(每个像素 R、G、B 各 8 bit,共 24 bit/pixel)或 RGB565 等。


# 四、YUV 色彩空间

# 4.1 为什么需要 YUV

用 RGB 存储每个像素需要 24 bit,数据量很大。研究发现:

  • 人眼对亮度变化敏感
  • 人眼对颜色变化不敏感

因此将亮度和颜色分离:Y(亮度/Luma) 分量保留全分辨率,UV(色度/Chroma) 分量可以做下采样,大幅减少数据量而视觉质量损失很小。

# 4.2 YUV 采样格式

YUV 采样用 Y:U:V 三数字的比例表示,常见的有:

格式 采样方式 每像素 bit 数 说明
YUV444 不采样 24 bit 与 RGB888 同等数据量,无损色彩
YUV422 水平方向 2:1 采样 16 bit U、V 在水平方向减半
YUV420 水平和垂直各 2:1 采样 12 bit 最常用,数据量仅为 RGB 的一半

YUV420 采样示意(4 个像素共享一组 UV):

YUV420 采样:
  Y Y    ← 4个Y分量(全分辨率)
  Y Y
  U      ← 1个U(4个像素共享)
  V      ← 1个V(4个像素共享)
1
2
3
4
5

# 4.3 YUV 存储格式

根据 Y、U、V 数据在内存中的排列方式,分为两大类:

# Planar(平面格式)

三个分量分别存储在三个独立平面中:

YUV420P (I420):
[Y₀ Y₁ Y₂ Y₃ ... Yₙ] [U₀ U₁ ... Uₙ/₄] [V₀ V₁ ... Vₙ/₄]
    Y 平面               U 平面             V 平面
1
2
3

# Semi-Planar(半平面格式)

Y 单独一个平面,UV 交错存放在同一个平面:

YUV420SP (NV12):
[Y₀ Y₁ Y₂ Y₃ ... Yₙ] [U₀ V₀ U₁ V₁ ... Uₙ/₄ Vₙ/₄]
    Y 平面                UV 交错平面
1
2
3

# 4.4 NV12 与 NV21

这两种都是 YUV420SP(Semi-Planar),区别在于 UV 的交错顺序:

格式 UV 顺序 适用平台
NV12 U 在前,V 在后:UVUVUV... Android、Windows、OpenCV 默认
NV21 V 在前,U 在后:VUVUVU... Android Camera 预览常用
NV12:  Y₀Y₁Y₂Y₃...  U₀V₀U₁V₁U₂V₂...
NV21:  Y₀Y₁Y₂Y₃...  V₀U₀V₁U₁V₂U₂...
1
2

参考链接:YUV 格式详解 (opens new window)


# 五、JPEG 压缩

YUV 图像适合送给屏幕直接显示,但如果要保存为图片文件,还需要进一步压缩。最常用的压缩格式是 JPEG。

# 5.1 压缩原理

JPEG 的核心算法是 DCT(离散余弦变换,Discrete Cosine Transform),将图像信号从空间域转换到频域:

  1. 分块:将图像划分为 $8 \times 8$ 的宏块
  2. DCT 变换:对每个 $8 \times 8$ 块做离散余弦变换,得到频域系数
  3. 量化:对频域系数做量化(有损步骤),高频系数(代表细节纹理)通常会被量化到 0 或被大幅削减
  4. 熵编码:对量化后的系数做 zigzag 扫描 + 霍夫曼编码,完成压缩

# 5.2 为什么可以"有损"

自然图像的大部分能量集中在低频区域(大面积的平滑区域、渐变等),而高频分量(纹理、边缘细节)的能量较小。人眼对高频细节的损失不那么敏感,因此:

  • 舍弃或削减高频分量 → 数据量大减
  • 保留低频分量 → 图像整体观感变化不大

# 六、常用图像查看工具

熟悉了上述格式后,我们能够在拍照的任意阶段 dump 出图像数据,并用对应工具查看确认效果。

# 6.1 命令行工具

工具 用途 常用命令
ffplay YUV/RGB raw 数据预览 ffplay -f rawvideo -pixel_format nv12 -video_size 1920x1080 input.yuv
ffmpeg 格式转换 ffmpeg -s 1920x1080 -pix_fmt nv12 -i input.yuv output.jpg
ImageMagick (convert) 图片查看、转换 convert input.jpg -resize 50% output.jpg

# 6.2 专业 YUV 查看工具

工具 平台 特点
7yuv Windows/Linux 轻量级,支持多种 YUV 格式,可查看 hex 数据
YUView Windows/Linux/Mac 开源,功能强大,支持 YUV、RGB、HEVC 等
RawViewer Windows 支持 Bayer Raw 预览和 Demosaic

# 6.3 Bayer Raw 查看

对于 Bayer Raw 数据,可先用工具做简单的 Demosaic 预览:

# 使用 ffmpeg 将 Bayer Raw 转为 PNG 预览(RGGB 排列为例)
ffmpeg -f rawvideo -pix_fmt bayer_rggb8 -s 1920x1080 -i input.raw output.png
1
2

# 七、总结

整个图像处理流程中,各阶段格式的特点对比如下:

阶段 格式 数据量(相对) 典型用途
Sensor 输出 Bayer Raw 1× 原始数据存档、专业后期
Demosaic 后 RGB888 3× 图像处理中间步骤
色彩空间转换后 YUV420 1.5× 预览、视频编码输入
压缩后 JPEG 0.1~0.5× 照片存储、网络传输

理解各格式的存储方式和转换关系,是图像调试和算法优化的基础。在实际工作中,遇到图像偏色、条纹、清晰度等问题时,逐阶段 dump 图像对比分析是最有效的定位手段。

编辑 (opens new window)
Linux动态链接中的PLT和GOT

← Linux动态链接中的PLT和GOT

最近更新
01
Linux Audio开发-ALSA使用内存映射(MMAP)的录音实现(Ubuntu22)
08-17
02
Linux Audio开发-使用ALSA驱动进行录音和播放(Ubuntu22)
08-17
03
Linux Audio开发-ALSA API列表
08-17
更多文章>
Theme by Vdoing | Copyright © 2019-2026 DC Wang All right reserved | 辽公网安备21029602001058号 | 吉ICP备20001966号-2
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式