当前位置: 首页 > news >正文

RGB888 转 YCbCr444 / YCbCr422 格式转换 (MATLAB实现)

基于 BT.601 标准的色彩空间转换,包含完整的 MATLAB 代码、原理推导、实验结果及图片分析。

1. 背景介绍

1.1 什么是 RGB888?

RGB888 是最常见的数字图像存储格式,每个像素由R(红)、G(绿)、B(蓝)三个通道组成,每个通道占8 bit(0~255),合计每个像素24 bit

例如一张 1279×1706 的图片,原始数据量为:

1279 × 1706 × 3 = 6,545,922 字节 ≈ 6.24 MB

1.2 为什么需要 YCbCr?

人眼对亮度变化色彩变化更敏感。因此可以利用这一特性,保持亮度分辨率不变,而对色度信息进行降采样,从而大幅减少数据量,同时肉眼几乎看不出差异。

YCbCr是一种将亮度和色度分离的色彩空间:

分量

含义

说明

Y

亮度 (Luminance)

表示明暗信息,人眼最敏感

Cb

蓝色差 (Chrominance Blue)

蓝色分量与亮度的差值

Cr

红色差 (Chrominance Red)

红色分量与亮度的差值

1.3 YCbCr 采样格式

格式

Y 分辨率

Cb 分辨率

Cr 分辨率

每像素等效bit

说明

4:4:4

全分辨率

全分辨率

全分辨率

24 bit

无压缩,与RGB888相同

4:2:2

全分辨率

水平1/2

水平1/2

16 bit

色度水平方向压缩一半

4:2:0

全分辨率

水平1/2, 垂直1/2

水平1/2, 垂直1/2

12 bit

色度四分之一

本文实现4:4:44:2:2两种格式。

2. 转换原理

2.1 BT.601 标准(正变换)

ITU-R BT.601 标准定义了 RGB 到 YCbCr 的转换矩阵:

Y = 0.299 × R + 0.587 × G + 0.114 × B

Cb = -0.169 × R - 0.331 × G + 0.500 × B + 128

Cr = 0.500 × R - 0.419 × G - 0.081 × B + 128

2.2 BT.601 逆变换

从 YCbCr 还原为 RGB:

R = Y + 1.402 × (Cr - 128)

G = Y - 0.344 × (Cb - 128) - 0.714 × (Cr - 128)

B = Y + 1.772 × (Cb - 128)

2.3 422 水平下采样原理

YCbCr422 的色度分量在水平方向每 2 个像素取平均:

Cb_422(x) = (Cb(2x-1) + Cb(2x)) / 2

Cr_422(x) = (Cr(2x-1) + Cr(2x)) / 2

3. MATLAB 代码详解

3.1 读取图像与数据准备

img_path = '土楼.jpg';

rgb_img = imread(img_path);

[rows, cols, ~] = size(rgb_img);

R = double(rgb_img(:,:,1));

G = double(rgb_img(:,:,2));

B = double(rgb_img(:,:,3));

imread读取后为uint8类型(0~255),转为double是避免矩阵运算时的数据类型溢出。如果不转双精度,uint8 的减法会出现负数截断为 0 的问题。

3.2 RGB888 → YCbCr444 正变换

Y = 0.299*R + 0.587*G + 0.114*B;

Cb = -0.168736*R - 0.331264*G + 0.5*B + 128;

Cr = 0.5*R - 0.418688*G - 0.081312*B + 128;

MATLAB 的矩阵运算天然支持逐像素操作,三行代码即可完成整张图的色彩空间转换。

3.3 水平色度下采样(444 → 422)

Cb_422 = (Cb(:, 1:2:end) + Cb(:, 2:2:end)) / 2;

Cr_422 = (Cr(:, 1:2:end) + Cr(:, 2:2:end)) / 2;

Y_422 = Y; % 亮度保持全分辨率

Cb(:, 1:2:end)取所有奇数位置像素,Cb(:, 2:2:end)取所有偶数位置像素,两者取平均后列数减半。

为便于可视化,使用双线性插值将降采样的 Cb/Cr 上采样回原分辨率:

Cb_422_disp = imresize(Cb_422, [rows, cols], 'bilinear');

Cr_422_disp = imresize(Cr_422, [rows, cols], 'bilinear');

3.4 YCbCr → RGB 还原验证

R_444 = Y + 1.402*(Cr - 128);

G_444 = Y - 0.344*(Cb - 128) - 0.714*(Cr - 128);

B_444 = Y + 1.772*(Cb - 128);

RGB_444 = uint8(max(0, min(255, RGB_444)));

min/max确保还原后的像素值不超出 [0, 255] 范围。

3.5 PSNR 质量评估

PSNR(峰值信噪比)是衡量图像质量的客观指标:

PSNR = 10 × log₁₀(MAX² / MSE)

其中:MAX = 255(8bit图像最大值)

MSE = Σ(原图 - 重建图)² / 像素总数

mse_444 = mean((double(rgb_img(:)) - double(RGB_444(:))).^2);

psnr_444 = 10 * log10(255^2 / mse_444);

4. 实验结果

4.1 测试图像

属性

图像名称

土楼.jpg

分辨率

1279 × 1706

原始格式

RGB888 (24 bit/像素)

4.2 PSNR 对比

