Io faccio così

codice:
private System.Drawing.Image GrayScaleImage(System.Drawing.Image img){
 int Height = img.Height,Width = img.Width;
 System.Drawing.Bitmap imgBMP = new System.Drawing.Bitmap(img);
 Color _color;

 for (int i=0;i<Width;i++)
  for (int j=0;j<Height;j++){
   _color = imgBMP.GetPixel(i,j);
   int _gray = (_color.R + _color.G + _color.B) / 3;
   imgBMP.SetPixel(i,j,Color.FromArgb(_gray,_gray,_gray));
  }

 return (System.Drawing.Image)imgBMP;
}
ciao.