12,505,902 members (55,570 online)
alternative version

72.8K views
58 bookmarked
Posted

# Image Transformation: Grayscale to Color

, 6 May 2009 CPOL
 Rate this:
Algorithm for easy transformation images

## 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 - C1<sub>Gray</sub>

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

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;

Figure 2. Simple color dialog.

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

## Share

 Software Developer Russian Federation
Hello! My name is Maxim Subbotin.

Now I work in sphere of web-development. I'm interesting researches in SEO field.
If you interesting, you can see this tool:

KeywordCompetitor

## You may also be interested in...

 Pro Pro

 First Prev Next
 about algorithm Norhaat18-Dec-11 13:44 Norhaat 18-Dec-11 13:44
 grayscale to color on HSI model thanh_rio27-Jun-09 0:28 thanh_rio 27-Jun-09 0:28
 Re: grayscale to color on HSI model Maxim_Barsuk28-Jun-09 19:16 Maxim_Barsuk 28-Jun-09 19:16
 Couldnt you make it better??? gonzospy1-May-09 6:26 gonzospy 1-May-09 6:26
 Re: Couldnt you make it better??? Maxim_Barsuk3-May-09 19:45 Maxim_Barsuk 3-May-09 19:45
 Re: Couldnt you make it better??? gonzospy5-May-09 18:25 gonzospy 5-May-09 18:25
 Re: Couldnt you make it better??? [modified] Maxim_Barsuk6-May-09 19:08 Maxim_Barsuk 6-May-09 19:08
 Круто Laserson26-Jan-09 20:44 Laserson 26-Jan-09 20:44
 Re: Круто Maxim_Barsuk27-Jan-09 4:53 Maxim_Barsuk 27-Jan-09 4:53
 Something to go off of.... Skully102226-Jan-09 4:34 Skully1022 26-Jan-09 4:34
 Re: Something to go off of.... Maxim_Barsuk26-Jan-09 6:10 Maxim_Barsuk 26-Jan-09 6:10
 Re: Something to go off of.... MicroImaging3-Jun-09 7:13 MicroImaging 3-Jun-09 7:13
 Re: My vote of 2 Afzaal Ahmad Zeeshan3-Sep-15 3:55 Afzaal Ahmad Zeeshan 3-Sep-15 3:55
 what about color to grayscale? bluish24-Jan-09 8:26 bluish 24-Jan-09 8:26
 Re: what about color to grayscale? Maxim_Barsuk25-Jan-09 19:24 Maxim_Barsuk 25-Jan-09 19:24
 Luminace from RGB terrymohre25-Nov-08 3:22 terrymohre 25-Nov-08 3:22
 Re: Luminace from RGB Maxim_Barsuk25-Nov-08 5:55 Maxim_Barsuk 25-Nov-08 5:55
 My vote of 1 Christian Wikander25-Nov-08 1:59 Christian Wikander 25-Nov-08 1:59
 Why? Christian Wikander25-Nov-08 1:58 Christian Wikander 25-Nov-08 1:58
 Bugs Alexander Yakovlev21-Nov-08 1:30 Alexander Yakovlev 21-Nov-08 1:30
 Re: Bugs Maxim_Barsuk21-Nov-08 5:39 Maxim_Barsuk 21-Nov-08 5:39
 Re: Bugs thanh_rio4-Jun-09 6:55 thanh_rio 4-Jun-09 6:55
 Re: Bugs Maxim_Barsuk4-Jun-09 19:08 Maxim_Barsuk 4-Jun-09 19:08
 Last Visit: 31-Dec-99 18:00     Last Update: 27-Sep-16 11:27 Refresh 1