代码而1.利用移位的方式将浮点运算转为整形运算。
2.利用指针访问图像像素。
速度缩短为一半左右。
3.代码二增加了查表的方法,速度更快
代码一
#define cal(a, b, c) (a)*(b) > (c) ? (c) : (a*b)
void autoWhiteBalance(Mat &src_rgb_img)
{
assert(!src_rgb_img.empty());
if (src_rgb_img.channels() == 1)
{
CV_Error(CV_BadImageSize, "invalid channels of input rgb image! ");
}
vector<Mat> imageRGB;
unsigned char * r, *g, *b;
long long r_T=0, b_T=0, g_T=0;
float kr, kg, kb;
int size = src_rgb_img.cols*src_rgb_img.rows ;
r = &src_rgb_img.data[0];
g = &src_rgb_img.data[1];
b = &src_rgb_img.data[2];
int index = 0;
for (; index < size; index++)
{
r_T += *r;
g_T += *g;
b_T += *b;
r += 3;
g += 3;
b += 3;
}
kr = 1.0*(r_T+ g_T + b_T) / (3*r_T);
kg = 1.0*(r_T + g_T + b_T) / (3*g_T);
kb = 1.0*(r_T + g_T + b_T) /(3* b_T);
kr = kr * 1024;
kg = kg * 1024;
kb = kb * 1024;
int ikr = kr;
int ikg = kg;
int ikb = kb;
r = &src_rgb_img.data[0];
g = &src_rgb_img.data[1];
b = &src_rgb_img.data[2];
for (index = 0; index < size; index++)
{
*r = (((cal((*r) , ikr,255 * 1024)) ) >> 10 ) & 0xff;
*g = (((cal((*g) , ikg,255 * 1024)) ) >> 10 ) & 0xff;
*b = (((cal((*b) , ikb,255 * 1024)) ) >> 10 ) & 0xff;
r += 3;
g += 3;
b += 3;
}
}
代码二
#define cal(a, b, c) (a)*(b) > (c) ? (c) : (a*b)
void autoWhiteBalance(Mat &src_rgb_img)
{
assert(!src_rgb_img.empty());
if (src_rgb_img.channels() == 1)
{
CV_Error(CV_BadImageSize, "invalid channels of input rgb image! ");
}
vector<Mat> imageRGB;
unsigned char * r, *g, *b;
long long r_T = 0, b_T = 0, g_T = 0;
float kr, kg, kb;
int size = src_rgb_img.cols*src_rgb_img.rows;
r = &src_rgb_img.data[0];
g = &src_rgb_img.data[1];
b = &src_rgb_img.data[2];
int index = 0;
for (; index < size; index=index+3)
{
r_T += *r;
g_T += *g;
b_T += *b;
r += 9;
g += 9;
b += 9;
}
kr = 1.0*(r_T + g_T + b_T) / (3 * r_T);
kg = 1.0*(r_T + g_T + b_T) / (3 * g_T);
kb = 1.0*(r_T + g_T + b_T) / (3 * b_T);
kr = kr * 1024;
kg = kg * 1024;
kb = kb * 1024;
int ikr = kr;
int ikg = kg;
int ikb = kb;
unsigned char map[256*3] = { 0 };
r = map;
g = &map[256];
b = &map[512];
for (index = 0; index < 256; index++)
{
*r = (((cal((index), ikr, 255 * 1024))) >> 10) & 0xff;
*g = (((cal((index), ikg, 255 * 1024))) >> 10) & 0xff;
*b = (((cal((index), ikb, 255 * 1024))) >> 10) & 0xff;
r += 1;
g += 1;
b += 1;
}
r = &src_rgb_img.data[0];
g = &src_rgb_img.data[1];
b = &src_rgb_img.data[2];
for (index = 0; index < size; index++)
{
*r = map[*r];
*g = map[*g + 256];
*b = map[*b + 512];
r += 3;
g += 3;
b += 3;
}
}