色度抽样

在数位图像处理领域中，色彩采样是指在表示图像时使用较亮度信息低的分辨率来表示色彩（色度）信息。当对模拟分量视频或者YUV讯号进行数字抽样时，一般会用到色度抽样。

## 原理

由于储存及传送的限制，我们通常需要减少（或压缩）信息以减低负荷。由于人眼对色度的敏感度不及对亮度的敏感度，图像的色度分量不需要有和亮度分量相同的清晰度，所以许多视讯系统在色差通道上进行较低（相对亮度通道）清晰度（例如，抽样频率）的抽样。这样在不明显降低画面质量的同时降低了影像讯号的总带宽。因抽样而丢失的色度值用内插值，或者前一色度值来替代。在压缩影像中，以4:2:2 Y'CbCr作例，它只需R'G'B'（4:4:4）三分之二的带宽。带宽的减少在肉眼上几乎没有影像上差别。

## 色彩采样的用法

由于人类的视觉系统对颜色的位置及移动不及对亮度敏感，带宽上可以以储存较多的亮度细节、较少的色度细节作优化。在一般影像观看距离时，色度细节在较低的取样率下仍不引起可察觉的损失。于视频系统中，可以以不同颜色分部的取样而达成以上结果。视频讯号可分别为一个亮度分量（Y'）及两个不同颜色分量（色度）。

色彩采样是颜色科学的分支，在颜色科学亮度及色度分量是以一个伽玛校正（三重刺激）的R'G'B'分量的加权总和形成，代替线性（三重刺激）的R'G'B'分量。因此，明度及颜色细节并非完全互相独立。在亮度及色度分量之间会存在着一些明度及颜色资讯的“溢出”（"Bleeding"）现象（如下图所示）。此误差尤其于高饱和的颜色情况下出现，其现象在彩条测试图（经色彩采样）中洋红色及绿色之间会轻微显著。在工程学的概算下（即是将“伽玛校正”及“组成加权总和”两个步骤逆向进行），使色彩采样方式更容易实行。

<image>

原图，未经色彩采样，200%放大。

<image>

经色彩采样的图像（以Sony Vegas DV编码器压缩，套用Box滤镜）

## 抽样系统及比例

视频系统的抽样系统中通常用一个三分比值表示：J:a:b（例如4:2:2），形容一个以J个像素宽及两个像素高的概念上区域，有时候会以四分比值表示（例如4:2:2:4）。依序列出为：

- J：水平抽样参照（概念上区域的宽度）。通常为4。
- a：在J个像素第一行中的色度抽样数目（Cr, Cb）。
- b：在J个像素第二行中的额外色度抽样数目（Cr, Cb）。
- Alpha：水平因数（与首数值有关连）。若没有此部分者可忽略，或存在时与J相同。

以下连结中的一幅教学图片解释了不同抽样系统的运作：http://lea.hamradio.si/~s51kq/subsample.gif （资料来源：" Basics of Video"）以及 由Douglas Kerr所著的"Chrominance Subsampling in Digital Images"。

4:1:1｜ ｜4:2:0｜ ｜4:2:2｜ ｜4:4:4｜ ｜4:4:0

Y'CrCb

Y'

+｜+｜+｜+｜+

(Cr, Cb)｜1｜nowrap

¼水平分辨率，全垂直分辨率｜½水平分辨率，½垂直分辨率｜½水平分辨率，全垂直分辨率｜全水平分辨率，全垂直分辨率｜全水平分辨率，½垂直分辨率

以上例图仅给出理论上的示例。以及注意图中并没有表明任何色度过滤（防止叠影的措施）。

在计算与4:4:4抽样（或4:4:4:4）有关的带宽系数时，把各系数加总再除以12（当有Alpha时除以16）。

在比较图像质量时，这三个值之间的比值才是重要的，所以4:4:4可以简化为1:1:1；但是习惯上亮度样本的数量值总为4，其他两个值依此类推。

