拜图像像从信息方式的优化

  
如果您做图像处理发生必然之阅历,并且实战过N次,那么你一定了解代码优化对之行当是何等的要。今天,我们先是简单谈谈访问图像像素技术之优化。

    
首先,我们后面的优化都如根据此前提:我们是坐一维数组的点子来拜访图像的数量的,且:

     1、这个一维数组的数组名字为:ImageData

    
2、数组的高低也Stride*Height。其中Stride表示图像的一个扫描行占用的字节数,这个数字要是4底翻番。Height为图像的莫大。

     3、数组的种类为byte(unsigned Char?)。

    
4、图像的增幅为Width,每个像素占用的字节数用BytePerPixel变量表示,24各项图像该变量的价值吗3,32各图像该变量的价也4.

    
首先我们看看哪些看24要32各项图像的如素值。比如要博取第X履第Y列(以0为起点)像从的绿色分量,则当据此ImageData(Stride*Y+X*BytePerPixel+1)表示,红色分量则为ImageData(Stride*Y+X*BytePerPixel+2)。好,这样我们就是可以写个大概的反色的代码了。

1     For Y = 0 To Height – 1
2         For X = 0 To Width – 1
3             ImageData(Y * Stride + X * BytePerPixel) = 255 – ImageData(Y * Stride + X * BytePerPixel)           ‘Blue分量
4             ImageData(Y * Stride + X * BytePerPixel + 1) = 255 – ImageData(Y * Stride + X * BytePerPixel + 1)   ‘Green分量
5             ImageData(Y * Stride + X * BytePerPixel + 2) = 255 – ImageData(Y * Stride + X * BytePerPixel + 2)   ‘Red分量
6         Next
7     Next

      注意到反色一般是免处理Alpha通道的。

    
上述代码思路清楚、描述准确,每行的意义不言而喻,是当做新手最好的习图像内存摆布的表达方式,作为考试书的语肯定是可打100分的。但是要是作为项目盈余的话,顶多是只60私分吧。

      首先,我们着眼,在每行中出了汪洋底更计算:Y * Stride + X *
BytePerPixel,我们该要计算同一破他即足以,好之,接着改善:

1 For Y = 0 To Height – 1
2     For X = 0 To Width – 1
3         Speed = Y * Stride + X * BytePerPixel
4         ImageData(Speed) = 255 – ImageData(Speed)           ‘Blue分量
5         ImageData(Speed + 1) = 255 – ImageData(Speed + 1)   ‘Green分量
6         ImageData(Speed + 2) = 255 – ImageData(Speed + 2)   ‘Red分量
7     Next
8 Next

     计算速度会时有发生大的升迁,好得拿个80瓜分了。

    
还出没有发生改进的半空中也,注意观察在X层的大循环中, Y * Stride始终是一个定量,而我们每次都又计算了外,有必要把他干外层的轮回中,同时我们尚惦记对X * BytePerPixel举行点动作,尽量减少乘法,毕竟乘法的CPU周期比较加法要多一些。好,看咱们最终之改善版本:

1 For Y = 0 To Height – 1
2      Speed = Y * Stride
3      For X = 0 To Width – 1
4          ImageData(Speed) = 255 – ImageData(Speed)           ‘Blue分量
5          ImageData(Speed + 1) = 255 – ImageData(Speed + 1)   ‘Green分量
6          ImageData(Speed + 2) = 255 – ImageData(Speed + 2)   ‘Red分量
7          Speed = Speed + BytePerPixel                        ‘跳到下一个像素
8      Next
9  Next

      也有人爱用脚的方:

 1     LineAddBytes = Stride – Width * BytePerPixel
 2     For Y = 0 To Height – 1
 3         For X = 0 To Width – 1
 4             ImageData(Speed) = 255 – ImageData(Speed)           ‘Blue分量
 5             ImageData(Speed + 1) = 255 – ImageData(Speed + 1)   ‘Green分量
 6             ImageData(Speed + 2) = 255 – ImageData(Speed + 2)   ‘Red分量
 7             Speed = Speed + BytePerPixel                        ‘跳到下一个像素
 8         Next
 9         Speed = Speed + LineAddBytes                            ‘补齐扫描行最后的数额
10     Next

     
第二栽表达方式更加突出了扫描行的大大小小并不一定等于图像宽度*各国像从的占用的字节数,所以于历次扫描一行之后如果注意补一起未处理的那有。这也是过多图像处理初大方在拍卖图像时可能会见赶上处理后的图像效果沿对角线错位的来由。包括我们广大底正式的数字图像处理书,比如自己常常看之朗锐的那依VC图像处理教程,都没异常留意这题目。而那些教材一般所测试用的图像是传说被的lena图像,这个图像大小如是256*256,由于宽度正好是4底翻番,LineAddBytes这个变量为0,因此此题目就深受隐形起来了。

     我个人还习惯于下第一种植表达方式。

    
对于使用C或C++编程的情侣,上述代码还有好优化的地方,++运算符能替代某些算式的。

     有有限独问题提醒大家小心:

    
1、图像处理算法中以健康状态下还是事先按行处理,在展开排方向递增,这样做对代码的优化来异常充分的利益,因为图像于内存的多少摆布也是单排就一行的。

     2、两只样子的大循环注意一般都是起生标0开始的,一般不建议于1始发。