电脑上的彩色图像是由rgb构成,而像老照片和黑白电视机采用的是lab色彩空间中的l(亮度)来表示.

下面是c语言的算法:
//---------------------------------------------------------
// Get the Lab value
void RGB2Lab(float R, float G, float B,
float *L, float *a, float *b)
{
double X, Y, Z, fX, fY, fZ;

X = 0.412453*R + 0.357580*G + 0.180423*B;
Y = 0.212671*R + 0.715160*G + 0.072169*B;
Z = 0.019334*R + 0.119193*G + 0.950227*B;

X /= (255 * 0.950456);
Y /= 255;
Z /= (255 * 1.088754);

if (Y > 0.008856)
{
fY = pow(Y, 1.0/3.0);
*L = (float)(116.0*fY - 16.0 + 0.5);
}
else
{
fY = 7.787*Y + 16.0/116.0;
*L = (float)(903.3*Y + 0.5);
}

if (X > 0.008856)
fX = pow(X, 1.0/3.0);
else
fX = 7.787*X + 16.0/116.0;

if (Z > 0.008856)
fZ = pow(Z, 1.0/3.0);
else
fZ = 7.787*Z + 16.0/116.0;

*a = (float)(500.0*(fX - fY) + 0.5);
*b = (float)(200.0*(fY - fZ) + 0.5);

}
//------------------------------------------------------

其实在彩色图像对灰度图的转换过程中只需要计算lab的l值就可以灰度化:

l=(c.G*59+c.R*30+c.B*11)/100

转换只要把每个像素设置成l值就可以了.
下面是灰度图的转换函数(C#语言):
private Bitmap trans(Bitmap bp)
  {
   Bitmap tbmp = new Bitmap(bp);
   for (int i=0; i<bp.Width; i++)
   {
    for (int j=0; j<bp.Height; j++)
    {
     Color c = bp.GetPixel(i,j);
     int n = int((c.G*59+c.R*30+c.B*11)/100);//.toString(16);
     tbmp.SetPixel(i,j,Color.FromArgb(n,n,n));
    }
   }
   return tbmp;
  }
//-----------------------------------------------------------------------------------------------------------
在flash里面使用color滤镜可以方便的对图像灰度化:
//------------------------------------------------------------
import flash.filters.*;
var matrix:Array = [0.3, 0.59, 0.11, 0, 0, 0.3, 0.59, 0.11, 0, 0, 0.3, 0.59, 0.11, 0, 0, 0, 0, 0, 1, 0];
var filter = new ColorMatrixFilter(matrix);
mc.filters = new Array(filter);
//
posted on 2007-07-11 11:08  Thunderdanky  阅读(1248)  评论(0)    收藏  举报