Skip to main content
Email Password   helpLost your password?

Introduction  

This is an easy algorithm of image transformation from grayscale image to color. It's far from ideal, but it is very simple.

Background

Usually we calculate gray color as:

Gray  = Green * 0.59 + Blue * 0.30 + Red * 0.11;

Each color with structure [Gray, Gray, Gray] has a set of colors:

G = [Gray, Gray, Gray]
G -> P = {C}, for each C from P: Green * 0.59 + Blue * 0.30 + Red * 0.11 = Gray.

First of all, we create a set of control points. Control point is equivalent of "gray" color and "full" color. When we have control points set, we can approximate any "gray" color to "full" color. If "gray" color is located between two control points C1 and C2, then the color approximates as:

K = (Gray - C1Gray)/(C2Gray - C1Gray)
Red = C1Red + K*(C2Red - C1Red)
Green = C1Green + K*(C2Green - C1Green)
Blue = C1Blue + K*(C2.Blue - C1Blue)

Now we has "full color" equivalent for each "gray" color.

scheme_2.jpg

Figure 1. Transformation schema.

Using the Code  

ControlPoint is a structure for storing data about control points.

public struct ControlPoint
{
    private int level;
     public int Level
    {
        get { return level; }
        set { level = value; }
    }
    private Color color;
     public Color Color
    {
        get { return color; }
        set { color = value; }
    }
     public ControlPoint(int level, Color color)
    {
        this.color = color;
        this.level = level;
    }
     public override string ToString()
    {
        return "Level: " + level.ToString() + "; Color: " + color.ToString();
    }
} 

PointsComparer is a class for comparing two control points:

public class PointsComparer: IComparer<ControlPoint>
{
    #region IComparer<ControlPoint> Members
     public int Compare(ControlPoint x, ControlPoint y)
    {
        if (x.Level > y.Level)
        {
            return 1;
        }
        if (x.Level < y.Level)
        {
            return -1;
        }
        return 0;
    }
     #endregion
} 

ColorBuilder is a class for building a color diagram. It returns an array of 256 colors - our diagram.

public static Color[] GetColorDiagram(List<ControlPoint> points)
{
    Color[] colors = new Color[256];
    points.Sort(new PointsComparer());
     for (int i = 0; i < 256; i++)
    {
        ControlPoint leftColor = new ControlPoint
				(0, GetNearestLeftColor(points[0].Color)); 
        ControlPoint rightColor = new ControlPoint
			(255, GetNearestRigthColor(points[points.Count - 1].Color));
        if (i < points[0].Level)
        {
            rightColor = points[0];
        }
        if (i > points[points.Count - 1].Level)
        {
            leftColor = points[points.Count - 1];
        }
        else
        {
            for (int j = 0; j < points.Count - 1; j++)
            {
                if ((points[j].Level <= i) & (points[j + 1].Level > i))
                {
                    leftColor = points[j];
                    rightColor = points[j + 1];
                }
            }
        }
        if ((rightColor.Level - leftColor.Level) != 0)
        {
            double koef = (double)(i - leftColor.Level) / 
			(double)(rightColor.Level - leftColor.Level);
            int r = leftColor.Color.R + (int)(koef * 
			(rightColor.Color.R - leftColor.Color.R));
            int g = leftColor.Color.G + (int)(koef * 
			(rightColor.Color.G - leftColor.Color.G));
            int b = leftColor.Color.B + (int)(koef * 
			(rightColor.Color.B - leftColor.Color.B));
            colors[i] = Color.FromArgb(r, g, b);
        }
        else
        {
            colors[i] = leftColor.Color;
        }
     }
     return colors;
} 

Now we can get the color image:

colorBitmap = new Bitmap(sourceBitmap);
for (int i = 0; i < sourceBitmap.Width; i++)
{
    for (int j = 0; j < sourceBitmap.Height; j++)
    {
        int level = sourceBitmap.GetPixel(i, j).B;
        colorBitmap.SetPixel(i, j, colors[level]);
    }
}
pbxColorImage.Image = colorBitmap;

ColorDialog.JPG

Figure 2. Simple color dialog.

GrayColor.JPG

Figure 3. Grayscale image, color image and color diagram.

Points of Interest  

The algorithms is very easy, and has many defects. But it is a good example for beginners in image processing. 

Update Information

  1. New formula for grayscale level calculation
  2. Bug with empty list was removed
You must Sign In to use this message board.
 
 
Per page   
 FirstPrevNext
Generalgrayscale to color on HSI model Pin
thanh_rio
1:28 27 Jun '09  
GeneralRe: grayscale to color on HSI model Pin
Maxim_Barsuk
20:16 28 Jun '09  
GeneralCouldnt you make it better??? Pin
gonzospy
7:26 1 May '09  
GeneralRe: Couldnt you make it better??? Pin
Maxim_Barsuk
20:45 3 May '09  
GeneralRe: Couldnt you make it better??? Pin
gonzospy
19:25 5 May '09  
GeneralRe: Couldnt you make it better??? [modified] Pin
Maxim_Barsuk
20:08 6 May '09  
GeneralКруто Pin
Laserson
21:44 26 Jan '09  
GeneralRe: Круто Pin
Maxim_Barsuk
5:53 27 Jan '09  
GeneralSomething to go off of.... Pin
Skully1022
5:34 26 Jan '09  
GeneralRe: Something to go off of.... Pin
Maxim_Barsuk
7:10 26 Jan '09  
GeneralRe: Something to go off of.... Pin
MicroImaging
8:13 3 Jun '09  
GeneralMy vote of 2 Pin
MadZookeeper
3:37 26 Jan '09  
Generalwhat about color to grayscale? Pin
bluish
9:26 24 Jan '09  
GeneralRe: what about color to grayscale? Pin
Maxim_Barsuk
20:24 25 Jan '09  
GeneralLuminace from RGB Pin
terrymohre
4:22 25 Nov '08  
GeneralRe: Luminace from RGB Pin
Maxim_Barsuk
6:55 25 Nov '08  
GeneralMy vote of 1 Pin
Christian Wikander
2:59 25 Nov '08  
GeneralWhy? Pin
Christian Wikander
2:58 25 Nov '08  
GeneralBugs Pin
Alexander Yakovlev
2:30 21 Nov '08  
GeneralRe: Bugs Pin
Maxim_Barsuk
6:39 21 Nov '08  
NewsRe: Bugs Pin
thanh_rio
7:55 4 Jun '09  
GeneralRe: Bugs Pin
Maxim_Barsuk
20:08 4 Jun '09  


Last Updated 6 May 2009 | Advertise | Privacy | Terms of Use | Copyright © CodeProject, 1999-2009