作者VictorTom (鬼翼&娃娃鱼)
看板C_and_CPP
标题Re: [问题] 关於RGB转灰阶的程式码问题
时间Thu Apr 9 15:52:10 2009
※ 引述《devilrucifer (devilrucifer)》之铭言:
: ※ 引述《VictorTom (鬼翼&娃娃鱼)》之铭言:
: : 理论上, 後面这个比较精确, 常见的做法还会加一个四舍五入的0.5
: : 但是, 在CPU上, 甚至一些embbed system, 前者会算的比较快....
: : 有一个折衷的方案是:
: : gray = (R*299 + G*587 + B*114 + 500) / 1000;
: 不好意思我在请问一下一个问题,
: 请问这一边加0.5四舍五入的用意是什麽呢?
: 是怕数值超过255吗?
不是, 就是四舍五入啊....
原本那个公式(#2)gray算出的结果是个浮点数....
如果算出gray = 123.123 这样的结果....
整数化要在0-255间, gray您要当它是123还是124呢??
又, 如果是123.876勒:)
如果是用#1那个/256的方法, 就不用考虑四舍五入了....
: 小弟是试过有加跟没加都可以正常执行,
: 也看过有人没加0.5而是在後面追加
:
: if(gray>255)gray=255;
: if(gray<0)gray=0;
这个才是在做边界判断, 比如算noise时有可能会超过....
那就有需要在算完的gray level加上边界判断....
有时候术语我们把它称为 clamp .
: 请问这几个在执行上有甚麽差异吗?
: 在此先谢谢各位版友。
以你的RGB转灰阶, 只要input的RGB值确定都会在0-255间....
公式算出来(就算加0.5四舍五入)理论上都不会超过0-255....
所以你的这个case如果不加边界判断也无所谓....
觉得不必要, 但是有怕哪天有意外会出错....
为了方便debug, 可以试试看用 assert(gray >= 255 && gray <= 0);
(请自己找一下assert的用法, 如果您在意这个的话, 不然就别管它吧)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.66.243.96
※ 编辑: VictorTom 来自: 61.66.243.96 (04/09 15:53)
1F:推 devilrucifer:真的太感谢您了^^ 小弟有豁然开朗的感觉 谢谢 04/09 18:18
2F:→ VictorTom:惨了~~是 (gray <= 255 && gray >= 0) 才对....Orz 04/09 18:39