有时抽样率为四分比值，如4:2:2:4。这时第四个值是调制通道的抽样频率比值。事实上，因为在调制应用中非常需要高质量图像，所以这个值在任何情况下都为4。

## 各种抽样系统介绍

### 4:4:4 Y'CbCr

每三个Y'CbCr分量都有相同抽样率。此系统有时候用作高阶底片扫描仪及电影后期制作中。通常会以两条SDI通道连线来承载4:4:4带宽讯号：通道A会盛载4:2:2的讯号，通道B则会承载0:2:2的讯号，合并成4:4:4讯号。

### 4:4:4 R'G'B'（没有抽样）

需要注意的是，有时候"4:4:4"也表示在RGB色度空间中，全部没有作任何色度抽样。如HDCAM SR等格式可以以双通道HD-SDI记录4:4:4 R'G'B'讯号。

### 4:2:2

每个色差通道的抽样率是亮度通道的一半，即水平色差清晰度分半。这样从无压缩视频中可减少了三分之一的带宽，当中的视觉差别仅仅少量甚至不存在。

大多数高端数码视频格式采用这一比率，如：

- AVC-Intra 100
- Digital Betacam
- DVCPRO50及DVCPRO HD
- Digital-S
- CCIR 601 / 串列数位界面 / D1
- ProRes（HQ, 422, LT, and Proxy）
- XDCAM HD422
- Canon MXF HD422

### 4:2:1

虽然此系统己在技术上定义存在，但只有非常少的软、硬件编解码器使用。Cb水平清晰度为Cr的两倍，以及亮度清晰度的四分之一。这样为证明了人的肉眼对于蓝色和黄色的空间上敏感度，比红色和绿色的弱。NTSC系统相似以上算法，将蓝色和黄色的清晰度减弱，令其清晰度比亮度为低。

### 4:1:1

4:1:1色彩取样中，水平色度清晰度为四分之一，为全带宽的一半。起初DV格式的4:1:1色彩取样不被考虑用作广播级用途，被低端及家用产品应用。当代的DV格式（一些包括4:1:1色度抽样）都被用作如电子新闻采访等专业级用途。DV格式偶尔被用作数位电影摄影。

NTSC系统中，若亮度以13.5 MHz取样，表示Cr及Cb的讯号都以3.375 MHz取样，符合最高1.6875 MHz的奈奎斯特带宽。而传统“高端广播级NTSC模拟讯号编码器”，在I/Q波段中只有分别1.5 MHz及0.5 MHz的奈奎斯特带宽。不过在大部分器材中，尤其是廉价电视机及VHS/Betamax录影机中，色度波段只有0.5 MHz的带宽给Cr及Cb分量使用。所以尽管和全带宽数字信号比较，仅有四分之一的色度带宽，其实DV系统提供了比高阶NTSC色差模拟规格更优质的色彩带宽。

使用4:1:1色彩取样的格式包括：

- DVCPRO
- NTSC DV及DVCAM
- D-7

### 4:2:0

4:2:0又称I420。I420是YUV格式的一种，属于planar format。4:2:0并不意味着只有Y,Cb而没有Cr分量。它指的是对每行扫描线来说，只有一种色度分量以2:1的抽样率存储。相邻的扫描行存储不同的色度分量，也就是说，如果一行是4:2:0的话，下一行就是4:0:2，再下一行是4:2:0...以此类推。对每个色度分量来说，水平方向和竖直方向的抽样率都是2:1，所以可以说色度的抽样率是4:1。PAL制式和SECAM制式的色彩系统特别适合于用这种方式来存储。绝大多数视频编解码器都采用这种格式作为标准的输入格式。对非压缩的8比特量化的视频来说，每个由2x2个2行2列相邻的像素组成的宏像素需要占用6字节内存。

映射：

码流

```
Y<sub>o0</sub> U<sub>o0</sub> Y<sub>o1</sub> Y<sub>o2</sub> U<sub>o2</sub> Y<sub>o3</sub><br>
Y<sub>e0</sub> V<sub>e0</sub> Y<sub>e1</sub> Y<sub>e2</sub> V<sub>e2</sub> Y<sub>e3</sub>
```

