200分求购灰度图像的算法(最好有例子)(200分)

  • 主题发起人 主题发起人 lingxin
  • 开始时间 开始时间
这是c++的例子(随手写的,不保证能顺利编译),将RGB24转化为灰度值Y,然后R=G=B=Y,你可在将24位的灰度图转化为8位图
公式:Y=0.299*R+0.587*G+0.114*B

//----------得到RGB的灰度值(Y:0--255)-----------
byte GetYUV_Y(byte R,byte G,byte B)
{
byte result;
result=(byte)((R*299+G*587+B*114)/1000);
return result;

}


//----------------将24 RGB 调整为 24位灰度图-----------------//
void __fastcall AdjRGB2Y(Graphics::TBitmap *RgbBmp)
{
int x,y,i;
byte *SrcP,Y;

for(y=0;y<=RgbBmp->Height-1;y++)
{
SrcP=static_cast<byte *>(RgbBmp->ScanLine[y]);
for(x=0;x<=RgbBmp->Width-1;x++)
{
Y=GetYUV_Y(SrcP[3*x+2]+SrcP[3*x+1]+SrcP[3*x]);
SrcP[3*x]=Y;
SrcP[3*x+1]=Y;
SrcP[3*x+2]=Y;
}
}
}
 
artx感谢你的答案
我试了一下没成功。
帮帮我

 
var
InBmp,OutBmp:TBitmap;
P1,P2:PByteArray;
i,j,j1,j2:Integer;
b:Byte;
begin
InBmp:=TBitmap.Create;
OutBmp:=TBitmap.Create;
try
InBmp.LoadFromFile(InputFileName);
InBmp.PixelFormat:=pf24Bit;
OutBmp.PixelFormat:=pf24Bit;
OutBmp.Width:=InBmp.Width;
OutBmp.Height:=InBmp.Height;
for i:=0 to InBmp.Height-1 do begin
P1:=InBmp.ScanLine; j1:=0;
P2:=OutBmp.ScanLine; j2:=0;
for j:=0 to InBmp.Width-1 do begin
b:=(77*P1[j1]+150*P1[j1+1]+29*P1[j1+2]) shr 8;
P2[j2]:=b;
P2[j2+1]:=b;
P2[j2+2]:=b;
Inc(j1,3); Inc(j2,3);
end;
end;
OutBmp.SaveToFile(OutputFileName);
finally
InBmp.Free;
OutBmp.Free;
end;
end;
 
感谢JohnsonGuo
问题已解决
 
后退
顶部