# 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值。在這種格式中,
色度信號的分辨率和亮度信號的分辨率是相同的。
這種格式主要應用在視頻處理設備內部,避免畫質在處理過程中降低。

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色度信號分辨率是亮度信號分辨率的一半。

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。

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)
:::