c#中实现图片灰度化技术详解

yizhihongxing

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 |

采用上述卷积核时,处理的方式如下:

  1. 将待处理的图片按照矩阵方式放置;
  2. 对每个像素进行卷积操作,得到一个新的像素值,并将新的像素值赋值给该像素点。

经过矩阵卷积后,得到的结果是一个灰度图。

实现代码示例

像素级操作法

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技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • .net加载失败的程序集实现重新加载

    针对“.Net加载失败的程序集实现重新加载”这个主题,我为您总结了以下完整攻略: 1. 背景介绍 在开发和运行.NET程序时,我们常会遇到程序集加载失败的情况。在这种情况下,我们可以采用重新加载程序集的方法来解决该问题。本文将介绍如何实现重新加载失败的程序集。 2. 实现步骤 步骤1:确定程序集加载失败的原因 在进行重新加载之前,我们需要先确定程序集加载失败…

    C# 2023年5月15日
    00
  • C#高性能动态获取对象属性值的步骤

    下面是关于C#高性能动态获取对象属性值的步骤的完整攻略。 1. 利用反射获取属性信息 在C#中,我们可以使用反射来获取指定对象的属性信息,包括属性的名称、类型、值等。反射是C#编程中的一个重要概念,可以通过System.Reflection命名空间下的Type类、MethodInfo类、PropertyInfo类等相关类型来实现。 示例代码: using S…

    C# 2023年6月1日
    00
  • C# Dynamic之:ExpandoObject,DynamicObject,DynamicMetaOb的应用(上)

    那我开始讲解C# Dynamic之:ExpandoObject,DynamicObject,DynamicMetaObject的应用(上)的完整攻略。 1. 概述 首先,需要了解什么是动态类型,以及为什么需要使用动态类型。在C#中,变量的类型实际上是由编译器推断出来的,也就是静态类型。而动态类型是指在运行时才确定类型的类型。动态类型的主要作用是在不确定类型时…

    C# 2023年5月31日
    00
  • 深入.net调用webservice的总结分析

    《深入.NET调用Web Service的总结分析》是一篇介绍.Net平台下调用Web服务的文章。其内容主要包括Web服务的概念介绍、使用.Net框架下的方式调用Web服务的具体步骤、调用WebService是需要注意的问题等。 概述 Web服务(Web service)是指通过Internet对外提供的可以被远程应用程序调用的程序接口。在.Net平台下可以…

    C# 2023年6月6日
    00
  • C#多线程之线程绑定ThreadLocal类

    当我们在C#中使用多线程时,会涉及到一种问题:多个线程间如何共享数据。在这种情况下,我们可以使用ThreadLocal类。 ThreadLocal类的概述 ThreadLocal类是.NET框架提供的一种线程本地存储机制,它为每个线程提供了单独的存储空间。这意味着,每个线程都可以独立地操作自己的数据,而不会对其他线程的数据造成影响。 ThreadLocal类…

    C# 2023年6月6日
    00
  • OData WebAPI实践-OData与EDM

    本文属于 OData 系列 引言 在 OData 中,EDM(Entity Data Model) 代表“实体数据模型”,它是一种用于表示 Web API 中的结构化数据的格式。EDM 定义了可以由 OData 服务公开的数据类型、实体和关系。 EDM 也提供了一些规则来描述数据模型中的实体之间的关系,例如继承、关联和复合类型。EDM 是 OData 协议的…

    C# 2023年5月11日
    00
  • 使用.Net Core编写命令行工具(CLI)的方法

    使用.Net Core编写命令行工具(CLI)的方法 在.Net Core中,可以使用C#编写命令行工具(CLI),以便在终端中执行各种任务。本攻略将详细介绍使用.Net Core编写命令行工具(CLI)的方法。 步骤 按照以下步骤使用.Net Core编写命令行工具(CLI): 创建一个新的.Net Core控制台应用程序。 dotnet new cons…

    C# 2023年5月16日
    00
  • C#实现老板键功能的代码

    当我们在使用电脑的时候,有时会有别人突然进入房间或者需要临时离开,这个时候我们需要有一个快捷的方式来隐藏当前程序或窗口,以避免别人看到我们的操作内容,这就是所谓的“老板键功能”。下面我来为大家介绍如何使用C#来实现老板键功能的代码。 1. 原理 老板键功能的实现原理是通过监听操作系统的键盘事件,当监听到我们设定的快捷键时,就会触发我们的代码来执行指定的操作,…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部