procedure GrayWorld(var img: TBGRABitmap);
var
p: PBGRAPixel;
pavg: TBGRAPixel;
size:integer;
k:double;
newB, newG, newR: double;
x: integer;
kb,kg,kr: double;
begin
pavg:= img.AveragePixel;
k := 0.299 * pavg.red + 0.587 * pavg.green + 0.114 * pavg.blue;
// This part can differ if you want another weighting
//see https://www.programmersought.com/article/98291796437/
kr:= k / pavg.red ;
kg:= k / pavg.green;
kb:= k / pavg.blue ;
size:= img.Height*img.Width;
//
p:= img.Data;
for x:= 0 to size-1 do begin
newB:= p^.blue * kb;
newG:= p^.green * kg;
newR:= p^.red * kr;
if trunc(newB) > 255 then
p^.blue:= 255
else
p^.blue:= trunc(newB);
if trunc(newG) > 255 then
p^.green:= 255
else
p^.green:= trunc(newG);
if trunc(newR) > 255 then
p^.red:= 255
else
p^.red:= trunc(newR);
inc(p);
end;
end;