Just My Life & My Work

先前已寫過轉換色彩空間 (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 – cvtColorColor Spaces從RGB到Lab色彩空間的轉換

Comments on: "[OpenCV] 轉換色彩空間 (Transform Color Space)" (4)

  1. 您好:
    可否請教一下
    如何知道BGR2GRAY的參數?

  2. […] 我以為透過OpenCV轉換色彩空間,可以很輕易地來回轉換,而且不會有失真的問題。然而後來我知道,轉換色彩空間會有計算上精準度的問題(小問題),除此之外我又發現一個更容易失真的問題(大問題),其實對程式設計師而言相當容易發現才是,也就是:轉換色彩空間一個函式、儲存影像一個函式,後者失真程度遠大於前者!怎麼會這樣子呢?來看一下實驗結果…… […]

  3. […] 接著我使用OpenCV來做Lab和RGB色彩空間互轉,以轉換色彩空間 (Transform Color Space)這篇程式碼來實驗,以上圖純綠色RGB(0, 255, […]

隨意留個言吧:)~

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

標籤雲

%d 位部落客按了讚: