Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert an image to grayscale

Is there a way to convert an image to grayscale 16 bits per pixel format, rather than setting each of the r,g and b components to luminance. I currently have a bmp from file.

Bitmap c = new Bitmap("filename"); 

I want a Bitmap d, that is grayscale version of c. I do see a constructor that includes System.Drawing.Imaging.PixelFormat, but I don't understand how to use that. I'm new to Image Processing and the relevant C# libraries, but have a moderate experience with C# itself.

Any help, reference to an online source, hint or suggestion will be appreciated.

EDIT: d is the grayscale version of c.

like image 602
0fnt Avatar asked Feb 15 '10 12:02

0fnt


People also ask

How do I convert a color image to grayscale online?

A simple browser-based Joint Photographic Experts Group photo grayscaler. Just paste your JPEG picture in the input area and you will instantly get a grayscale version of this JPEG. Fast, free, and without intrusive ads. Import a color JPG photo, get a grayscale JPG photo.

How do I convert a RGB image to grayscale?

You just have to take the average of three colors. Since its an RGB image, so it means that you have add r with g with b and then divide it by 3 to get your desired grayscale image. Its done in this way.

How do I make grayscale?

To construct your own grayscale, cut a vertical strip of white cardboard and divide into ten equal squares. (Using fewer squares works, too, but it will just compress your value range.) Begin by painting the first square pure black, straight from the tube. Now paint the opposite end pure white.

What happens when you convert an image to grayscale?

For grayscale images, the result is a two-dimensional array with the number of rows and columns equal to the number of pixel rows and columns in the image. Low numeric values indicate darker shades and higher values lighter shades. The range of pixel values is often 0 to 255.


1 Answers

"I want a Bitmap d, that is grayscale. I do see a consructor that includes System.Drawing.Imaging.PixelFormat, but I don't understand how to use that."

Here is how to do this

Bitmap grayScaleBP = new           System.Drawing.Bitmap(2, 2, System.Drawing.Imaging.PixelFormat.Format16bppGrayScale); 

EDIT: To convert to grayscale

             Bitmap c = new Bitmap("fromFile");              Bitmap d;              int x, y;               // Loop through the images pixels to reset color.              for (x = 0; x < c.Width; x++)              {                  for (y = 0; y < c.Height; y++)                  {                      Color pixelColor = c.GetPixel(x, y);                      Color newColor = Color.FromArgb(pixelColor.R, 0, 0);                      c.SetPixel(x, y, newColor); // Now greyscale                  }              }             d = c;   // d is grayscale version of c   

Faster Version from switchonthecode follow link for full analysis:

public static Bitmap MakeGrayscale3(Bitmap original) {    //create a blank bitmap the same size as original    Bitmap newBitmap = new Bitmap(original.Width, original.Height);     //get a graphics object from the new image    using(Graphics g = Graphics.FromImage(newBitmap)){         //create the grayscale ColorMatrix        ColorMatrix colorMatrix = new ColorMatrix(           new float[][]            {              new float[] {.3f, .3f, .3f, 0, 0},              new float[] {.59f, .59f, .59f, 0, 0},              new float[] {.11f, .11f, .11f, 0, 0},              new float[] {0, 0, 0, 1, 0},              new float[] {0, 0, 0, 0, 1}           });         //create some image attributes        using(ImageAttributes attributes = new ImageAttributes()){             //set the color matrix attribute            attributes.SetColorMatrix(colorMatrix);             //draw the original image on the new image            //using the grayscale color matrix            g.DrawImage(original, new Rectangle(0, 0, original.Width, original.Height),                        0, 0, original.Width, original.Height, GraphicsUnit.Pixel, attributes);        }    }    return newBitmap; } 
like image 126
Asad Avatar answered Sep 19 '22 02:09

Asad