使用 `cv::cvtColor(src, dst, cv::COLOR_BGR2YUV)` 轉換後,呼叫 `cv::imshow` 顯示圖片顏色嚴重失真(呈現藍綠異常色調)。
`cv::imshow` 內部假設輸入為 BGR 彩色空間直接送顯示管線。它不支援直接顯示 YUV、HSV、Lab 等非 BGR 格式。將 YUV 矩陣當作 BGR 解讀,導致色彩通道錯位:
cv::Mat yuv, bgr;
cv::cvtColor(src, yuv, cv::COLOR_BGR2YUV);
// 處理 YUV...
cv::cvtColor(yuv, bgr, cv::COLOR_YUV2BGR); // 轉回 BGR
cv::imshow("YUV 處理結果", bgr); // 正確顯示
std::vector channels;
cv::split(yuv, channels);
// channels[0] = Y (亮度,灰階圖)
// channels[1] = U (藍色差)
// channels[2] = V (紅色差)
cv::imshow("Y 通道", channels[0]);
cv::imshow("U 通道", channels[1]);
cv::imshow("V 通道", channels[2]);
cv::Mat yuv, yChannel;
cv::cvtColor(src, yuv, cv::COLOR_BGR2YUV);
cv::split(yuv, channels);
cv::applyColorMap(channels[0], yChannel, cv::COLORMAP_JET); // 亮度熱力圖
cv::imshow("Y 偽彩色", yChannel);
| 元件 | 含義 | 典型範圍 (8-bit) |
|---|---|---|
| Y | 亮度 | 16~235 (TV範圍) 或 0~255 (全範圍) |
| U (Cb) | 藍色差分量 | 16~240 中性點 128 |
| V (Cr) | 紅色差分量 | 16~240 中性點 128 |
// OpenCV 4.x 色彩轉換代碼
cv::COLOR_BGR2YUV // BGR → YUV (BT.601)
cv::COLOR_BGR2YUV_I420 // BGR → YUV420P (平面格式)
cv::COLOR_YUV2BGR // YUV → BGR
cv::COLOR_YUV2BGR_I420 // YUV420P → BGR
處理 YUV 圖像時,永遠記得轉回 BGR 才能正確顯示。若需儲存 YUV 檔案,使用 `cv::imwrite` 搭配 `.yuv` 副檔名或手動寫入二進位檔。