首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

OpenCV cvtColor RGB 轉 YUV 顯示異常原因與正確檢視方法

     編輯:程式設計綜合問答

現象描述

使用 `cv::cvtColor(src, dst, cv::COLOR_BGR2YUV)` 轉換後,呼叫 `cv::imshow` 顯示圖片顏色嚴重失真(呈現藍綠異常色調)。

根本原因

`cv::imshow` 內部假設輸入為 BGR 彩色空間直接送顯示管線。它不支援直接顯示 YUV、HSV、Lab 等非 BGR 格式。將 YUV 矩陣當作 BGR 解讀,導致色彩通道錯位:

  • Y (亮度) → 被當作 B (藍色通道)
  • U (藍色差) → 被當作 G (綠色通道)
  • V (紅色差) → 被當作 R (紅色通道)

正確檢視 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);

YUV 色彩空間補充知識

元件含義典型範圍 (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` 副檔名或手動寫入二進位檔。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved