【图像】图像格式(2) : 一张图理清所有的RAW RGB YUV图像格式

本文详细介绍了RAW、RGB和YUV三种图像格式在摄影和摄像头领域的关键概念,包括RAW的原始数据特性、ISP处理过程,RGB的三原色原理,以及YUV在色彩表现和压缩上的优势。重点讲解了YUV的不同采样方式、排列方式和命名规则,并提到了安霸平台的常见YUV类型NV12和NV16。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0. 引言

之前一直做着和camera有关的工作,所以常常会涉及到图像格式的问题。感觉接触的名字和种类很多,索性好好整理一下,分个类,也方便后面再整理。

1. 直接上结论

直接总结了一张图
在这里插入图片描述

2. 图像格式

2.1 RAW

RAW图像是sensor出来的最原始的数据。
是光线透过滤镜之后直接得到的数据,每个像素只有一种颜色的数据。通常情况下,每个像素的数据量是10bits或者12bits,当然也有sensor有其他的8,14,16等等。
RAW的基本介绍可以看这篇文章.
一般的摄像头都会支持RAW格式的输出,这样我们拿到RAW数据之后,是没有办法直接使用的,还要在host端做ISP,做色彩纠正,增强,HDR,插值成RGB,转成YUV,最后再使用。像amba平台就是直接读取RAW数据,送入idsp来做一系列的3A操作的。另外记录一下,Amba平台对RAW数据有packed和compressed两种设定选择。如果未设置packed,每个像素不管是10位,12位,14位,都会占据2个字节16位,如果选择了packed,则会按照真实的位数排列。如果设置了compressed,则会进行数据压缩,整体数据量平均每个像素达到27/32个字节。
有些项目,不追求很高的sensor的3A效果,就会直接使用sensor输出的YUV或者RGB,这就是使用了sensor内置的一些差值算法,直接得到图像,比较方便,并且省host的运算资源,但是不够自由,可以调节的东西不多。
对于RAW数据,会有不同的bayer类型,是GBRG,GRBG,RBBG,GBBR的一种,其实也就是透镜的类型。

但是不管在senosr做还是在host主机做,RAW想用起来,都是要做插值得到真正的RGB图像的。

2.2 RGB

RGB是大家很熟悉的一种类型。三原色的原理就不做太多介绍了。
在windows的绘图板中,我们就可以通过调试三原色不同的比例得到不同的颜色。
在这里插入图片描述
RGB常用的数据格式有 RGB888,RGB565,RGB555这么几种。

2.3 YUV

