//2013.10.24 //eageldiao //自动白平衡 CvScalar rgb; rgb=cvAvg(src); #ifdef COLOR_GW //灰度世界假设(R,= R*K/Ravg ,其中,K=128 or (Ravg+Gavg+Bavg)/3 ) int KK,gw_k; //KK=rgb.val[0]; //if (rgb.val[1]>KK)KK=rgb.val[1]; //if (rgb.val[2]>KK)KK=rgb.val[2]; //gw_k=KK; //K=max(Ravg+Gavg+Bavg) //gw_k=(rgb.val[0]+rgb.val[1]+rgb.val[2])/3;//K=mean(Ravg+Gavg+Bavg) gw_k=120; //K=128; printf( "K=%d;BGR(%f,%f,%f) ",gw_k,rgb.val[0],rgb.val[1],rgb.val[2]); //显示RGB三通道的均值。 #endif #ifdef COLOR_REMAIN float gw_k, rgbavg, KK; //rgbavg=(rgb.val[0]+rgb.val[1]+rgb.val[2])/3; //KK=rgb.val[0]/rgbavg; //if(rgb.val[1]/rgbavg>KK)KK=rgb.val[1]/rgbavg; //if(rgb.val[2]/rgbavg>KK)KK=rgb.val[2]/rgbavg; //gw_k=KK; gw_k=1.3; printf( "K=%f(%f,%f,%f) ",gw_k,rgb.val[0],rgb.val[1],rgb.val[2]); //显示RGB三通道的均值。 #endif for(y=0;y<height;y++) { unsigned char *srcrow= (unsignedchar*)(src->imageData+y*src->widthStep); for (x=0;x<width;x++) { #ifdef COLOR_GW //使用一般的灰度世界的方法 srcrow[3*x]=srcrow[3*x]*gw_k/rgb.val[0]>255 ? 255:srcrow[3*x]*gw_k/rgb.val[0]; srcrow[3*x+1]=srcrow[3*x+1]*gw_k/rgb.val[1]>255 ?255: srcrow[3*x+1]*gw_k/rgb.val[1]; srcrow[3*x+2]=srcrow[3*x+2]*gw_k/rgb.val[2]>255 ?255: srcrow[3*x+2]*gw_k/rgb.val[2]; #endif #ifdef COLOR_REMAIN //使用颜色保持的增强方法,R'/R=G'/G=B'/B=gw_k; srcrow[3*x]=srcrow[3*x]*gw_k>255 ?255: srcrow[3*x]*gw_k; srcrow[3*x+1]=srcrow[3*x+1]*gw_k>255 ?255: srcrow[3*x+1]*gw_k; srcrow[3*x+2]=srcrow[3*x+2]*gw_k>255 ?255: srcrow[3*x+2]*gw_k; #endif } }