转换方式

PSNR

评价

YCbCr444 还原

Inf dB

数学上完全无损(浮点精度内)

YCbCr422 还原

52.84 dB

远高于 40dB 的优秀标准,肉眼无法分辨

PSNR > 40 dB 通常被认为是极高质量,> 50 dB 几乎与原始图像完全一致

4.3 数据量对比

格式

数据量(字节)

等效 bit/像素

压缩率

RGB888

6,545,922

24

基准

YCbCr444

6,545,922

24

0%(无压缩)

YCbCr422

4,363,948

16

节约 33.3%

4.4 主观评价

从视觉上看,YCbCr422 还原图与原始 RGB 图几乎无差异——尽管色度信息减少了一半,但人眼对色度的分辨率远低于亮度,因此 422 的压缩在视觉上完全可接受。

4.5 还原效果对比

下图从左到右依次为:原始RGB888图像、YCbCr444还原图、YCbCr422还原图。

原图 vs YCbCr444 vs YCbCr422 还原对比

4.6 YCbCr 各分量对比

下图展示了YCbCr各分量的对比。第一行为Y亮度和Cb/Cr全分辨率分量,第二行为444还原图以及Cb/Cr降采样后插值还原的分量。

Y分量(亮度) | Cb分量(蓝色差, 444) | Cr分量(红色差, 444)

Y分量(亮度) | Cb分量(蓝色差, 422) | Cr分量(红色差, 422)

5. 输出图片说明

程序共生成 7 张输出图片:

文件名

说明

Y分量(亮度)

Y通道:仅包含亮度信息的灰度图,显示了图像的明暗结构

Cb分量(蓝色差, 444)

Cb通道(全分辨率):偏向蓝/黄色的色差信息

Cr分量(红色差, 444)

Cr通道(全分辨率):偏向红/绿色的色差信息

Cb分量(蓝色差, 422)

Cb通道(422降采样后插值还原):相比444略微模糊

Cr分量(红色差, 422)

Cr通道(422降采样后插值还原):相比444略微模糊

YCbCr444还原图

444还原RGB:与原图一致(无损)

YCbCr422还原图

422还原RGB:视觉上与原图几乎无差异

6. 总结

1.YCbCr444 是无损转换——RGB 与 YCbCr 之间的矩阵变换在浮点精度内完全可逆

2.YCbCr422 以 33% 的数据量减少换取极微小的质量损失——PSNR 高达 52.84 dB,肉眼完全不可感知

3. 这正是 JPEG、MPEG、H.264/H.265 等图像/视频编码标准的核心思路:利用人眼视觉特性,在亮色分离后对色度进行降采样

http://www.jsqmd.com/news/774344/

相关文章:

  • 强化学习优化GAN图像生成:Adv-GRPO算法解析
  • 5分钟学会taskt:免费开源RPA工具让你轻松实现办公自动化革命
  • 解锁TIDAL无损音乐库:24-bit/192kHz音乐下载神器完全指南
  • AI模型部署新方案:用refresh-gpt-chat实现令牌自动管理与统一API接入
  • 2026年4月市场有实力的轻烧粉公司推荐,氢氧化镁/轻烧粉/轻质医药氧化镁/碳酸镁/氧化镁/氧化镁糊,轻烧粉实力厂家推荐 - 品牌推荐师
  • 基于Clean Architecture与CQRS的银行信贷系统后端架构实战
  • Python 爬虫进阶技巧:动态调整请求频率规避 IP 封禁
  • 《龙虾OpenClaw系列:从嵌入式裸机到芯片级系统深度实战60课》020、汇编语言基础——OpenClaw指令集的手写汇编实战
  • 龙虾跳转登录失败,提示ca证书不对
  • Arm Cortex-A75系统寄存器架构与编程实践
  • 创业团队如何利用统一API管理多个AI模型以控制成本
  • 非高斯随机系统轨迹优化:统计收缩与共形推断方法
  • VoXtream2:实时流式语音合成与动态语速控制技术解析
  • 第五篇 量子纠错轻量化改良:彻底摆脱实验室依赖的民用落地路径
  • Stackmoss:模块化工程化工具集,快速搭建现代开发技术栈
  • AI编程助手指令统一工具brief:告别手动同步,实现智能管理
  • AI辅助数据分析:用测试数据与覆盖率数据驱动质量改进
  • 从入门到精通:Gemini 3.1 Pro解决办公问题的完整指南
  • 基于Next.js与MongoDB的现代社交应用全栈开发实战解析
  • TME-Agent:为LLM智能体构建结构化记忆引擎,解决多步骤任务规划难题
  • 光耦基础知识和应用电路仿真(Multisim)
  • 深入GD32 DMA握手机制:为什么你的DAC正弦波数据传输出错?
  • #82_关于字节对齐
  • 数据倾斜问题 - 深度解析与代码实现
  • Node.js终端Canvas开发:构建交互式CLI界面的核心原理与实践
  • 2026必看!优质工业烘箱生产厂家合集 - 栗子测评
  • AgentWorld:构建文件系统原生、可恢复的强智能体工作流平台
  • Promptimizer:自动化提示词优化框架,提升大语言模型输出质量
  • 安装Roundcube
  • 2025届必备的五大降AI率神器推荐榜单