先前已寫過轉換色彩空間 (Transform Color Space),但那時沒有測試到Lab色彩空間。當前研究需要使用CIE L*a*b*色彩空間,於是再次實驗該程式碼,並有深入瞭解各色彩空間相互轉換的數學關係。
稍微修改程式碼:
/**
Theme: Transform Color Space
compiler: Dev C++ 4.9.9.2
Library: OpenCV 2.0
Date: 101/10/09
Author: HappyMan
Blog: https://cg2010studio.wordpress.com/
*/
#include <cv.h>
#include <highgui.h>
using namespace std;
int main(){
IplImage * src= cvLoadImage("night.jpg");
// 創造和src一樣的IplImage資料結構
IplImage* hsv = cvCreateImage( cvGetSize(src), 8, 3 );
IplImage* yuv = cvCreateImage( cvGetSize(src), 8, 3 );
IplImage* lab = cvCreateImage( cvGetSize(src), 8, 3 );
IplImage* test = cvCreateImage( cvGetSize(src), 8, 3 );
// 輸入圖像轉換到HSV&YUV&lab顏色空間
cvCvtColor( src, hsv, CV_BGR2HSV );
cvCvtColor( src, yuv, CV_BGR2YCrCb );
cvCvtColor( src, lab, CV_BGR2Lab );
cvNamedWindow( "Source-RGB", 0 );
cvShowImage( "Source-RGB", src );
cvNamedWindow( "HSV", 0 );
cvShowImage( "HSV", hsv );
cvNamedWindow( "YUV", 0 );
cvShowImage( "YUV", yuv );
cvNamedWindow( "Lab", 0 );
cvShowImage( "Lab", lab );
// 輸入lab圖像轉換回RGB顏色空間
cvCvtColor( lab, test, CV_Lab2RGB );
cvNamedWindow( "test", 0 );
cvShowImage( "test", test );
// 輸出轉換結果到檔案
cvSaveImage("HSV.jpg" ,hsv);
cvSaveImage("YUV.jpg" ,yuv);
cvSaveImage("Lab.jpg" ,lab);
cvSaveImage("test.jpg" ,test);
cvWaitKey(0);
return EXIT_SUCCESS;
}
執行結果:
這裡我就很好奇,明明結果圖test.jpg是BGR2Lab的反向操作Lab2RGB,怎會跟原圖night.jpg差那麼多呢?藍天怎變成奇觀紅天,而紅色橋怎變為陰森的藍色橋@@?
- cvCvtColor( src, lab, CV_BGR2Lab )
- cvCvtColor( lab, test, CV_Lab2RGB )
仔細看上頭兩行程式碼,為什麼是BGR2Lab而不是RGB2Lab?所以我們試驗一下,Lab2RGB改為Lab2BGR……
賓果!我們猜得果然沒有錯,原因是OpenCV中影像的資料結構是以B.G.R的順序,這個理論可以參考我這篇轉換影像為灰階 (Transform Image to Gray Level)。
這時候你可能會問我,明明是同一張影像,怎麼轉換到不同色彩空間,顯示的影像卻是不一樣呢?道理還滿簡單的,就是數學遊戲!各色彩空間如RGB、HSV、YUV、Lab都是三通道,無論這三個通道的值如何變化,最後結果都會被限制在[0, 255],於是就如同預設影像的顯示,三通道的值都被當成RGB的值來顯示。各色彩空間的數學關係可以參考OpenCV官方文件cvtColor。
註:色彩空間互轉的程式碼可以在這篇找到:Color conversion math and formulas;若想知道一個色彩空間的值到另一個色彩空間的值為何可操作這頁:Color calculator。
參考:Converting Lab Values to RGB values in opencv、OpenCV – cvtColor、Color Spaces、從RGB到Lab色彩空間的轉換。

Comments on: "[OpenCV] 轉換色彩空間 (Transform Color Space)" (4)
您好:
可否請教一下
如何知道BGR2GRAY的參數?
讚讚
可以查OpenCV官方文件,或是透過IDE追進去定義之處。
讚讚
[…] 我以為透過OpenCV轉換色彩空間,可以很輕易地來回轉換,而且不會有失真的問題。然而後來我知道,轉換色彩空間會有計算上精準度的問題(小問題),除此之外我又發現一個更容易失真的問題(大問題),其實對程式設計師而言相當容易發現才是,也就是:轉換色彩空間一個函式、儲存影像一個函式,後者失真程度遠大於前者!怎麼會這樣子呢?來看一下實驗結果…… […]
讚讚
[…] 接著我使用OpenCV來做Lab和RGB色彩空間互轉,以轉換色彩空間 (Transform Color Space)這篇程式碼來實驗,以上圖純綠色RGB(0, 255, […]
讚讚