C#,彩色图片转为灰度图的快速算法与源代码

news2024/10/5 14:23:05

彩色图转为灰度图的场景非常多,比如人工智能的训练与识别时,需要将彩色图片转为灰度图。

以下文字来自于:

彩色图像转灰度图像原理python_蜗牛的笨笨的博客-CSDN博客_python 彩色图转灰度图现在我们所接触到的图像绝大多数都是数字图像,图像数字化后,每个像素点就可以看作是一个小方格,每个小方格里面存储的就是图像的像素信息。如果把一副数字图像抽象出来,就是一个二维矩阵(灰度图)或者三维矩阵(彩色图)。任何颜色都有红、绿、蓝三原色组成。用红、绿、蓝三元组的二维矩阵来表示(这样构成了三个通道),抽象出来一起构成了一个三维数组。https://blog.csdn.net/qq_44820108/article/details/121702791

数字图像
数字化的图像,实际上是一个网格(数组)。每个网格点存储图像的像素信息。如果把一副数字图像抽象出来,就是一个二维矩阵(灰度图)或者三维矩阵(彩色图)。

彩色图像
一般意义上,颜色都由红Red、绿Green、蓝Blue三原色组成。用红、绿、蓝三元组的二维矩阵来表示(这样构成了三个通道),抽象出来一起构成了一个三维数组。三元组的每个数值也是在0-255之间,0表示相应的基色在该像素中没有,而255表示相应的基色在该像素中取得最大值。通过调节每个通道数灰度值的亮度,从而对三个通道中的三种基色进行不同搭配,进而构成了五颜六色的彩色世界!

灰度图像
每个像素的亮度用一个数值来表示,取值范围0-255,0表示黑、255表示白,其他值表示处于黑白之间的灰度,抽象出来构成了一个二维数组。灰度图像就没有色彩了,他的颜色是介于黑色到白色。255表示白色,0表示黑色,灰度等级处于之间就表示成不同等级的灰色。

图像转换
彩色图像转换成灰度图像最基本的就是考虑怎么去分配三个通道里面的灰度等级,如果单纯直接将R通道里面的灰度值全部拿出来,会构成一个灰度图像。

通过以下几种方法来转换彩色图像的三个通道的灰度值:

浮点算法:Gray=0.299R+0.587G+0.114B
整数方法:Gray=(R30+G59+B*11)/100
移位方法:Gray=(R28+G151+B*77)>>8
平均值法:Gray=(R+G+B)/3

上面公式中的R、G、B表示这三个通道里面的灰度值。对不同通道里的灰度值进行加权,加权后得到的灰度值就是我们转换后的灰度图的灰度值,所以这样得到的灰度图像更符合我们人眼的直观映像。转换后存到对应的二维数组里面,这个数组就是转换后的灰度图像抽象意义上的二维数组,显示出来就是一副灰度图像。
 

以下代码是经过实践检验的,可用:

using System;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;

namespace Legalsoft.Truffer
{
    public static class BitmapHelper
    {
        /// <summary>
        /// 彩色图片转为灰度图的快速算法
        /// </summary>
        /// <param name="bmp"></param>
        private static void QuickToGrayImage(Bitmap bmp)
        {
            Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
            BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
            IntPtr ptr = bmpData.Scan0;
            int bytes = bmpData.Stride * bmpData.Height;
            byte[] data = new byte[bytes];
            Marshal.Copy(ptr, data, 0, bytes);
            int zz = 0;
            for (int y = 0; y < bmpData.Height; y++)
            {
                for (int x = 0, zn = zz; x < bmpData.Width; x++)
                {
                    int gray = (int)(data[zn + 2] * 0.299 + data[zn + 1] * 0.587 + data[zn] * 0.114);
                    byte ct = (byte)((gray > 254) ? 255 : (gray < 1) ? 0 : (byte)(gray));
                    data[zn + 2] = data[zn + 1] = data[zn] = ct;
                    zn += 3;
                }
                zz += bmpData.Stride;
            }
            Marshal.Copy(data, 0, ptr, bytes);
            bmp.UnlockBits(bmpData);
        }

