為了做研究,我必須製作整個色彩空間,想以RGB「立體」的方式來產生,然而只能以「平面」的方式顯示在螢幕上,於是我寫了三維映射到二維的程式來實現~
程式將會產生4096×4096的PNG(無損壓縮格式)檔案(8.07MB),不過為了節省我寶貴的部落格空間,我將影像縮小並轉存為1024×1024的JPG(有損壓縮格式)檔案(120KB)。有興趣的人就去跑我的程式來取得整個色彩空間圖吧:)~
整個色彩空間以RGB為例,三個維度256x256x256,總共需要256*256*256=16777216像素,映射到二個維度需4096*4096=16777216像素。我可是調到三更半夜才順利產生出這張圖呢!
/** Theme: Create Color Space compiler: Dev C++ 4.9.9.2 Library: OpenCV 2.0 Date: 101/01/21 Author: HappyMan Blog: https://cg2010studio.wordpress.com/ */ #include <cv.h> #include <highgui.h> #include<iostream> using namespace std; struct intColor { long int blue; long int green; long int red; int number; }; intColor cube[256][256][256] = {0}; int main() { IplImage *Image1; //二維:4096*4096=16777216 //三維:256*256*256=65536*256=16777216 CvSize ImageSize = cvSize(4096, 4096); Image1 = cvCreateImage(ImageSize, IPL_DEPTH_8U, 3); int count1=0; //判斷色彩重複個數 int count2=0; //判斷色彩不重複個數 for(int n=1; n<=16; n++){ for(int i=0; i<Image1->height; i++){ for(int j=((Image1->widthStep)/16)*(n-1); j<((Image1->widthStep)/16)*n; j=j+3){ Image1->imageData[i*Image1->widthStep+j] = i%256;// blue Image1->imageData[i*Image1->widthStep+j+1] = (j/3)%256;// green Image1->imageData[i*Image1->widthStep+j+2] = (i+4096*(n-1))/256;// red if(cube[i%256][(j/3)%256][(i+4096*(n-1))/256].number == 0){ cube[i%256][(j/3)%256][(i+4096*(n-1))/256].number++; count2++; //system("pause"); } else{ count1++; //system("pause"); } } } } cout<<count1<<endl; cout<<count2<<endl; cvNamedWindow("Whole Color Space",1); cvShowImage("Whole Color Space",Image1); cvSaveImage("Whole Color Space.png",Image1); cvWaitKey(0); cvReleaseImage(&Image1); cvDestroyWindow("Whole Color Space"); return 0; }
為了確認是否漏掉計算色彩像素,或是重複計算色彩像素,宣告兩個計數變數來紀錄次數,跑出來的結果無疑是:
0
16777216
之所以產生「正方形」整個色彩空間圖,是因為我要以當前最夯的影像社群APP—Instagram為實驗對象,它以正方形限制影像架構,為了「竊取」它的濾鏡效果,我只好「委曲求全」XD~
不過實驗結果顯然失敗,雖然是早已知道的結果,我還是要試驗我的演算法能做到怎樣的程度。
儘管實驗失敗,依然徹底去瞭解為何失敗,原因全寫在Instagram濾鏡這篇文章囉~
隨意留個言吧:)~