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

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日

相关文章

  • ASP.NET设计网络硬盘之两重要类代码

    我可以为您提供关于“ASP.NET设计网络硬盘之两重要类代码”的完整攻略。 概述 在ASP.NET网络硬盘设计中,有两个重要的类可以帮助我们实现文件的上传、下载和管理功能。这两个类是FileUpload和Directory。 FileUpload类 FileUpload类是ASP.NET框架中的一个控件,用于上传文件到Web服务器。使用该控件可以轻松方便地实…

    C# 2023年5月31日
    00
  • C# Equals(Object):确定指定的对象是否等于当前对象

    C# 的 Equals(Object) 方法用于比较两个对象是否相等。它的返回值类型是 bool,如果两个对象相等则返回 true,否则返回 false。 比较对象相等的方式需要根据对象类型的不同而有所调整。在比较值类型时,Equals方法会比较值本身;而在比较引用类型时,Equals方法会比较引用所指向的对象的地址是否相同。如果想比较引用型变量是否相等,需…

    C# 2023年4月19日
    00
  • C#内置泛型委托之Action委托

    当我们在C#中需要定义一个不带参数且没有返回值的委托时,可以使用Action委托来实现。Action委托是一个内置的泛型委托,用于封装一个无参数且无返回值的方法。 Action委托的语法 下面是Action委托的语法: public delegate void Action(); public delegate void Action<in T>…

    C# 2023年6月1日
    00
  • C#6.0新语法示例详解

    C#6.0新语法示例详解攻略 简介 C#6.0是微软为.NET开发者带来的一个重要的版本,其中包含了很多新的语法特性,这些新特性可以让开发者更加方便地书写代码,提高代码的可读性和可维护性。 本篇攻略将会对C#6.0中的一些新语法特性进行详细讲解,包括:Null-conditional运算符、string的插值、nameof表达式、Auto-property初…

    C# 2023年5月15日
    00
  • 深入了解C#设计模式之订阅发布模式

    欢迎来到深入了解C#设计模式之订阅发布模式的完整攻略。本攻略将会带你深入探索这种设计模式,包括其基础知识、应用场景、实现步骤、示例、优缺点等方面。 一、订阅发布模式基础知识 1.1 什么是订阅发布模式? 订阅发布模式(Publish/Subscribe Pattern)是一种事件处理模式,也叫做消息机制或者观察者模式。该模式定义了一种对象间的一对多的关系,让…

    C# 2023年5月15日
    00
  • C# NullReferenceException解决案例讲解

    下面是C#NullReferenceException解决案例讲解的完整攻略: 一、什么是NullReferenceException? NullReferenceException 是 .NET Framework 程序中最常出现的异常类型之一。它通常被抛出,当代码尝试使用一个值为null的对象引用,或者尝试对一个空对象进行访问。这个异常在 C# 程序中很…

    C# 2023年5月14日
    00
  • 基于一个应用程序多线程误用的分析详解

    基于一个应用程序多线程误用的分析详解 研究目的 本研究旨在探究在多线程应用程序开发中常见的误用,分析其原因以及给出解决方案。 误用场景 多线程应用程序开发中,最常见的误用场景之一就是未正确使用锁机制,导致多个线程访问共享资源时出现竞态条件,从而引发意外的程序崩溃或执行异常。在此,我们将对锁机制的误用进行详细分析。 常见的锁机制误用 锁粒度过小 当多个线程对同…

    C# 2023年5月14日
    00
  • C#读取写入文件的3种方式示例代码

    介绍C#读取写入文件的常用方法,下面我们来逐一讲解: 使用File.ReadAllText和File.WriteAllText方法 File.ReadAllText方法可以用于读取指定路径文件中的所有文本,并将所有文本内容作为字符串返回。它有一个参数用于传入文件路径,例如: string text = File.ReadAllText("test.…

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