        /// <summary>
        /// 彩色图片转为灰度图的原始算法
        /// </summary>
        /// <param name="bmp"></param>
        private static void ToGrayImage(Bitmap bmp)
        {
            for (int y = 0; y < bmp.Height; y++)
            {
                for (int x = 0; x < bmp.Width; x++)
                {
                    Color cc = bmp.GetPixel(x, y);
                    int cx = Math.Min(255, (int)(cc.R * 0.299 + cc.G * 0.587 + cc.B * 0.114));
                    bmp.SetPixel(x, y, Color.FromArgb(cx, cx, cx));
                }
            }
        }
    }
}

B-21?

更期待 H-20

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/59358.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]计算机毕业设计springboot疫情背景下社区互助服务系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

u-boot常用命令

u-boot常用命令查看u-boot所支持的命令查询命令u-boot版本环境变量板子相关信息环境变量操作内存操作网络操作EMMC和 SD卡操作FAT 格式文件系统操作EXT格式文件系统操作ubi格式文件系统操作boot 操作bootzbootmbootUMS 命令常用其他uboot环境变量&#xff1a;bootcmd和bootargs…

python基础语法15-网络编程理论

网络编程是指在程序中实现两台计算机之间的通信。 Python提供了大量的内置模块和第三方模块用于支持各种网络访问&#xff0c;而且Python语言在网络通信方面的优点特别突出&#xff0c;远远领先其他语言。 一、IP: 1.概念&#xff1a; IP:互联网协议地址(Internet Protocol Add…

CCNA-应试教育-思科网院-CCNAv7: Switching, Routing, and Wireless Essentials 交换、路由和无线基础。

CCNA-应试教育-思科网院-CCNAv7: Switching, Routing, and Wireless Essentials 交换、路由和无线基础。 拓扑 – SRWE 最终 PT 技能评估 &#xff08;PTSA&#xff09; 拓扑图这样连 题目 SRWE Final PT Skills Assessment (PTSA) A few things to keep in mind while co…

大淘营淘宝复制的“添加、删除、替换属性”功能如何使用?

一、添加属性添加属性填写的格式为“属性名称:属性值”&#xff0c;“”是添加的意思。举个例子&#xff0c;比如我要添加的属性为“AA”&#xff0c;属性值为“aa”&#xff0c;那么&#xff0c;在软件上需要填“AA:aa”。注&#xff1a;“:”是半角字符&#xff0c;中间不要有…

嵌入式 程序调试之gdb和gdbserver的交叉编译及使用

嵌入式 程序调试之gdb和gdbserver的交叉编译及使用 一、简述 记--交叉编译gdb、gdbserver并调试嵌入式程序。 gdb是功能非常强大的常用调试工具&#xff0c;可以直接下断点进行单步调试&#xff0c;是差错排错的利器。 常见三种不同使用场景的gdb: x86 pc端gdb&#xff08;以下…

MyBatis ---- 自定义映射resultMap

MyBatis ---- 自定义映射resultMap1. resultMap处理字段和属性的映射关系2. 多对一映射处理a>级联方式处理映射关系b>使用association处理映射关系c>分布查询3. 一对多映射处理a>collectionb>分步查询1. resultMap处理字段和属性的映射关系 当实体类中的属性名…

一文详解数据链路相关技术

一文详解数据链路相关技术1.MAC地址2.共享介质型网络争用方式令牌传递3.非共享介质网络4.环路检测技术生成树方式源路由法5.VLAN1.MAC地址 MAC地址直译为媒体存取控制位址&#xff0c;也称为局域网地址&#xff08;LAN Address&#xff09;&#xff0c;MAC位址&#xff0c;以太…

云服务器使用及Linux基本命令

文章目录前言一、Linux1.Linux发现版本2.Linux环境搭建方式云服务器使用终端软件连接Linux3.Linux基础命令&#xff08;1&#xff09;ls:列出该目录下的所有子目录与文件。&#xff08;2&#xff09;pwd&#xff1a;显示当前所在用户&#xff08;3&#xff09;cd &#xff1a;改…

终于来了

程序员求职简历&#xff0c;项目经验怎么写&#xff1f;免费修改简历、提供模板并内部推荐昨天我还在说"三年了&#xff0c;乌云还未散尽&#xff0c;仿佛若有光"。今天一大早&#xff0c;光就照进来了。深圳卫健委宣布公交、地铁、药店、公园、旅游景点等场所都不需…

数据结构(王卓)(4)附:链表的销毁与清空

销毁 Status 销毁单链表(LinkList L) {LinkList p;while (L){p L;L->next;delete p;}return OK; } 运行逻辑&#xff1a; &#xff08;1&#xff09;:设定一个指针&#xff0c;让指针指向链表的头指针L &#xff08;2&#xff09;&#xff1a;让头指针等于头指针里面指向下…

Session和Cookie

回顾 1.Servlet API 2.HttpServlet DoXXX处理哪种Http方法会调用到对应的方法 init/destroy/service—>servlet的生命周期 3.HttpServletRequest Http请求 get系列方法 协议名&#xff08;版本号&#xff09; url query string header query String/body HttpServletRespon…

【配准和融合相互作用,交互】

RFNet: Unsupervised Network for Mutually Reinforcing Multi-modal Image Registration and Fusion &#xff08;RFNet&#xff1a;一种互增强的多模态图像配准与融合的无监督网络&#xff09; 本文提出了一种在相互增强的框架RFNet中实现多模态图像配准与融合的新方法。我们…

第八章 集成学习

8.1 个体与集成 集成学习通过构建并结合多个学习器来完成学习任务&#xff0c;有时也被称为多分类系统、基于委员会的学习等。 下图显示出集成学习的一般结构&#xff1a;先产生一组个体学习器&#xff0c;再用某种策略将它们结合起来。个体学习器通常由一个现有的学习算法从训…

Redis实战——分布式锁

目录 1 一人一单并发安全问题 2 分布式锁的原理和实现 2.1 什么是分布式锁&#xff1f; 2.2 分布式锁的实现 1 一人一单并发安全问题 之前一人一单的业务使用的悲观锁&#xff0c;在分布式系统下&#xff0c;是无法生效的。 理想的情况下是这样的&#xff1a;一个线程成功…

计算机中数的表示和运算

定点数 编程时需要确定小数点位置难以表示两个大小相差较大的数存储空间利用率低 这种用二进制来表示十进制的编码方式&#xff0c;叫作BCD 编码&#xff08;Binary-Coded Decimal&#xff09;。 浮点数 小数点的位置可以左右移动的数 规格化浮点数: IEEE 754规格化的尾数…

基于Java+Swing+Mysql实现《黄金矿工》游戏

基于JavaSwingMysq实现《黄金矿工》游戏一、系统介绍二、功能展示三、其他系统一、系统介绍 《黄金矿工》游戏是一个经典的抓金子小游戏&#xff0c;它可以锻炼人的反应能力。。该游戏中&#xff0c;可以通过“挖矿”获得积分&#xff0c;游戏道具&#xff1a;有3瓶药水&#…

cubeIDE开发, 如何结合FreeRTOS开发STM32程序

一、STM32CubeIDE使用内置的FreeRTOS 不同于STM32CubeIDE使用像RTThread这些第三方物联网系统&#xff0c;STM32CubeIDE在安装时就已经在MiddleWare中间件一栏直接支持了FreeRTOS操作系统。 既然STM32CubeIDE已经把FreeRTOS深度整合到了自家的系统中&#xff0c;所以移植及使用…

深度学习中的正则化——L1、L2 和 Dropout

正则化是一组技术&#xff0c;可以防止神经网络中的过度拟合&#xff0c;从而在面对来自问题域的全新数据时提高深度学习模型的准确性。 在本文中&#xff0c;我们将介绍最流行的正则化技术&#xff0c;称为 L1、L2 和 dropout。 文章目录1. 回顾&#xff1a;过拟合2.什么是正则…

【并发编程】AQS ReentrantLock 底层实现原理

一、概述 synchronized上锁机制是通过对象头来实现的&#xff0c;通过锁升级的过程来完成加锁。&#xff08;https://blog.csdn.net/zhangting19921121/article/details/106002751&#xff09; 但是synchronized锁升级的过程犹如一个黑盒&#xff0c;我们无法掌控。因此&…