将被映射为下面的两行各四个像素：

```
[Y<sub>o0</sub> U<sub>o0</sub> V<sub>e0</sub>] [Y<sub>o1</sub> U<sub>o0</sub> V<sub>e0</sub>] [Y<sub>o2</sub> U<sub>o2</sub> V<sub>e2</sub>] [Y<sub>o3</sub> U<sub>o2</sub> V<sub>e2</sub>]<br>
[Y<sub>e0</sub> U<sub>o0</sub> V<sub>e0</sub>] [Y<sub>e1</sub> U<sub>o0</sub> V<sub>e0</sub>] [Y<sub>e2</sub> U<sub>o2</sub> V<sub>e2</sub>] [Y<sub>e3</sub> U<sub>o2</sub> V<sub>e2</sub>]
```

使用这种方法的质量很接近于4:1:1,通常应用于下面的格式：

- 所有版本的MPEG，包括如DVD等MPEG-2成品（虽然有些MPEG-4 profile容许如4:4:4的更高质素采样）
- PAL DV及DVCAM
- HDV
- AVCHD
- 最常见的JPEG/JFIF、H.261，及MJPEG成品
- VC-1

### 4:1:0

这种格式虽然是存在的（也确实有些编解码器支持这种格式），但是并没有得到广泛的应用，因为它在色度方面的清晰度比传统的VHS录像带还要差。这种方法对水平方向进行4:1的色度抽样，对竖直方向进行2:1的色度抽样。比起4:4:4，它的色度数据量仅仅是1/8大小。对非压缩的8比特量化的视频来说，每个由4x2个2行4列相邻的像素组成的宏像素需要占用10字节内存。

映射：

码流

```
Y<sub>o0</sub> U<sub>o0</sub> Y<sub>o1</sub> Y<sub>o2</sub> Y<sub>o3</sub><br>
Y<sub>e0</sub> V<sub>e0</sub> Y<sub>e1</sub> Y<sub>e2</sub> Y<sub>e3</sub>
```

将被映射为下面的两行各四个像素：

```
[Y<sub>o0</sub> U<sub>o0</sub> V<sub>e0</sub>] [Y<sub>o1</sub> U<sub>o0</sub> V<sub>e0</sub>] [Y<sub>o2</sub> U<sub>o0</sub> V<sub>e0</sub>] [Y<sub>o3</sub> U<sub>o0</sub> V<sub>e0</sub>]<br>
[Y<sub>e0</sub> U<sub>o0</sub> V<sub>e0</sub>] [Y<sub>e1</sub> U<sub>o0</sub> V<sub>e0</sub>] [Y<sub>e2</sub> U<sub>o0</sub> V<sub>e0</sub>] [Y<sub>e3</sub> U<sub>o0</sub> V<sub>e0</sub>]
```

## 色彩抽样实例

### 4:2:0抽样及还原实例

- 注意4:2:0色彩抽样为失真压缩(lossy compression)，无可避免地会损失一些资料，导致重建时有些许失真。
- 对RGB图像做抽样(压缩)
- 基本思路(pseudo code)
- 输入(input)一张RGB图片。
- 将其转成Y-Cb-Cr之格式。
- Y = 0.299*R + 0.587*G + 0.114*B
- Cb = -0.169*R + -0.331*G + 0.500*B
- Cr = 0.500*R + -0.419*G + -0.081*B
- 对Cb和Cr做抽样动作，(2+0)/(4+4)=0.25，即只留下四分之一的资料量。可以考虑只留下偶数行列或奇数行列之资料。
- Y分量则保持不变，如此便完成抽样。
- 将抽样之资料还原
- 基本思路(pseudo code)
- 输入经过4:2:0抽样之YCbCr资料。
- 使用插值法(interpolation)来重建Cb和Cr的资料。
- 将YCbCr资料重新转换回RGB。
- R = 1.000*Y + (-219/236311)*Cb+ (331234/236311)*Cr
- G = 1.000*Y + (-81219/236311)*Cb+ (-168766/236311)*Cr
- B = 1.000*Y + (418781/236311)*Cb+ (234/236311)*Cr
- 如此便完成4:2:0之重建，可输出(output)图像确认。
- 程式实例(matlab)

