Navigation

Related Articles

Back to Latest Articles

C# Tutorial: Contrast Stretching with Normalization


Andraz Krzisnik
C# Tutorial: Contrast Stretching with...

This post is a short revision of Contrast Stretch post we already worked on in the past. Where we talked about histogram equalization, which is a little more complex method than normalization.

What is Normalization?

Normalization in image processing is a process that changes the ranges of intensities in an image. For example let’s say we have a grayscale image which has the lowest intensity value of 50 and the highest the value of 120.

This image appears to be very “washed out”. So to enhance it, we will use normalization technique that will change the intensities’ range from 50 – 120 to 0 – 255.

Normalization takes each pixel and recalculates a new intensity value individually.

Equation for Normalization

Pout = (Pin – c) * (b – a) / (d – c) + a

Where Pout and Pin are variables for pixel values on the output and input of the equation.

b and a represent  values for the new range of intensities we are trying to get (a is the minimum and b is the maximum value).

d and c are the maximum and minimum intensity values of our input image.

Contrast Stretching

As I mentioned before there is already a post on contrast stretching. But I feel the method we are describing here is much easier for those who are still new to image processing.

Although this technique may not be as efficient as the one we already described – histogram equalization, results can still be satisfactory to a certain degree.

Function for demonstration of Normalization

public static Bitmap Normalization(this Bitmap img)
        {
            int w = img.Width;
            int h = img.Height;

            BitmapData sd = img.LockBits(new Rectangle(0, 0, w, h),
                ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
            int bytes = sd.Stride * sd.Height;
            byte[] buffer = new byte[bytes];
            byte[] result = new byte[bytes];
            Marshal.Copy(sd.Scan0, buffer, 0, bytes);
            img.UnlockBits(sd);
            int current = 0;
            byte max = 0;
            byte min = 255;
            for (int i = 0; i < buffer.Length; i++)
            {
                max = Math.Max(max, buffer[i]);
                min = Math.Min(min, buffer[i]);
            }
            for (int y = 0; y < h; y++)
            {
                for (int x = 0; x < w; x++)
                {
                    current = y * sd.Stride + x * 4;
                    for (int i = 0; i < 3; i++)
                    {
                        result[current + i] = (byte)((buffer[current + i] - min) * 100 / (max - min));
                    }
                    result[current + 3] = 255;
                }
            }
            Bitmap resimg = new Bitmap(w, h);
            BitmapData rd = resimg.LockBits(new Rectangle(0, 0, w, h),
                ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
            Marshal.Copy(result, 0, rd.Scan0, bytes);
            resimg.UnlockBits(rd);
            return resimg;
        }

This entire project is available for download here

Related Articles

C# Tutorial

C# Tutorial: How To Scale Images Without Deforming Them

Let’s Get Started A very basic problem that we face in image processing is how to scale images without making them look deformed when we want to make it of an arbitrary...

Posted on by Andraz Krzisnik
Grayscale Morphology

How To Make Top Hat Transformation Work With C#

Top hat transformation is a grayscale morphological operation in image processing, we can use for extraction of certain objects in the image.

Posted on by Andraz Krzisnik