Just a Computer Graphics Studio & My Life

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

我使用這個程式碼來做實驗:

/**
	Theme: Transform Color Space Distortion
	compiler: Dev C++ 4.9.9.2
	Library: OpenCV 2.0
	Date: 101/12/23
	Author: HappyMan
	Blog: https://cg2010studio.wordpress.com/
*/
#include <cv.h>
#include <highgui.h>
using namespace std;

int main(){
	IplImage *src= cvLoadImage("original (0).jpg");
	IplImage *src_lab= cvLoadImage("Lab.jpg");//

	IplImage *src2lab = cvCreateImage(cvGetSize(src), 8, 3);
	IplImage *src2lab2bgr = cvCreateImage(cvGetSize(src), 8, 3);
	IplImage *src_lab2bgr = cvCreateImage(cvGetSize(src), 8, 3);//

	// 輸入lab圖像轉換回BGR顏色空間
	cvCvtColor( src, src2lab, CV_BGR2Lab );
	cvCvtColor( src2lab, src2lab2bgr, CV_Lab2BGR );
	cvCvtColor( src_lab, src_lab2bgr, CV_Lab2BGR );

	// 輸出轉換結果到檔案
	cvSaveImage("src2lab2bgr.jpg" ,src2lab2bgr);
	cvSaveImage("src_lab2bgr.jpg" ,src_lab2bgr);

	system("pause");
	return EXIT_SUCCESS;
}

準備兩張影像為測試對象:

  1. original (0).jpg
  2. Lab.jpg

original (0) Lab

2的影像由1在OpenCV中產生,透過以下函式轉換色彩空間:

cvCvtColor(original (0), Lab, CV_BGR2Lab);

然後以這個函式儲存成檔案:

cvSaveImage(“Lab.jpg" , Lab);

接著使用如上程式碼讀取該兩張影像,對1影像做兩次色彩空間轉換(BGR->Lab->BGR),而對2影像做一次色彩空間轉換(Lab->BGR),分別產生兩張結果影像:

  1. src2lab2bgr.jpg
  2. src_lab2bgr.jpg

src2lab2bgr src_lab2bgr

有沒有發現不一樣的地方?小圖看不太清楚的話,點開來看原始圖吧!前張影像跟原始影像一模一樣,然而後張影像則呈現模糊狀況,產生超級嚴重的失真~於是,我之前的前置工作白費哩……哈~所幸我早已設計批次處理,只要稍微修改程式碼,就能再跑一次同樣的過程:D

目前想到的解決辦法有二:

  1. 直接用RGB色彩空間的影像來處理。(沒用到cvCvtColor)
  2. 在同一程式內抓Lab色彩空間的值儲存為檔案。(沒用到cvSaveImage

至於函式實做內容為何,就要看OpenCV官方文件,在這裡先列出prototype;

  1. C: void cvCvtColor(const CvArr* src, CvArr* dst, int code)
  2. C: int cvSaveImage(const char* filename, const CvArr* image, const int* params=0 )

參考:cvSaveImagecvCvtColor

Advertisements

發表留言

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

WordPress.com Logo

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

Twitter picture

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

Facebook照片

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

Google+ photo

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

連結到 %s

標籤雲

%d 位部落客按了讚: