Home ? Source Code ? Image Transformation: Grayscale to Color

Image Transformation: Grayscale to Color

maninwest
2015-02-09 02:49:11
The author
View(s):
Download(s): 0
Point (s): 1?
Category Category:
.NET2.0.NET2.0 C SharpC#

Description


Translated by  [email protected]  Author:Maxim_Barsuk @ Codeproject
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;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.
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
{ #region IComparer 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 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;



Sponsored links

File list

Tips: You can preview the content of files by clicking file names^_^
Name Size Date
ColorTransformApp.sln941.00 B2009-01-26 08:44
ColorTransformApp.suo17.00 kB2009-01-26 09:11
01.96 kB
01.96 kB
01.96 kB
ColorTransformApp.exe12.50 kB2009-01-26 09:12
ColorTransformApp.vshost.exe13.99 kB2009-01-26 09:13
ColorToGrayscle.cs1.76 kB2009-01-26 09:10
ColorTransformApp.csproj3.72 kB2009-01-26 09:02
MainForm.cs1.50 kB2009-01-26 09:12
MainForm.Designer.cs9.13 kB2009-01-26 09:05
MainForm.resx6.07 kB2009-01-26 09:05
Program.cs512.00 B2009-01-26 08:44
01.96 kB
AssemblyInfo.cs1.43 kB2009-01-26 08:44
Resources.Designer.cs2.80 kB2009-01-26 08:44
Resources.resx5.48 kB2009-01-26 08:44
Settings.Designer.cs1.08 kB2009-01-26 08:44
Settings.settings249.00 B2009-01-26 08:44
...
Sponsored links

Comments

(Add your comment, get 0.1 Point)
Minimum:15 words, Maximum:160 words
  • 1
  • Page 1
  • Total 1

Image Transformation: Grayscale to Color (27.34 kB)(70.43 kB)

Need 1 Point(s)
Your Point (s)

Your Point isn't enough.

Get 22 Point immediately by PayPal

Point will be added to your account automatically after the transaction.

More(Debit card / Credit card / PayPal Credit / Online Banking)

Submit your source codes. Get more Points

LOGIN

Don't have an account? Register now
Need any help?
Mail to: [email protected]

切換到中文版?

CodeForge Chinese Version
CodeForge English Version

Where are you going?

^_^"Oops ...

Sorry!This guy is mysterious, its blog hasn't been opened, try another, please!
OK

Warm tip!

CodeForge to FavoriteFavorite by Ctrl+D
全民欢乐捕鱼攻略技巧 百威娱乐的网址是多少 欢乐斗地主如何组队玩 重庆吋时彩五星个位走势图 豪牛娱乐怎么进不去 大赢家即时比分直 环球国际娱乐真人 二人斗地主棋牌平台 星际彩票平台怎么样 重庆时时开奖直播 老时时开奖号码 北京pk10计划软件 北京pk拾历史开奖结果 pk10赛车345678技巧 斗牛明牌4张技巧概率 期期期准幸运飞艇计划 吉祥棋牌下载