专栏首页ROBOTEDU【简单的CV】1.6 灰度图

【简单的CV】1.6 灰度图

1.6 灰度图

01

灰度的范围

一般在计算机表示灰度的范围在0-255,即一个字节(1byte)

灰度值由255到0的变化

灰度为255时,表示亮度白色。

灰度为0时,表示黑色。

02

RBG转灰度

RBG和灰度是展示图片的两种常用方式

RGB彩色图

GRAY灰度图

RGB是由三个字节组成 R(1byte)\G(1byte)\B(1byte)

GRAY是由一个字节组成GRAY(1byte)

由RGB转GRAY的计算公式:

Gray = R*0.299 + G*0.587 + B*0.114

03

灰度计算公式的由来

三原色光模式(英语:RGB color model),又称RGB颜色模型或红绿蓝颜色模型,是一种加色模型,将红(Red)、绿(Green)、蓝(Blue)三原色的色光以不同的比例相加,以产生多种多样的色光。

实际上一个等量白光并不是由1:1:1的RGB光合成的,根据 国际照明委员会CIE的固定,这个比例更接近3:6:1,也就是我们上面公式的由来。

04

代码实现(来源网络)

        public static Bitmap RgbToGrayScale(Bitmap original)
        {
            if (original != null)
            {
                // 将源图像内存区域锁定
                Rectangle rect = new Rectangle(0, 0, original.Width, original.Height);
                BitmapData bmpData = original.LockBits(rect, ImageLockMode.ReadOnly,
                        PixelFormat.Format24bppRgb);

                // 获取图像参数
                int width = bmpData.Width;
                int height = bmpData.Height;
                int stride = bmpData.Stride;  // 扫描线的宽度,比实际图片要大
                int offset = stride - width * 3;  // 显示宽度与扫描线宽度的间隙
                IntPtr ptr = bmpData.Scan0;   // 获取bmpData的内存起始位置的指针
                int scanBytesLength = stride * height;  // 用stride宽度,表示这是内存区域的大小

                // 分别设置两个位置指针,指向源数组和目标数组
                int posScan = 0, posDst = 0;
                byte[] rgbValues = new byte[scanBytesLength];  // 为目标数组分配内存
                Marshal.Copy(ptr, rgbValues, 0, scanBytesLength);  // 将图像数据拷贝到rgbValues中
                // 分配灰度数组
                byte[] grayValues = new byte[width * height]; // 不含未用空间。
                // 计算灰度数组

                byte blue, green, red, YUI;



                for (int i = 0; i < height; i++)
                {
                    for (int j = 0; j < width; j++)
                    {

                        blue = rgbValues[posScan];
                        green = rgbValues[posScan + 1];
                        red = rgbValues[posScan + 2];
                        YUI = (byte)(0.229 * red + 0.587 * green + 0.144 * blue);
                        //grayValues[posDst] = (byte)((blue + green + red) / 3);
                        grayValues[posDst] = YUI;
                        posScan += 3;
                        posDst++;

                    }
                    // 跳过图像数据每行未用空间的字节,length = stride - width * bytePerPixel
                    posScan += offset;
                }

                // 内存解锁
                Marshal.Copy(rgbValues, 0, ptr, scanBytesLength);
                original.UnlockBits(bmpData);  // 解锁内存区域

                // 构建8位灰度位图
                Bitmap retBitmap = BuiltGrayBitmap(grayValues, width, height);
                return retBitmap;
            }
            else
            {
                return null;
            }
        }

PS:可以在代码中看到图像在计算机内存中实际保存的长度并不是我们一般认为的图像宽*图像长,要略大于这个值,是因为由于显示器的工作原理和芯片工作原理。

小结

1. RBG与灰度的换算

本文分享自微信公众号 - ROBOTEDU(RobotEDU_China),作者:EDEN.CHEN

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 828D运动指令

    828D的基本运动指令 一 行程指令概述 通常加工的工件轮廓的是由一些直线、圆弧和螺旋线组成。为了满足一般的加工要求,我们可以使用下面的运行指令: 1) 快速...

    EdenChen
  • 【简单的CV】2.0 滤波、核与卷积(下)

    这个图就是模糊处理过的图片,大部分模糊的图片给我们感觉都是分辨率不够。所以我们这里的滤波思路就是“降低图像的分辨率”。

    EdenChen
  • 【OpenCV】视觉基础下

    OpenCV官方教程网站:https://docs.opencv.org/3.2.0/d9/df8/tutorial_root.html OpenCV下载链接:...

    EdenChen
  • java安全编码指南之:文件IO操作

    对于文件的IO操作应该是我们经常会使用到的,因为文件的复杂性,我们在使用File操作的时候也有很多需要注意的地方,下面我一起来看看吧。

    程序那些事
  • Android逆向之旅—SO(ELF)文件格式详解–反编译so

    从今天开始我们正式开始Android的逆向之旅,关于逆向的相关知识,想必大家都不陌生了,逆向领域是一个充满挑战和神秘的领域。作为一名android开发者,每个人...

    Java架构师历程
  • ubuntu 下mysql 不显示当前的数据库名解决方法

    如果还要加上时间的话,加--prompt="\u(\d) \R:\m:\s >" 即可

    二狗不要跑
  • Pandas之read_csv()读取文件跳过报错行的解决

    pandas.read_csv(filePath) 方法来读取csv文件时,可能会出现这种错误:

    砸漏
  • 适配器模式与SpringMVC

    适配器模式是将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作...

    java技术爱好者
  • 10万现金奖!Techo大会创意H5火热征集,Serverless 开发者看过来!

    立即体验腾讯云 Serverless Demo,获取 Serverless 新用户礼包,请在 PC 端访问:

    腾讯云serverless团队
  • R语言进阶之判别分析

    R语言的“MASS“包是一个十分强大的统计包,可以进行各种统计分析,我也将围绕它来介绍判别分析。”MASS“包既可以进行线性判别,也可以进行二次判别。除非指定先...

    生信与临床

扫码关注云+社区

领取腾讯云代金券