RGB 转 灰度 计算速度问题

luobinsen007 2008-11-03 11:35:56
各位前辈你们好
我之前在网上查到 RGB 转 255阶灰度 公式有二种

一种是大众型
R*0.11+G*0.59+B*0.30

另一种是 Adobe Photoshop 里的公式
Adobe RGB (1998) [gamma=2.20]
Gray = (R^2.2 * 0.2973 + G^2.2 * 0.6274 + B^2.2 * 0.0753)^(1/2.2)

二种公式计算出来的差异很明显,而且计算速度差异也很大

800*600 的图片
第一种方法耗时:90 ms
第二种方法耗时:900 ms

可是 Photoshop 里速度很快,才50ms左右.

代码如下:
BYTE *lp;
BYTE bt;
for(int y=0;y<pbmp->Height;y++){
lp=(BYTE*)pbmp->ScanLine[y];
for(int x=pbmp->Width-1;x>=0;x--){
//bt=lp[x*3]*0.27+lp[x*3+1]*0.84+lp[x*3+2]*0.52;
//if(bt>255) bt=255;
bt=lp[x*3]*0.3+lp[x*3+1]*0.59+lp[x*3+2]*0.11;
//bt=pow(pow(lp[x*3+2],2.2)*0.2973+pow(lp[x*3+1],2.2)*0.6274+pow(lp[x*3],2.2)*0.0753,1/2.2);
lp[x*3]=bt;
lp[x*3+1]=bt;
lp[x*3+2]=bt;
}
}

...全文
1823 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Felix.Peng 2008-11-04
  • 打赏
  • 举报
回复
要是Photoshop中的公式是这样的话,应该是采用建表的方法,不然没法那么快的!
luobinsen007 2008-11-03
  • 打赏
  • 举报
回复
adobe的源码我没有,
关于adobe的灰度转换公式,我也是从网上查到的。
luobinsen007 2008-11-03
  • 打赏
  • 举报
回复
用查表方法速度提高很多,原先 900ms 的速度现在才 15ms

可是用公式
Gray = (R^2.2 * 0.2973 + G^2.2 * 0.6274 + B^2.2 * 0.0753)^(1/2.2)

建立表差不多需要 18 秒,有什么方法可以提高吗?
The_eagles 2008-11-03
  • 打赏
  • 举报
回复
赞lz专业~
请问adobe的源码从那下的啊?
duxqi 2008-11-03
  • 打赏
  • 举报
回复
假设 Gray 结果是 unsigned short (16b) 型的,定义数组
unsigned short gray_table[256][256][256]; 初始化这个数组后,通过查表得到 Gray 的结果。
表格占用大约 34M 的内存空间。
Jay36 2008-11-03
  • 打赏
  • 举报
回复
楼主是卖内存的吧
还是卖硬盘的?
duxqi 2008-11-03
  • 打赏
  • 举报
回复
你觉得 mem = base + (r * 65536 + g * 256 + b) * 2 这个地址的计算,需要多少次乘法和多少次加法才能算出来?
qiqi5521 2008-11-03
  • 打赏
  • 举报
回复
如果你想做的更好一些,建议还是RGB分别建表。
double R[256],G[256],B[256];
for(long i=0;i <256;i++)
{
R[i] =(i^2.2 * 0.2973);
G[i] = i^2.2 * 0.6274;
B[i] = i^2.2 * 0.0753)
}

利用上述三个表来建gray_table[256][256][256]表 ,肯定够快了。
laviewpbt 2008-11-03
  • 打赏
  • 举报
回复
顺便提一下:
Photoshop标准亮度公式:Gray = 0.3*R + 0.59*G + 0.11*B
laviewpbt 2008-11-03
  • 打赏
  • 举报
回复
用查表简直就是对资源的浪费,况且查表的时候要寻址,虽然是计算机内部帮我们搞定的,但是你也可以估计出他需要多少次乘法和加法才能得到哪个地址。
楼主的速度慢是因为楼主用的数据类型不合理以及代码的优化程度差。

800*600的图像,最多只要16ms的时间,实际上这个时间基本上是用普通的计时器(Gettickcount)能得到的最小精度了(1ms?似乎达不到).

速度的优化可以见ZYL910的代码,VC中可以直接利用移位来提高速度。
http://blog.csdn.net/zyl910/archive/2006/05/22/749752.aspx
qiqi5521 2008-11-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 luobinsen007 的回复:]
用查表方法速度提高很多,原先 900ms 的速度现在才 15ms

可是用公式
Gray = (R^2.2 * 0.2973  + G^2.2  * 0.6274  + B^2.2  * 0.0753)^(1/2.2)

建立表差不多需要 18 秒,有什么方法可以提高吗?
[/Quote]

建表的时候也可以用表来优化。R^2.2 G^2.2 B^2.2 这三个地方可以先建表然后再算。

//建第一个表
double Table[256];
for(long i=0;i<256;i++)
Table[i] = i ^ 2.2;

//建上述的unsigned short gray_table[256][256][256]表
........
duxqi 2008-11-03
  • 打赏
  • 举报
回复
处理前事先建好表,存成文件,使用时直接从文件读取。

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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