90 likes | 198 Views
Macbeth Color Pattern. Prof.: Marcelo Gatass Aluno: Felipe Baldino Moreira Fundamentos de Computação Gráfica 1. Semestre de 2013 - Trabalho 0. O padrão Macbeth gerado. O Padrão MacBeth gamma = 1.6/2.4. O que foi feito.
E N D
Macbeth Color Pattern Prof.: Marcelo Gatass Aluno: Felipe Baldino Moreira Fundamentos de Computação Gráfica 1. Semestre de 2013 - Trabalho 0
O padrão Macbeth gerado • O Padrão MacBeth gamma = 1.6/2.4
O que foi feito • Alterado o arquivo color.c com as constantes passadas pelo professor para o parametro A e D65 do espectro para a conversão para o sistema XYZ. • Criada a função de conversão corCIEXYZtosRGB_Bruce que recebe como entrada as cores no sistema CIEXYZ e retorna no sistema sRGB mantendo o iluminante atual e usa a fórmula obtida no site do Bruce Lindbloom. • Inserida a variável de ajuste Gamma no programa. • Implementada a função de leitura do arquivo • corCIEXYZIlumminantA_toD65_XYZScaling – converte o iluminante A para o D65 no espaço de cor XYZ. • Apresentado o padrão tanto com o Iluminant A como o D65.
corCIEXYZtosRGB_Bruce intcorCIEXYZtosRGB_Bruce(floatX,float Y, float Z, float* R, float* G, float* B) /*converte XYZ para sRGB , fórmula obtida do site do Bruce LindBloom*/ { *R = 3.24071 * X + (-1.53726 * Y )+ (-0.498571) * Z; *G =(-0.969258) * X +( 1.87599 * Y) + 0.0415557 * Z; *B = 0.0556352 * X + (-0.203996 * Y) + 1.05707 * Z; return 1; }
gamma_sRGB(double x) staticdoublegamma_sRGB(double x){ /* Retorna o valor da cor x corrigido com a correção gamma */ double ft,t = (x>0)?x:-x; if (t>0.0031308) ft = 1.055*pow(t,fVargamma)-0.055; /*código original ft = 1.055*pow(t,1.0/2.4)-0.055; */ else ft = 12.92*t; return(x>0)?ft:-ft; }
inv_gamma_sRGB • static double inv_gamma_sRGB( float x) { • /* Como foi alterada a função da variação gamma, também foi necessário alterar a inv_gamma_sRGB */ • double ft,t=(double) (x>0)?x:-x; • if ( t > 0.04045 ) • ft = pow((t+0.055)/1.055,fVargamma); • /*alterado de 2.4 para fVargamma */ • else • ft = t/12.92; • return (x>0)?ft:-ft; • }
Int corCIEXYZIlumminantA_toD65_XYZScaling(floatX,float Y, float Z, float* XX, float* YY, float* ZZ) { double m[3*3] ={0.8652435, 0.0000000, 0.0000000, 0.0000000, 1.0000000 , 0.0000000, 0.0000000 , 0.0000000 , 3.0598005}; *XX = (m[0] * X) + (m[1] * Y )+ (m[2] ) * Z; *YY =(m[3] * X) + (m[4] * Y )+ (m[5] ) * Z;; *ZZ = (m[6] * X) + (m[7] * Y )+ (m[8] ) * Z;; return 1; }
Learquivo voidlearquivo(char str[20]) {FILE *arq; floatf, fx,fy,fz,fl,fr,fg,fb,fxa,fya,fza,fra,fga,fba; floatlpart[lambdacolorsonfile]; char cname[1000]; inti,cnumber,linha,n; for (i=0;i<maxcolorspattern;i++) { vetred[i]=0; vetgreen[i]=0; vetblue[i]=0; vetred2[i]=0; vetgreen2[i]=0;vetblue2[i]=0; } if (! (arq=fopen(str,"rt"))) { printf("\n\n\n\t\t\t FILE NOT FOUND \n\n\n"); getchar(); exit(255); } cnumber=0; linha=0; while(! feof(arq) &(cnumber<24)) { while(fgetc(arq)!='\n') ; //pula a primeira linha fscanf(arq,"%i\t %s ",&cnumber,cname); fr=0.0f;fg=0.0f;fb=0.0f;fxa=0;fya=0;fza=0;fra=0;fga=0;fba=0; for(n=0;n<lambdacolorsonfile;n++) lpart[n]=0.0f; fx=0;fy=0;fz=0;fl=0;n=0; for (i=380;i<=730;i+=10) {fl=0;fscanf(arq,"%f",&fl); lpart[n]=fl;n++;} corCIEXYZfromSurfaceReflectance(380.0f,36,10,lpart,&fxa,&fya,&fza,D65);//(i,&fx,&fy,&fz); corCIEXYZtosRGB_Bruce(fxa,fya,fza,&fr,&fg,&fb); vetred[cnumber-1]=fr;vetgreen[cnumber-1]=fg;vetblue[cnumber-1]=fb; fr=0;fg=0;fb=0; corCIEXYZfromSurfaceReflectance(380.0f,36,10,lpart,&fx,&fy,&fz,A); corCIEXYZIlumminantA_toD65_XYZScaling(fx,fy,fz,&fx,&fy,&fz);//troca de iluminante de A para D65 corCIEXYZtosRGB_Bruce(fx,fy,fz,&fr,&fg,&fb); // muda de sistema sem alterar o iluminante vetred2[cnumber-1]=fr;vetgreen2[cnumber-1]=fg;vetblue2[cnumber-1]=fb; }fclose(arq);}
O output do Programa • O padrão superior utiliza o Iluminante D65 O Padrão inferior utiliza o iluminante A e o converte para ser exibido no monitor.