算法优化:rgb向yuv的转化最优算法,快得让你吃惊!

本文介绍了如何通过算法优化将RGB图像快速转换为YUV格式,通过逐步改进代码,包括避免浮点运算、使用查表法、并行处理和使用内联函数等,最终将处理时间从120秒降至0.5秒,揭示了代码优化对性能的巨大影响。
摘要由CSDN通过智能技术生成

朋友曾经给我推荐了一个有关代码优化的pdf文档《让你的软件飞起来》,看完之后,感受颇深。为了推广其,同时也为了自己加深印象,故将其总结为word文档。下面就是其的详细内容总结,希望能于己于人都有所帮助。

 

速度取决于算法

同样的事情,方法不一样,效果也不一样。比如,汽车引擎,可以让你的速度超越马车,却无法超越音速;涡轮引擎,可以轻松 超越音障,却无法飞出地球;如果有火箭发动机,就可以到达火星。

 

代码的运算速度取决于以下几个方面

1、  算法本身的复杂度,比如MPEGJPEG复杂,JPEGBMP图片的编码复杂。

2、  CPU自身的速度和设计架构

3、  CPU的总线带宽

4、  您自己代码的写法

本文主要介绍如何优化您自己的code,实现软件的加速。

 

先看看我的需求

我们一个图象模式识别的项目,需要将RGB格式的彩色图像先转换成黑白图像。

图像转换的公式如下:

Y = 0.299 * R + 0.587 * G + 0.114 * B;

图像尺寸640*480*24bitRGB图像已经按照RGBRGB顺序排列的格式,放在内存里面了。

 

我已经悄悄的完成了第一个优化

以下是输入和输出的定义:

#define XSIZE 640

#define YSIZE 480

#define IMGSIZE XSIZE * YSIZE

typedef struct RGB

{

       unsigned char R;

       unsigned char G;

       unsigned char B;

}RGB;

struct RGB in[IMGSIZE]; //需要计算的原始数据

unsigned char out[IMGSIZE]; //计算后的结果

 

第一个优化

优化原则:图像是一个2D数组,我用一个一维数组来存储。编译器处理一维数组的效率要高过二维数组。

 

先写一个代码:

Y = 0.299 * R + 0.587 * G + 0.114 * B;

 

void calc_lum()

{

    int i;

    for(i = 0; i < IMGSIZE; i++)

    {

       double r,g,b,y;

       unsigned char yy;

        r = in[i].r;

        g = in[i].g;

        b = in[i].b;

        y = 0.299 * r + 0.587 * g + 0.114 * b;

        yy = y;

        out[i] = yy;

    }

}

这大概是能想得出来的最简单的写法了,实在看不出有什么毛病,好了,编译一下跑一跑吧。

第一次试跑

这个代码分别用vc6.0gcc编译,生成2个版本,分别在

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值