c#中实现图片灰度化技术详解
什么是图片灰度化?
在计算机图形学中,灰度化是一种将图片从彩色图转化为灰度图的处理过程。灰度图不同于彩色图,它只有黑白两色,其颜色是通过将红色、绿色和蓝色通道加权平均得到的。
实现灰度化的方法
像素级操作法
像素级操作法是一种对图片进行遍历,针对每个像素点单独处理的方法。具体实现是将每个像素点的 R、G、B 通道值按一定权重进行加权平均,从而得到该像素点的灰度值。
例如将红色、绿色、蓝色通道所占权值分别设置为 0.3、0.59、0.11,则某个像素点的灰度值计算公式如下:
灰度值 = R * 0.3 + G * 0.59 + B * 0.11
矩阵法
矩阵法是一种利用数字矩阵对图像进行卷积运算的灰度化方法。它采用 3 x 3 的卷积核对图片进行卷积操作,从而得到灰度图。
卷积核一般采用下面这种方式来设置:
| -1 | -1 | -1 |
| -1 | 8 | -1 |
| -1 | -1 | -1 |
采用上述卷积核时,处理的方式如下:
- 将待处理的图片按照矩阵方式放置;
- 对每个像素进行卷积操作,得到一个新的像素值,并将新的像素值赋值给该像素点。
经过矩阵卷积后,得到的结果是一个灰度图。
实现代码示例
像素级操作法
Bitmap bmp = new Bitmap("image.jpg");
for (int i = 0; i < bmp.Width; i++)
{
for (int j = 0; j < bmp.Height; j++)
{
Color color = bmp.GetPixel(i, j);
int grayValue = (int)(color.R * 0.3 + color.G * 0.59 + color.B * 0.11);
Color newColor = Color.FromArgb(color.A, grayValue, grayValue, grayValue);
bmp.SetPixel(i, j, newColor);
}
}
bmp.Save("grayImage.jpg");
上述代码使用像素级操作法实现了图片的灰度化。
矩阵法
Bitmap bmp = new Bitmap("image.jpg");
int[,] matrix = new int[3, 3]{
{-1, -1, -1},
{-1, 8, -1},
{-1, -1, -1}
};
BitmapData bmData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int stride = bmData.Stride;
System.IntPtr Scan0 = bmData.Scan0;
unsafe
{
byte* p = (byte*)(void*)Scan0;
int nOffset = stride - bmp.Width * 3;
for (int y = 0; y < bmp.Height - 2; ++y)
{
for (int x = 0; x < bmp.Width - 2; ++x)
{
int grayValue =
matrix[0, 0] * (p + y * stride + x * 3)[0] +
matrix[0, 1] * (p + y * stride + x * 3 + 3)[0] +
matrix[0, 2] * (p + y * stride + x * 3 + 6)[0] +
matrix[1, 0] * (p + (y + 1) * stride + x * 3)[0] +
matrix[1, 1] * (p + (y + 1) * stride + x * 3 + 3)[0] +
matrix[1, 2] * (p + (y + 1) * stride + x * 3 + 6)[0] +
matrix[2, 0] * (p + (y + 2) * stride + x * 3)[0] +
matrix[2, 1] * (p + (y + 2) * stride + x * 3 + 3)[0] +
matrix[2, 2] * (p + (y + 2) * stride + x * 3 + 6)[0];
if (grayValue > 255)
{
grayValue = 255;
}
if (grayValue < 0)
{
grayValue = 0;
}
(p + (y + 1) * stride + x * 3 + 1)[0] = (byte)grayValue;
(p + (y + 1) * stride + x * 3 + 2)[0] = (byte)grayValue;
(p + (y + 1) * stride + x * 3)[0] = (byte)grayValue;
}
}
}
bmp.UnlockBits(bmData);
bmp.Save("grayImage.jpg");
上述代码使用矩阵法实现了图片的灰度化。
总结
实现图片灰度化主要有两种方法:像素级操作法和矩阵法。像素级操作法的代码相对简单,但是速度较慢;矩阵法的代码相对复杂,但是速度较快。针对不同的应用场景选择不同的方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c#中实现图片灰度化技术详解 - Python技术站