作者VictorTom (鬼翼&娃娃鱼)
看板C_and_CPP
标题Re: [问题] 关於RGB转灰阶的程式码问题
时间Wed Apr 8 23:19:32 2009
※ 引述《devilrucifer (devilrucifer)》之铭言:
: 各位板大好:
: 小弟因为最近刚开始学影像处理,所以有很多东西不懂,
: 在此想请教一下各位先进关於灰阶转换的问题,常见的两种的算式
: Gray=(B*28+G*151+R*77)/256
: OR
: gray=R*0.299+G*0.587+B*0.114
理论上, 後面这个比较精确, 常见的做法还会加一个四舍五入的0.5
但是, 在CPU上, 甚至一些embbed system, 前者会算的比较快....
有一个折衷的方案是:
gray = (R*299 + G*587 + B*114 + 500) / 1000;
: 请问要用哪一种会比较精准,还是是没差的呢?
: 还有想请教为什麽RGB要乘於那些系数呢?
: 最後除以256是为什麽呢?灰阶不是只有0-255?
习惯上我们表示一个channle的color都是0.0~1.0....
代表这个pixel的各个channel输出的强度要是无~最强....
但是display device只有固定level, RGB888来说就是8bits一个channel
所以才会有fixed 0-255, 这是用0.0~1.0的range scale到0-255的结果....
但是前面那个公式小弟比较没见过, 只是28+151+77 = 256
所以它只是用另一个比例去混出gray level的值....
这两个运算结果看起来不太一样, 除了G的强度看起来差不多....
: 还有小弟有看过这种程式码
:
: //---------------------------------------------------------------------------
: void __fastcall TForm1::Button3Click(TObject *Sender)
: {
: int x,y,graylevel;
: for(y=1;y<=Image1->Height;y++)
: {
: for(x=1;x<=Image1->Picture->Width;x++)
: {
: TCColor c=Image1->Canvas->Pixels[x][y];
: graylevel=((int)c.Red+(int)c.Green+(int)c.Blue)/3;
: Image1->Canvas->Pixels[x][y]=TCColor(graylevel,graylevel,graylevel).Color;
: }
: }
: }
: //---------------------------------------------------------------------------
:
: 请问为什麽程式码可以这样写,他的意思是什麽?RGB加起来除以3也是灰阶吗?
: 烦请有空的版友拨空回覆一下小弟,小弟感激不尽。
另一种更懒的算法, 就是(R+G+B)/3, 这也是一种算法....
Color -> Gray, 有时候你会在别种不同的Color Space里....
看到Intensity, Brightness, Luminence, Y, L等等的用词....
大部份都是指, 利用R/G/B三个channel的强度用一个比例....
来算出一个(中文简单的说是)亮度值, 不同Color Space有不同算法....
印象中, 第二个算法是YCbCr的, 第三个是HSI好像会用到....
详细的作法请参考不同的Color Space (transform)的计算公式(plz google them)
简单的说, Color->Gray Level 是 彩色->灰阶, 怎麽转就有很多公式可以用....
以上, 是小弟以前稍微摸一下Color Image Processing的记忆:)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.132.174.98
1F:→ VictorTom:包~~我注意到了, 第一个公式的是BGR的顺序, 那其实跟第 04/08 23:22
2F:→ VictorTom:二个是一样的, 晕...@_@" 印象中是还有其他相似的算法:) 04/08 23:23
※ 编辑: VictorTom 来自: 220.132.174.98 (04/08 23:28)
3F:→ VictorTom:修一个错字, 包的地方懒得修, 反正要解释/256....Orz 04/08 23:28
4F:推 snowlike:第一式猜测是基於整数的分配原则,毕竟灰阶亦没有小数点 04/08 23:34
5F:→ VictorTom:其实第一式很单纯啦, 原本RGB各别的小数乘256再四舍五入 04/08 23:38
6F:→ VictorTom:只是它是BGR的顺序, po文时眼花没注意到, 它和我的折衷 04/08 23:38
7F:→ VictorTom:式是差不多的意思, 只是某种程度上我的式子稍微精确点:) 04/08 23:39
8F:推 snowlike:不是喔他是直接去分配灰阶的256个点,小算盘按起来会不同 04/08 23:43
9F:→ VictorTom:你要这麽解释也无所谓, 但是这只是文字描述的观点不同. 04/08 23:45
10F:→ VictorTom:实际上就是RGB以一个比例混合成gray, scale到gray level 04/08 23:46
11F:→ VictorTom:算出来不同, 单纯只是两者精确度不同, 一个计算只要四舍 04/08 23:47
12F:→ VictorTom:五入一次, 跟四舍五入三次, 有误差本来就再所难免:) 04/08 23:48
13F:推 devilrucifer:感谢大大认真回文 专业 谢谢您 04/08 23:57
14F:→ devilrucifer:所以RGB系数随便给都可以吗? 这部分还是不太懂 04/08 23:57
15F:→ devilrucifer:是去查 Color Space 的不同算法吗? 04/08 23:59
16F:→ VictorTom:当然不是随便给, 亮度值的转换有几种常见的计算方式.... 04/09 00:00
17F:→ VictorTom:像#1#2, 印象中是用了人眼感知上, 不同channel的强度对 04/09 00:01
18F:→ VictorTom:亮度造成的感受订出来的, 举例, 我们看纯Green就会觉得 04/09 00:01
19F:→ VictorTom:比纯Red或纯Blue亮; 其他需要亮度(Y/I/L等)的Color 04/09 00:02
20F:→ VictorTom:Space也会有自己的理由决定, 您可以依您的需求选择:) 04/09 00:02
21F:推 devilrucifer:恩恩 有点了解了 小弟会再去查书看看的 04/09 00:04
22F:→ devilrucifer:真的很感谢大大您 04/09 00:04
23F:→ VictorTom:如果没有特别需要, 只是单纯Color->Gray, #2#3颇常见:) 04/09 00:05
24F:推 devilrucifer:小弟会再多看资料的 有问题再跟您请教 感谢您^^ 04/09 00:09
25F:→ VictorTom:www.couleur.org/index.php?page=transformations 04/09 00:10
26F:→ VictorTom:有许多Color Space的资料, 还3D展示给你看:) 04/09 00:10
27F:→ VictorTom:Well~~通常转Gray是Spatial Domain处理的第一步.... 04/09 00:11
28F:→ VictorTom:小弟只是看到Color Space有点high, 您还是忙您的吧^^ 04/09 00:11
29F:推 sbrhsieh:0.299*r+0.587*g+0.114*b,RGB->YUV的Y,黑白电视亮度采Y值 04/09 00:45