---
# System prepended metadata

title: Camera OV7670 第08段 YUV

---

# Camera OV7670 第08段 YUV
```javascript=
/*
 uint8_t lineBuffer [lineBufferLength]
 uint8_t * lineBufferSendByte;
 const bool isSendWhileBuffering = true;//這是在緩衝時發送
 uint16_t processedByteCountDuringCameraRead = 0;//相機讀取期間處理的字節數
 inline void processNextGrayscalePixelByteInBuffer() __attribute__((always_inline));//處理緩衝區中的下一個灰度像素字節
 inline uint8_t formatPixelByteGrayscaleFirst(uint8_t byte) __attribute__((always_inline));//優先格式化灰度像素字節
 inline uint8_t formatPixelByteGrayscaleSecond(uint8_t byte) __attribute__((always_inline));//第二格式化灰度秒像素字節
*/
void processGrayscaleFrameBuffered() {
  camera.waitForVsync();
  commandDebugPrint("Vsync");

  camera.ignoreVerticalPadding();//忽略垂直填充

  for (uint16_t y = 0; y < lineCount; y++) {
    lineBufferSendByte = &lineBuffer[0];
    camera.ignoreHorizontalPaddingLeft();//忽略左側水平填充

    uint16_t x = 0;
    while ( x < lineBufferLength) {
      camera.waitForPixelClockRisingEdge(); // YUV422 grayscale byte 等待像素時脈上升緣
      camera.readPixelByte(lineBuffer[x]);
      lineBuffer[x] = formatPixelByteGrayscaleFirst(lineBuffer[x]);

      camera.waitForPixelClockRisingEdge(); // YUV422 color byte. Ignore.忽視
      if (isSendWhileBuffering) {
        processNextGrayscalePixelByteInBuffer();
      }
      x++;

      camera.waitForPixelClockRisingEdge(); // YUV422 grayscale byte
      camera.readPixelByte(lineBuffer[x]);
      lineBuffer[x] = formatPixelByteGrayscaleSecond(lineBuffer[x]);

      camera.waitForPixelClockRisingEdge(); // YUV422 color byte. Ignore.忽視
      if (isSendWhileBuffering) {
        processNextGrayscalePixelByteInBuffer();
      }
      x++;
    }
    camera.ignoreHorizontalPaddingRight();

    // Debug info to get some feedback how mutch data was processed during line read.
    //Debug info以獲得一些回授，在讀取時間(行)時處理了多少數據。
    processedByteCountDuringCameraRead = lineBufferSendByte - (&lineBuffer[0]);

    // Send rest of the line
    while (lineBufferSendByte < &lineBuffer[lineLength]) {
      processNextGrayscalePixelByteInBuffer();
    }
  };
}


```
## YUV

- Y'UV的發明是由於彩色電視與黑白電視的過渡時期。
黑白視訊只有Y（Luma，Luminance）視訊，也就是灰階值。
到了彩色電視規格的制定，是以YUV/YIQ的格式來處理彩色電視圖像，
把UV視作表示彩度的C（Chrominance或Chroma），
如果忽略C訊號，那麼剩下的Y（Luma）訊號就跟之前的黑白電視訊號相同，
這樣一來便解決彩色電視機與黑白電視機的相容問題。Y'UV最大的優點在於只需佔用極少的頻寬。

- 因為UV分別代表不同顏色訊號，所以直接使用R與B訊號表示色度的UV。
也就是說UV訊號告訴了電視要偏移某象素的的顏色，而不改變其亮度。
或者UV訊號告訴了顯示器使得某個顏色亮度依某個基準偏移。
UV的值越高，代表該像素會有更飽和的顏色。

- Y′UV, YUV, YCbCr, YPbPr所指涉的範圍，常有混淆或重疊的情況。從歷史的演變來說，其中YUV和Y'UV通常用來編碼電視的類比訊號，而YCbCr則是用來描述數位的影像訊號，適合影片與圖片壓縮以及傳輸，例如MPEG、JPEG。 但在現今，YUV通常已經在電腦系統上廣泛使用。

Y'代表明亮度(luma; brightness)
U與V儲存色度(色訊; chrominance; color)部分; 
亮度(luminance)記作Y，而Y'的prime符號記作伽瑪校正。

- YUV也可以稱為YCbCr，雖然這些術語定義略有不同，但它們往往會混淆並可互換使用。
  - Y表示亮度分量：如果只顯示Y的話，圖像看起來會是一張黑白照。