```matlab
%此程式範例基於matlab語言編寫
%目的是將原圖像(pictureA)做4:2:0之色彩取樣
%再將取樣過後的資料做重建並輸出(pictureB)
clear all
picA=double(imread('pictureA.jpg')); %input pictureA, 轉成double格式
[ROW,COL,DIM] = size(picA); %提取SIZE

yA = picA(:,:,1) * 0.299 + picA(:,:,2) * 0.587 + picA(:,:,3) * 0.114; % pictureA RGB to YCbCr
cbA = picA(:,:,1) *-0.169 + picA(:,:,2) *-0.331 + picA(:,:,3) * 0.500;
crA = picA(:,:,1) * 0.500 + picA(:,:,2) *-0.419 + picA(:,:,3) *-0.081;

yC = yA;
cbC = cbA;
crC = crA;

for i=1:ceil(ROW/2)  % 4:2:0 compress, cb cr只取偶數行列
    cbC(i,:)=[];
    crC(i,:)=[]; 
end
for i=1:ceil(COL/2)
    cbC(:,i)=[];
    crC(:,i)=[]; 
end
%完成4:2:0抽樣

%重建並輸出成pictureB
yB = zeros(ROW,COL);
cbB = zeros(ROW,COL);
crB = zeros(ROW,COL);

yB = yC; 
for i=1:ROW
    for j=1:COL
        if rem(i,2)==0
            if rem(j,2)==0
                cbB(i,j)=cbC(i/2,j/2);
                crB(i,j)=crC(i/2,j/2);
            end
        end
    end
end

for i=1:ROW %還原row
    if i==1
        cbB(i,:)=cbB(i+1,:); %在首行則與第二行資料一致
        crB(i,:)=crB(i+1,:);
    elseif (rem(i,2)==1) & (i<ROW)
        cbB(i,:)=(cbB(i+1,:)+cbB(i-1,:))/2; %缺少資料的奇數行利用隔壁之偶數行資料進行插值重建
        crB(i,:)=(crB(i+1,:)+crB(i-1,:))/2;
    elseif (rem(i,2)==1) & (i==ROW)
        cbB(i,:)=cbB(i-1,:); %在末行則與隔壁行一致
        crB(i,:)=crB(i-1,:);
    end
end

for i=1:COL %還原col
    if i==1
        cbB(:,i)=cbB(:,i+1); %在首列則與第二列資料一致
        crB(:,i)=crB(:,i+1);
    elseif (rem(i,2)==1) & (i<COL)
        cbB(:,i)=(cbB(:,i+1)+cbB(:,i-1))/2; %缺少資料的奇數列利用隔壁之偶數列資料進行插值重建
        crB(:,i)=(crB(:,i+1)+crB(:,i-1))/2;
    elseif (rem(i,2)==1) & (i==COL)
        cbB(:,i)=cbB(:,i-1); %在末列則與隔壁列一致
        crB(:,i)=crB(:,i-1);
    end
end

YCCB(:,:,1)=yB; %重建YCbCr格式的pictureB
YCCB(:,:,2)=cbB;
YCCB(:,:,3)=crB;

RB = yB * 1 + cbB * -219/236311 + crB * 331234/236311; % pictureB YCbCr to RGB
GB = yB * 1 + cbB * -81219/236311 + crB * -168766/236311;
BB = yB * 1 + cbB * 418781/236311 + crB * 234/236311;

RGBB(:,:,1)=RB; %重建RGB格式的pictureB
RGBB(:,:,2)=GB;
RGBB(:,:,3)=BB;

image(RGBB/255) % SHOW
imwrite(RGBB/255,'pictureB.jpg') % output
```