Image(x,y) = 0.3 * Image_R(x,y) +0.59 * Image_G(x,y)+ 0.11 * Image_B(x,y)
几个加权系数0.3,0.59,0.11是根据人的亮度感知系统调节出来的参数,是个广泛使用的标准化参数。
///
/// 图像灰度化算法(加权)
///
/// 输入图像
/// 输出图像
public static void ToGray(Bitmap inputBitmap,ref Bitmap outputBitmap)
{
for (int i = 0; i < inputBitmap.Width; i++)
{
for (int j = 0; j < inputBitmap.Height; j++)
{
Color color = inputBitmap.GetPixel(i, j); //在此获取指定的像素的颜色
int gray = (int)(color.R * 0.3 + color.G * 0.59 + color.B * 0.11);
Color newColor = Color.FromArgb(gray, gray, gray);
//设置指定像素的颜色 参数:坐标x,坐标y,颜色
inputBitmap.SetPixel(i, j, newColor);
}
}
outputBitmap = inputBitmap;
}
Image(x,y) = 1/3 * Image_R(x,y) +1/3 * Image_G(x,y)+ 1/3 * Image_B(x,y)
将同一个像素位置3个通道RGB的值进行平均。
///
/// 图像灰度化算法(平均)
///
/// 输入图像
/// 输出图像
public static void ToGray(Bitmap inputBitmap, ref Bitmap outputBitmap)
{
for (int i = 0; i < inputBitmap.Width; i++)
{
for (int j = 0; j < inputBitmap.Height; j++)
{
Color color = inputBitmap.GetPixel(i, j); //在此获取指定的像素的颜色
int gray = (int)(color.R * (1.0 / 3.0) + color.G * (1.0 / 3.0) + color.B * (1.0 / 3.0));
Color newColor = Color.FromArgb(gray, gray, gray);
//设置指定像素的颜色 参数:坐标x,坐标y,颜色
inputBitmap.SetPixel(i, j, newColor);
}
}
outputBitmap = inputBitmap;
}
Image(x,y) = 0.5( max(Image_R(x,y), Image_G(x,y), Image_B(x,y))+ min(Image_R(x,y), Image_G(x,y), Image_B(x,y)))
取同一个像素位置的RGB中亮度最大的和最小的进行平均。
///
/// 图像灰度化算法(最大最小平均)
///
/// 输入图像
/// 输出图像
public static void ToGray(Bitmap inputBitmap, ref Bitmap outputBitmap)
{
for (int i = 0; i < inputBitmap.Width; i++)
{
for (int j = 0; j < inputBitmap.Height; j++)
{
Color color = inputBitmap.GetPixel(i, j); //在此获取指定的像素的颜色
List<int> ts = new List<int>() { color.R,color.B,color.G};
ts.Sort(); //排序
int gray = (int)(0.5 * (ts[0] + ts[2])); //最大最小的取平均
Color newColor = Color.FromArgb(gray, gray, gray);
//设置指定像素的颜色 参数:坐标x,坐标y,颜色
inputBitmap.SetPixel(i, j, newColor);
}
}
outputBitmap = inputBitmap;
}
Image(x,y) = 1/3 (255 - (Image_R(x,y) + Image_G(x,y)+ Image_B(x,y)))
///
/// 灰度图像反转
///
/// 输入图像
/// 输出图像
public static void GrayReversal(Bitmap inputBitmap, ref Bitmap outputBitmap)
{
for (int i = 0; i < inputBitmap.Width; i++)
{
for (int j = 0; j < inputBitmap.Height; j++)
{
Color color = inputBitmap.GetPixel(i, j); //在此获取指定的像素的颜色
int gray =(int)((255-color.R + 255-color.G + 255-color.B)/3);
Color newColor = Color.FromArgb(gray, gray, gray);
//设置指定像素的颜色 参数:坐标x,坐标y,颜色
inputBitmap.SetPixel(i, j, newColor);
}
}
outputBitmap = inputBitmap;
}
将灰度图像中低于该值的全都到转为为0,高于该值的全都转换为255。
///
/// 图像二值化:取图片的阈值,低于该值的全都为0,高于该值的全都为255
///
/// 输入图像
/// 阈值
/// 输出图像
///
public static void ConvertTo1Bpp(Bitmap bmp, int iss, ref Bitmap outputBmp)
{
for (int i = 0; i < bmp.Width; i++)
{
for (int j = 0; j < bmp.Height; j++)
{
//获取该点的像素的RGB的颜色
Color color = bmp.GetPixel(i, j);
int value = 255 - color.B;
Color newColor = value > iss ? Color.FromArgb(0, 0, 0) : Color.FromArgb(255,
255, 255);
bmp.SetPixel(i, j, newColor);
}
}
outputBmp = bmp;
}