YUV 是一个比较不好理解的类型,而且种类很多.
也是这篇文章的重点。
什么是YUV?RGB很好用,但是他对黑白图像的支持不是很好,因此,人们又会把RGB转成YUV格式。YUV中的Y,表示明亮度(Luma),就是灰度图。U和V分别对应Cb和Cr,代表色度(Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。

2.3.1 采样方式

分类方式根据采样的不同,分为YUV444,YUV422,YUV420.

  • YUV444:每个像素点同时包含Y/U/V 3个参数
  • YUV422:每2个像素点共享一组U/V参数,同时每个像素拥有自己的Y参数
  • YUV420:每4个像素点共享一组u/v参数,同时每个像素拥有自己的Y参数

2.3.2 排列方式

确定了采样方式之后,数据的排列又分为3种:

  • planar(注意不是planer,也不是plannar):把Y数据,U数据和V数据单独放置3块位置,形成3个平面
  • semi-planar:把Y数据独立,UV数据放在一起,形成2个平面。
  • packed:YUV数据打包在一起,无论单独的Y数据U数据还是V数据,地址都不是连续的。

2.3.3 命名方式

YUV的命名规则也有好几种,因此同一个类型有可能会有好几种名字,

  • YUVxxxP, YUVxxxSP
    e.g. YUV422P,YUV420SP
    根据plannar,semi-planner 和 packed的类型来定义的,这种感觉最好记。
    plannar就是P,注意顺序都是Y前U中V后
    semi-plannar就是SP,注意顺序都是Y前UV后。
  • Ixxx
    e.g. I422,I420
    感觉是plannar的别称
    I422就是YUV422P
    I420就是YUV420P
  • NVxx,YVxx
    e.g NV12,NV21,NV16,YV12
    NV代表属于semi-plannar,12代表一个像素所占的实际bits。NV12是YUV420SP,每个像素占据1个Y(8Bit)+1/4 个UV(8 * 2 / 4 = 4bit) = 12bits

2.3.4 类型

YUV根据采样方式不同,排列方式不同,命名方式不同,有N多类型。
我基本都总结在文章开头的表格里了,感觉要细分的话还能再分,但是暂时不用这么细吧,实际也用不到,全部记住没什么意义,记住一些常用的即可。
毕竟开发平台定下来之后,几种常用的数据类型也就随之确定了。安霸这边主要就是用NV12和NV16.

参考链接

<think>嗯,用户想知道如何使用STM32连接OV7670或OV2640摄像头模块完成图像采集,然后通过MATLAB对数据进行滤波处理。我需要先理清两个模块的连接和配置步骤,再考虑图像采集和传输,最后是MATLAB的滤波处理部分。 首先,OV7670和OV2640都是常用的摄像头模块,但它们的接口和配置方式有所不同。OV7670通常使用SCCB接口(类似于I2C)进行配置,输出数据通过DCMI接口传输。而OV2640可能支持更高的分辨率,但配置可能更复杂。用户需要选择其中一种模块,或者分别说明两者的不同点。 接下来是STM32的连接部分。需要确定摄像头模块的引脚连接,比如电源、时钟、数据线、同步信号等。OV7670可能需要8位的数据总线,而OV2640可能支持更高的位宽。同时,STM32的DCMI接口和DMA设置是关键,确保能够高效地接收图像数据。 然后是图像采集的代码实现。STM32需要初始化摄像头模块的寄存器,配置DCMI和DMA,设置正确的中断处理函数来捕获帧。这里可能需要参考已有的驱动代码或库,比如HAL库中的DCMI例程。用户可能需要调整寄存器配置,比如图像分辨率、输出格式(RGB565或YUV)等。 数据传输到PC的方式,用户提到了MATLAB处理,所以需要将图像数据从STM32发送到计算机。常用的方法包括串口、USB CDC,或者通过WiFi模块。不过,OV7670的图像数据量较大,串口可能速度不够,会导致传输缓慢。因此可能需要使用更高速的接口,比如USB或网络模块,或者将数据存储在SD卡中再传输。 然后是MATLAB部分的滤波处理。用户需要将接收到的数据转换成图像矩阵,应用滤波算法,比如中滤波、高斯滤波,或者更高级的如引导滤波(参考引用中的梯度域引导滤波)。可能需要处理RGB各通道,或者转换为灰度图像后再处理。 在回答中需要引用相关的资料,比如引用[1]提到的梯度域引导滤波的MATLAB代码,可能适用于图像滤波部分。引用[3]中的TCS3472颜色传感器驱动可能对RGB数据处理有帮助,但需要调整。引用[4]提到的开发环境配置可能对用户搭建STM32开发环境有用。 用户可能没有考虑到的问题包括图像数据传输的实时性、STM32的内存限制(特别是高分辨率图像)、以及滤波算法的计算复杂度。需要提醒用户注意这些潜在的问题,并提供优化建议,比如降低分辨率、使用高效的传输方式或简化滤波算法。 最后,生成相关问题时要围绕硬件连接、驱动开发、图像处理等方面,帮助用户深入理解可能遇到的挑战和解决方案。</think>### STM32摄像头模块图像采集与MATLAB滤波处理指南 #### 一、硬件连接与配置 1. **摄像头模块选择** - OV7670:支持VGA分辨率($640 \times 480$),输出格式为RGB565/YUV,需SCCB接口配置[^3] - OV2640:支持$1600 \times 1200$分辨率,JPEG压缩输出,配置更复杂 2. **STM32硬件连接** ```c // OV7670典型引脚连接(以STM32F4为例) DCMI_VSYNC -> PA4 DCMI_HSYNC -> PA6 DCMI_PCLK -> PA6 DCMI_D0-D7 -> PE0-PE7 SCCB_SDA -> PB9 SCCB_SCL -> PB8 ``` - 需配置DCMI接口和DMA传输(推荐使用双缓冲) #### 二、STM32固件开发 1. **关键代码框架** ```c // DCMI初始化示例(HAL库) hdcmi.Instance = DCMI; hdcmi.Init.SynchroMode = DCMI_SYNCHRO_HARDWARE; hdcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_RISING; hdcmi.Init.VSPolarity = DCMI_VSPOLARITY_HIGH; hdcmi.Init.HSPolarity = DCMI_HSPOLARITY_HIGH; HAL_DCMI_Init(&hdcmi); // 摄像头寄存器配置(OV7670示例) SCCB_Write(0x12, 0x80); // 复位寄存器 HAL_Delay(100); SCCB_Write(0x11, 0xC0); // 时钟分频 SCCB_Write(0x3A, 0x04); // 输出格式(RGB565) ``` 2. **图像传输方案** - **方案1**:通过USB CDC虚拟串口传输(最高1MBps) - **方案2**:使用WiFi模块(ESP8266/ESP32)传输JPEG - **方案3**:SD卡存储后批量传输[^4] #### 三、MATLAB滤波处理 1. **数据接收与转换** ```matlab % 串口接收示例 s = serialport('COM3', 115200); rawData = read(s, 320*240*2, 'uint8'); % RGB565格式 img = reshape(typecast(rawData, 'uint16'), 320, 240); ``` 2. **滤波算法实现** ```matlab % 梯度域引导滤波(参考论文实现[^1]) guided_image = im2double(rgb2gray(img)); filtered_img = guidedfilter(guided_image, noisy_image, 8, 0.01); % 卡尔曼滤波(适用于时序图像[^2]) kalman_filter = vision.KalmanFilter('StateTransitionModel', 1, ... 'MeasurementModel', 1, 'ProcessNoise', 0.01, 'MeasurementNoise', 0.1); ``` #### 四、性能优化建议 1. 使用OV2640的JPEG模式可减少$80\%$数据量 2. 在STM32端实现预处理(如中滤波) ```c #define WINDOW_SIZE 3 void median_filter(uint8_t *src, uint8_t *dst, int width, int height) { // 滑动窗口实现 } ``` 3. 采用DMA双缓冲机制避免图像撕裂
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值