快速白平衡算法

代码而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;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值