图像处理基础(像素、RGB、YUV etc.)的那点小事

为了方便记录,以下名词等价: 

1、色彩空间==颜色空间==色域==表示颜色的模型或方法

2、采样方式==(图像)信息元素的记录方式==数据结构中信息的记录方式

一、像素到底是什么? 像素是用来描述图像信息元素的数据结构

  如果把一张图片看成是一堆信息元素的集合,那么为了描述一张图片,我们要先建模,用一个数据结构来表示信息元素。从而,建模后图像就成了一堆数据结构(结构体)的集合,现在给这种数据结构起个名字就叫像素;所以像素不是一个具体的物理量,它仅仅是一个抽象的数据结构。


二、在像素这种数据结构中可以记录颜色信息(因为图像就是由不同颜色组成的),如果用RGB颜色空间来表示颜色,那么一个像素又要分成 红、绿、蓝 3个子像素(或者叫3个分量)。如果用YUV这种颜色空间来表示颜色,又可以分成 Y(亮度--luminance)、UV(色度也叫色差,色度又被分成两个独立信号存储,U (Cb--蓝色,其值==Cb-Y)、 V(Cr --红色,其值==Cr --Y))。

1、在这里有必要解释下YUV了,如果说RGB是通过3原色的组合来表示颜色那么YUV是如何表示颜色的呢?答案是---通过亮度和色差来表示(亮度是黑--白信号,色度是色彩信号)

  科学发现,人们对亮度的敏感程度要强于对色度的敏感程度。所以基于这个原理,我们在存储像素的时候,就多存储亮度,少存储色度从而减少存储空间。

  YUV 有3中采样方式 YUV444,YUV422,YUV420

  如果用手画这3中采样方式,可以是Y用方括号表示,UV看成一个整体,画成在Y里面的一个圈。所以eg444,就画4个方框(Y)再在每个方框里面画一个圈

  (1) YUV444 记录4个亮度就要分别再记录4个U和4个V

  

图中,背景(黑白相间的那个)表示亮度,画画绿绿的那个表示色度

  这种存储方式,主要是为了保证画面的质量(防止在处理过程中画质降低)。

  

  现采集四个像素,他们的数据结构分别是: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
 存放的码流为: Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3

  (2)YUV422 ,两个亮度共享一个色度

  

  大多数人分辨不出444和422的区别。

  同样,采集4个像素,他们数据结构中的3个分量分别是:[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]

  根据相邻2个像素共享一个UV色度对的原则,存放的码流是:Y0 U0 Y1 V1 Y2 U2 Y3 V3

  对码流再映射(重新构造像素),得到的像素是:[Y0 U0 V1] [Y1 U0 V1] [Y2 U2 V3] [Y3 U2 V3]

  (3)YUV411 , 原谅找不到他的图片,但其实很简单,411 和 420 可以联想记忆,

   420 是2*2 个像素公用一个UV ,而411 是 水平方向上连续4个像素公用一个UV

  对于4个像素 [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]

  411 采用“夹三明治法”,两个亮度Y之间夹一个色度(U或V),U,V交替采集、先U后V,4个Y共用一个UV

  所以存放码流是: Y0 U0 Y1 Y2 V2 Y3

   再映射后:[Y0 U0 V2] [Y1 U0 V2] [Y2 U0 V2] [Y3 U0 V2]

  (4)YUV420

  注意,虽然Y、U、V的比是420,表面上看好像应该是4个Y,2个U和0个V,既V一个都不取,但事实上完全不是这个样子。

  它实际指得是对每行扫描线来说,只取一种色度分量(先U后V),且色度分量和亮度的比例是2:1,既遂平方向上2个Y共用一个U或V。相邻的扫描行存储不同的色度分量,也就是说,如果一行是4:2:0的话,下一行就是4:0:2,再下一行是4:2:0...以此类推

  

  扫描线:

  

  采集8个像素,

  [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
  [Y4 U4 V4] [Y5 U5 V5] [Y6 U6 V6] [Y7 U7 V7]
 存放码流: 
  Y0 U0 Y1 Y2 U2 Y3
  Y4 V4  Y5 Y6 V 6 Y7
 再映射:
[Y0 U0 V4] [Y1 U0 V4] [Y2 U2 V6] [Y3 U2 V6]
[Y5 U0 V4] [Y6 U0 V4] [Y7U2 V6] [Y8 U2 V6]

//-----------------------------------------------------------------

  好了,YUV的格式就差不多讲到这里,另外还有一点,将YUV数据显示出来(由软件或硬件处理)是需要将数据进一步处理的--既格式包装

  YUV的格式包装有两种方式:a、packed format  打包格式  b、planar format 平面格式

  a、packed format ,表示将Y和UV封装在一起打成一个包,具体实现就是存放在一个数组中。YUY2就是打包格式,它的YUV比是422

  b、planar format ,表示将Y、U、V 分别封装打包,形成3个plane(平面),具体实现就是分别存在3个数组中。YV12是平面格式,它的YUV比是420

  2、比较不同色彩空间(只有通过比较才会知道为什么要有这么多的色彩表示方式)

  (1)RGB,RGB色彩空间是面向硬件的,一般设备采集到的像素中的颜色信息就是通过分成R、G、B来保存的。RGB 图像占的存储空间大,所以它适合显示系统,不适合图像处理。

    另外,RGB颜色由于是对真实食物的直接采样,所以图像会受到光照、阴影等因素影响,同时RGB空间,色度(红绿蓝)要受亮度的影响,如果亮度改变,色度都会改变;

   还有,RGP图像的传输需要同时3个信道分别来传输R\G\B3个信号,这样才能在另一端呈像

  (2)YUV,在这种格式中,Y\U\V是分别编码和存储的,所以可以使用分时的方法在一个信道上传输,这也是YUV最重要的特性。;、

三、

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
非常感谢您的提问,这是一道非常有挑战性的问题。我将尽力回答您的问题,但由于篇幅限制,我无法在此提供完整的代码实现。 首先,我需要说明的是,RGB、YCbCr和YUV是三种不同的颜色空间,它们之间的转换涉及到一些复杂的算法。在这里,我将仅提供RGB到YCbCr和RGBYUV的转换方法,而不涉及从YCbCr或YUVRGB的转换。 RGB到YCbCr转换: 1. 对于每个像素,将RGB值转换为浮点数。 2. 将浮点数的值乘以转换矩阵,得到YCbCr值。转换矩阵如下: Y = 0.299R + 0.587G + 0.114B Cb = -0.1687R - 0.3313G + 0.5B + 128 Cr = 0.5R - 0.4187G - 0.0813B + 128 3. 将Y、Cb和Cr值限制在0到255之间,然后转换为整数。 RGBYUV转换: 1. 对于每个像素,将RGB值转换为浮点数。 2. 将浮点数的值乘以转换矩阵,得到YUV值。转换矩阵如下: Y = 0.299R + 0.587G + 0.114B U = -0.14713R - 0.28886G + 0.436B + 128 V = 0.615R - 0.51498G - 0.10001B + 128 3. 将Y、U和V值限制在0到255之间,然后转换为整数。 为了验证转换的正确性,您可以选择一些RGB图像,将它们转换为YCbCr或YUV格式,然后将它们与标准的转换结果进行比较。您也可以使用一些软件工具来完成此任务,例如Matlab或OpenCV。 最后,我想提醒您的是,实现这个转换算法需要一定的硬件资源和编程技能,因此您需要具备一定的Verilog编程经验才能完成这个任务。同时,您还需要使用一些仿真工具来验证您的代码实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值