U（Cb）表示色度分量：B－Y，圖像藍色部分去掉亮度,反映了RGB輸入信號藍色部分與RGB信號亮度值之間的差異。
V（Cr）表示色度分量：R－Y，圖像紅色部分去掉亮度,反映了RGB輸入信號紅色部分與RGB信號亮度值之間的差異。
- . YUV Formats分成兩個格式：

  - 緊縮格式（packed formats）：將Y、U、V值儲存成Macro Pixels陣列，和RGB的存放方式類似。
平面格式（planar formats）：將Y、U、V的三個分量分別存放在不同的矩陣中。
  - 緊縮格式（packed format）中的YUV是混合在一起的，
對於YUV4:2:2格式而言，用緊縮格式很合適的，因此就有了UYVY、YUYV等。
  - 平面格式（planar formats）是指每Y份量，U份量和V份量都是以獨立的平面組織的，
也就是說所有的U份量必須在Y分量後面，而V份量在所有的U份量後面，
此一格式適用於採樣（subsample）。
平面格式（planar format）有I420（4:2:0）、YV12、IYUV等。


## YUV格式
為節省頻寬起見，大多數YUV格式平均使用的每像素位數都少於24位元。
- 主要的抽樣（subsample）格式有
YCbCr 4:2:0、
YCbCr 4:2:2、
YCbCr 4:1:1
YCbCr 4:4:4。
YUV的表示法稱為A:B:C表示法：

4:4:4表示完全取樣。
4:2:2表示2:1的水平取樣，垂直完全採樣。
4:2:0表示2:1的水平取樣，垂直2:1採樣。
4:1:1表示4:1的水平取樣，垂直完全採樣。
最常用Y:UV記錄的比重通常1:1或2:1

- DVD-Video是以YUV 4:2:0的方式記錄，也就是我們俗稱的I420，
YUV4:2:0並不是說只有U（即Cb）, V（即Cr）一定為0，
而是指U：V互相援引，時見時隱，也就是說對於每一個行，
只有U或者V份量，如果一行是4:2:0的話，
下一行就是4:0:2，再下一行是4:2:0...以此類推。
### YUV444

色度信號分辨率最高的格式是YUV4:4:4，每4點Y採樣，就有相對應的4點U和4點V。
換句話說，每個Y值對應一個U和一個V值。在這種格式中，
色度信號的分辨率和亮度信號的分辨率是相同的。
這種格式主要應用在視頻處理設備內部，避免畫質在處理過程中降低。
![](https://i.imgur.com/yCRIYbu.jpg)


YUV444區分方法：如圖所示
4個Y值，第1行獲得4組UV色度值（如像素1、2、3、4均可獨立表示）
第2行也獲得4組UV色度值（如像素5、6、7、8均可獨立表示）。


### YUV422
色度信號分辨率格式YUV4:2:2，每4點Y採樣，就有相對應的2點U和2點V。
可以看到在水平方向上的色度表示進行了2倍下採樣，因此YUV422色度信號分辨率是亮度信號分辨率的一半。
![](https://i.imgur.com/GijOoZj.jpg)

YUV422區分方法：如圖所示
4個Y值，第1行獲得2組UV色度值（其中像素1、2合併為1組UV值表示，3、4合併為1組）
第2行獲得2組UV色度值（其中像素5、6合併為1組，7、8合併為1組）。

### YUV420

色度信號分辨率格式YUV4:2:0，每4點Y採樣，就有相對應的1點U和1點V。 YUV420色度信號分辨率是亮度信號分辨率的1/4。
![](https://i.imgur.com/JYlNBiK.jpg)

YUV420區分方法：如圖所示
4個Y值，第1行獲得2組UV色度值（其中1、2合併為1組，3、4合併為1組）
第2行獲得0組UV色度值（5-8像素的色度值全丟棄）。
即在水平方向壓縮的基礎上，再在垂直方向上再進行了壓縮。

:::spoiler YUV不同採樣格式對圖像畫質的影響分析

根據前述的YUV採樣格式分析，這裡我們分析一下對圖像畫質的影響。我們將一個原始圖像為8*8像素的紅藍相間的圖案，分別按YUV444、YUV422、YUV420不同的採用格式採樣，然後再還原輸出。

![Uploading file..._zz229n8oc]()


(a)：我們可以看到YUV444的色度信號的分辨率和亮度信號的分辨率無損失，我們獲得了與原始圖案一致的還原畫面圖案。

(b)：YUV422獲得還原圖案在水平方向上，已經出現了丟失，從綠色所框選的像素來看，YUV422在水平方向上丟失了另一個像素點的色彩值，故在畫面還原時僅是對前一個像素值簡單的複制重構。

(c)：YUV420獲得還原圖案在水平方向以及垂直方向上，均出現了丟失，獲得的還原圖像與原始圖像出現很大的失真。

參考網站(http://m.pjtime.com/2021/4/m192828404475.shtml)
:::