我需要对图片套用一个模板,比如对于如下模板: 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.   

    多大的图,竟然要2秒? ,包括显示么?
    模板操作, 因为在两层for里,再有两层for, 所以, 越深的for, 里面的语句一定要足够优化, 尤其不作乘.
    把代码简化一下帖出来看看.
      

  2.   

    Read my book. It has a template based implementation.http://safariexamples.informit.com/0130869856/Samples/include/Image.cppwww.fengyuan.com
      

  3.   

    Some screen captures:http://www.fengyuan.com/sample/samplech12.html
      

  4.   

    谢谢各位的热心,我搞好了,给大家分享一下我的教训。(1)我的模板定义成float型了,做乘法费时较多,要2.7秒。
    (2)改成int型后耗时1.5秒左右
    (3)后来干脆将乘法改成加法,500毫秒。
    (4)500毫秒基本可以凑合了,认命,编译Release版测试,惊喜发现只需要100毫秒了。
       以前写的程式对反映速度没要求,没注意Debug版和Release效率相差这么多。环境:1024*826 pixel,24bit/pixel的图片,PIII800CPU,256 SDRAM。
      

  5.   

    会用register关键字吗?
    试试看
    速度会成倍提高
      

  6.   

    0   -2   0
    -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级间址,少了一重循环。
    我的程序就是这么做的,速度飞快
    很大的图象
    也只是一闪就好了,呵呵
      

  7.   

    好东西啊,,不错不错!!float 确实比 int 慢好多!不过我用的是BYTE ^_^,,更小了!
      

  8.   

    感谢各位大虾!袁峰先生,你的书很好,可惜是英文的,看起来有些吃力,不知道你有没有计划写成中文版,那些外行翻译的中文版又不敢买,能将C++ builder翻译成C++构建者,实在没信心看。我觉得你既然是中国人,何不自己同时出中文版和英文版,中文的在国内卖,英文的在海外卖呢?