c++ 图片消融算法 求改进 300分

qq614190370 2012-11-22 04:48:28
消融算法需要实现的效果:就是每个像素的颜色溶解到周围的像素里
现在我的算法是这样,不过效率不高,原因可能是内存随机读取次数太多,考虑到cpu高速缓存的问题,在高频率处理大一点的图片的话,很不理想,
求改进,300分相送,谢谢

inline void CVisualWnd::FadeEffect(BYTE *pBits, Color cl, double Fading, int wt, int ht)
{
static int dr[5][2] = {{-1,0}, {0, 1}, {0, -1}, {1, 0}, {0, 0}};
int x=0, y=0;
int bitBytes, bitLine;
bitBytes = 32/8;
bitLine = wt*bitBytes;
int cla = cl.GetA();
int clr = cl.GetR();
int clg = cl.GetG();
int clb = cl.GetB();
double unFading = 1-Fading;
for(y=0; y!=ht; ++y)
{
for(x=0; x!=wt; ++x)
{
int r=0, g=0, b=0, a=0;
int index=0;
for(int i=0;i!=5;++i)
{
int newx=x+dr[i][0], newy=y+dr[i][1];
if(newy<0 || newy>ht-1 || newx<0 || newx>wt-1)
continue;
b += pBits[newy*bitLine + newx*bitBytes];
g += pBits[newy*bitLine + newx*bitBytes + 1];
r += pBits[newy*bitLine + newx*bitBytes + 2];
a += pBits[newy*bitLine + newx*bitBytes + 3];
++index;
}
pBits[y*bitLine + x*bitBytes] = b*Fading/index + clb*unFading ;
pBits[y*bitLine + x*bitBytes + 1]= g*Fading/index + clg*unFading ;
pBits[y*bitLine + x*bitBytes + 2]= r*Fading/index + clr*unFading ;
pBits[y*bitLine + x*bitBytes + 3]= a*Fading/index + cla*unFading ;
}
}
}

调用:FadeEffect((BYTE *)pBits, 0, 0.95, m_pImage->GetWidth(),m_pImage->GetHeight());
...全文
376 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
tkminigame 2012-12-08
  • 打赏
  • 举报
回复
不知道lz的编译器能把代码优化到什么程度,就我所知道的讲了。 1.用双缓存或三缓存,一个只读,一个只写,每次运算切换 2.以行为单位读取和写数据块,提高缓存命中率,不要用pBits[newy*bitLine + newx*bitBytes]方式做读写访问; 3.用增量方式算下标 4.最里层循环展开 5.不做newy<0 || newy>ht-1 || newx<0 || newx>wt-1这样的边界判断,如果基于行的读写,展开循环,你应该知道怎么避免边界超出了。 6.index只有3,4,5三种可能,做点手脚,3和5的时候,中央点取1/2,周围点合计取1/2,4就均摊,用位移运算代替除法
xhcai810914 2012-11-22
  • 打赏
  • 举报
回复
if(newy<0 || newy>ht-1 || newx<0 || newx>wt-1) continue; 把这个去掉吧,边缘额外处理,有这种跳转不利于流水线工作
FancyMouse 2012-11-22
  • 打赏
  • 举报
回复
我就不说怎样利用缓存了。光这句b*Fading/index + clb*unFading把浮点运算给优化掉,clb*unFading这种循环不变量放到外面去计算,就已经能优化许多了。
qq614190370 2012-11-22
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/390291150
qq614190370 2012-11-22
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/390291142

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