1. 图像格式的底层逻辑:为什么需要这么多格式?
第一次接触图像格式时,我完全被RAW、RGB、YUV这些术语搞晕了。直到在摄像头项目上踩了坑才明白,不同格式其实是针对不同场景的"专用工具"。就像修车时不会用扳手拧螺丝,图像处理也要选对"工具"。
传感器采集的原始数据就像刚挖出来的矿石(RAW),ISP处理相当于矿石精炼(RGB),而最终显示和传输则要考虑效率(YUV)。每种转换都涉及三个关键指标:图像质量、处理速度和带宽占用。举个例子,做实时视频通话时,如果全程用RGB格式,你的手机五分钟就会烫到能煎鸡蛋——这就是为什么YUV420成为视频编码的标配。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. RAW格式:传感器的"原始日记"
2.1 Bayer阵列的绿色秘密
拆开过相机传感器的朋友会发现,每个像素点实际只能捕获一种颜色。这就像用单色铅笔作画,却要还原彩色世界。Bayer阵列的巧妙之处在于RGGB等排列方式,通过增加绿色采样点(人眼对绿色最敏感)来"欺骗"大脑。我做过对比实验:同样的8MP传感器,使用RGGB比RRBB排列的成像细节多保留约15%。
RAW数据保存的是最原始的电压值,相当于照片的"数字底片"。最近调试IMX586传感器时发现,其RAW10格式每个像素用10bit记录亮度,但实际存储时:
- Unpacked模式:占用16bit(浪费6bit)
- Packed模式:4个像素拼成5字节(40bit=4×10bit)
c复制// MIPI RAW10 Packed数据解析示例
void unpack_raw10(uint8_t *packed, uint16_t *unpacked, uint32_t len) {
for(int i=0; i<len/5; i++) {
unpacked[i*4] = ((packed[i*5] << 2) | (packed[i*5+4] & 0x3));
unpacked[i*4+1] = ((packed[i*5+1] << 2) | ((packed[i*5+4]>>2) & 0x3));
unpacked[i*4+2] = ((packed[i*5+2] << 2) | ((packed[i*5+4]>>4) & 0x3)
