我需要对图片套用一个模板,比如对于如下模板: 0 -2 0
-1 5 -1
0 -2 0就是对于图片的每个象素的R,G,B值,将自己乘以5,再加上自己上方、下方的R,G,B的值乘-2的结果,再加上左方、右方象素的R,G,B的值乘-1的结果,得到新的R,G,B的值。新的值不参与计算邻近象素的计算,而是使用老的值参与邻近象素的计算。我的算法就是另开一个相同大小的buffer来存储新的象素值,然后老老实实的先乘中间的值,再一一加上这些邻近象素的值和参数的乘积,再保存到新开的buffer中去。得到的结果是正确的,但是费时太多。同样大小的图片,采用同样的模板,我需要2秒不到一点,但是photoshop处理只是一闪就好了,0.1秒都不到。那位大侠知道如何才能优化这样的算法,除了这200分,另给200分相送,在线急等。
-1 5 -1
0 -2 0就是对于图片的每个象素的R,G,B值,将自己乘以5,再加上自己上方、下方的R,G,B的值乘-2的结果,再加上左方、右方象素的R,G,B的值乘-1的结果,得到新的R,G,B的值。新的值不参与计算邻近象素的计算,而是使用老的值参与邻近象素的计算。我的算法就是另开一个相同大小的buffer来存储新的象素值,然后老老实实的先乘中间的值,再一一加上这些邻近象素的值和参数的乘积,再保存到新开的buffer中去。得到的结果是正确的,但是费时太多。同样大小的图片,采用同样的模板,我需要2秒不到一点,但是photoshop处理只是一闪就好了,0.1秒都不到。那位大侠知道如何才能优化这样的算法,除了这200分,另给200分相送,在线急等。
模板操作, 因为在两层for里,再有两层for, 所以, 越深的for, 里面的语句一定要足够优化, 尤其不作乘.
把代码简化一下帖出来看看.
(2)改成int型后耗时1.5秒左右
(3)后来干脆将乘法改成加法,500毫秒。
(4)500毫秒基本可以凑合了,认命,编译Release版测试,惊喜发现只需要100毫秒了。
以前写的程式对反映速度没要求,没注意Debug版和Release效率相差这么多。环境:1024*826 pixel,24bit/pixel的图片,PIII800CPU,256 SDRAM。
试试看
速度会成倍提高
-1 5 -1
0 -2 0这个问题这样解决,把乘法变成加法,省略一重循环。
先定义一个地址数组: paddress[4];把数组中的偏移量都算好,
我们以灰度图象为例子,设width是图象的宽度
paddress[0] = -width;
paddress[1] = - 1;
paddress[2] = 1;
paddress[3] = width;那么卷积的结果就是:BYTE *pnewtemprow, *poldtemprow;
pnewtemprow = pnew;//pnew 是新图象的地址
poldtemprow = pold;for( int row = 0; row < new_iamge_row; row++ ){ for( int column = 0; column < new_image_column; column++ ){ pnewtemprow[column] = -2 * poldtemprow[column + paddress[0]]
- poldtemprow[column + paddress[1]]
+5 * poldtemprow[column]
- poldtemprow[column + paddress[2]]
-2 * poldtemprow[column + paddress[3]] } //指向下一行
pnewtemprow += new_width;
poldtemprow += old_width;
}不同的模版需要不同的地址数组 , 用2级间址,少了一重循环。
我的程序就是这么做的,速度飞快
很大的图象
也只是一闪就好了,呵呵