為了做研究,我必須製作整個色彩空間,想以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濾鏡這篇文章囉~

隨意留個言吧:)~