图像的灰度化原理和实现

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

http://blog.csdn.net/hnney/archive/2009/05/18/4194408.aspx

图像的灰度化原理和实现

将彩色图像转化成为灰度图像的过程成为图像的灰度化处理 。彩色图像中的每个像素的颜色有R、G、B三个分量决定,而每个分量有255中值可取,这样一个像素点可以有1600多万(255*255*255)的颜色的变化范围。而灰度图像是R、G、B三个分量相同的一种特殊的彩色图像 ,其一个像素点的变化范围为255种,所以在数字图像处理种一般先将各种格式的图像转变成灰度图像以使后续的图像的计算量变得少一些灰度图像的描述与彩色图像一样仍然反映了整幅图像的整体和局部的色度和亮度等级的分布和特征 。图像的灰度化处理可用两种方法来实现。

第一种方法使求出每个像素点的R、G、B三个分量的平均值,然后将这个平均值赋予给这个像素的三个分量。

第二种方法是根据YUV的颜色空间中,Y的分量的物理意义是点的亮度,由该值反映亮度等级,根据RGB和YUV颜色空间的变化关系可建立亮度Y与R、G、B三个颜色分量的对应:Y=0.3R+0.59G+0.11B ,以这个亮度值表达图像的灰度值。

 

// c++ 实现代码

BOOL RGBToGray(BYTE *pData,int iWidth,int iHeight,int iDepth)
{
    BYTE red,green,blue;
    BYTE grey;

    if(iDepth != 3 && iDepth != 4)
    {
        return FALSE;
    }
   
    for(int j=0;j < iHeight;j++)
    {
        for(int i=0;i < iWidth;i++)
        {
            blue = *(pData + j*iWidth*iDepth+i*iDepth);
            green = *(pData + j*iWidth*iDepth+i*iDepth + 1);
            red = *(pData + j*iWidth*iDepth+i*iDepth + 2);

            grey = (BYTE)((float)(red*0.299+green*0.587+blue*0.114));
           
            // 转换后 RGB三个分量的值相等
            *(pData + j*iWidth*iDepth+i*iDepth) = grey;
            *(pData + j*iWidth*iDepth+i*iDepth + 1) = grey;
            *(pData + j*iWidth*iDepth+i*iDepth + 2) = grey;
        }
    }

    return TRUE;
}

 

 

// 256色bmp转灰度图代码

/****************************************************************
* 函数名称:
*      Convert256toGray()
*
* 参数:
*     HDIB hDIB     -图像的句柄
*
*  返回值:
*        无
*
*  功能:
*     将256色位图转化为灰度图
*
***************************************************************/
void Convert256toGray(HDIB hDIB)
{
    LPSTR    lpDIB;   
    // 由DIB句柄得到DIB指针并锁定DIB
    lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)hDIB);   
    // 指向DIB象素数据区的指针
    LPSTR   lpDIBBits;   
    // 指向DIB象素的指针
    BYTE *    lpSrc;   
    // 图像宽度
    LONG    lWidth;   
    // 图像高度
    LONG      lHeight;
    // 图像每行的字节数
    LONG    lLineBytes;   
    // 指向BITMAPINFO结构的指针(Win3.0)
    LPBITMAPINFO lpbmi;   
    // 指向BITMAPCOREINFO结构的指针
    LPBITMAPCOREINFO lpbmc;   
    // 获取指向BITMAPINFO结构的指针(Win3.0)
    lpbmi = (LPBITMAPINFO)lpDIB;
    // 获取指向BITMAPCOREINFO结构的指针
    lpbmc = (LPBITMAPCOREINFO)lpDIB;   

    // 灰度映射表
    BYTE bMap[256];
   
    // 计算灰度映射表(保存各个颜色的灰度值),并更新DIB调色板
    int    i,j;
    for (i = 0; i < 256; i ++)
    {
        // 计算该颜色对应的灰度值
        bMap[i] = (BYTE)(0.299 * lpbmi->bmiColors[i].rgbRed +

                         0.587 * lpbmi->bmiColors[i].rgbGreen +

                         0.114 * lpbmi->bmiColors[i].rgbBlue + 0.5);           
        // 更新DIB调色板红色分量
        lpbmi->bmiColors[i].rgbRed = i;   
       
        // 更新DIB调色板绿色分量
        lpbmi->bmiColors[i].rgbGreen = i;   
       
        // 更新DIB调色板蓝色分量
        lpbmi->bmiColors[i].rgbBlue = i;
           
        // 更新DIB调色板保留位
        lpbmi->bmiColors[i].rgbReserved = 0;

    }
    // 找到DIB图像象素起始位置
    lpDIBBits = ::FindDIBBits(lpDIB);
       
    // 获取图像宽度
    lWidth = ::DIBWidth(lpDIB);   

    // 获取图像高度
    lHeight = ::DIBHeight(lpDIB);   

    // 计算图像每行的字节数
    lLineBytes = WIDTHBYTES(lWidth * 8);   

    // 更换每个象素的颜色索引(即按照灰度映射表换成灰度值)
    //逐行扫描
    for(i = 0; i < lHeight; i++)
    {
        //逐列扫描
        for(j = 0; j < lWidth; j++)
        {
            // 指向DIB第i行,第j个象素的指针
            lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;                   
            // 变换
            *lpSrc = bMap[*lpSrc];
        }
    }

    //解除锁定
    ::GlobalUnlock ((HGLOBAL)hDIB);
}

 

 

// 相关工程文件

看我的资源

http://cay22.download.csdn.net/

[Python图像处理] 十四.基于OpenCV像素处理的图像灰度化处理 本篇文章讲解图像灰度化处理的知识,结合OpenCV调用cv2.cvtColor()函数实现图像灰度操作,使用像素处理方法对图像进行灰度化处理。基础性知识希望对您有所帮助。 1.图像灰度化原理 2.基于OpenCV的图像灰度化处理 3.基于像素操作的图像灰度化处理 阅读详情

相关推荐

图像像素理解浅谈

在计算机中,这些属性都用数字来表示。下面以一张灰度图作为例子。灰度图是单通道图,像素只有一个值:灰度值。灰度值越高,则图像越亮。 灰度图 现在我们已经知道我们看到一张灰度图是由许多不同灰度值的像素点构成,而每个像素就是一个越亮的像素,灰度值越高,最高值是255(白色),越暗的像素,灰度值越低,最低值是0(黑色)。灰度值在0~255之间的像素呈现不同程度的灰色。这样,通过不同的灰度层次,图像也就展现出来了。 我们已经知道我们看到一张灰度图是由许多不...

追光少年的博客 4317

灰度图的理解(主要在作图像的方面遇到了问题)

灰度图中一点我的误区: 我以为灰度图是彩色图的一种,但是查找后发现灰度图是单通道的: 通道数问题 描述一个像素点,如果是灰度,那么只需要一个数值来 描述它,就是单通道。 如果一个像素点,有RGB三种颜色来描述它,就是三通道。 而四通道图像,就是R、G、B加上一个A通道,表示透明度。一般叫做alpha通道,表示透明度的。 ...

kekeshu_k的博客 1348

灰度图原理色值范围

灰度图原理色值范围

u013168615的专栏 8029

图像处理】灰度映射(Gray Level Transformation)

灰度映射的本质就是将一个灰度值(根据公式)映射为另一个灰度值。公式根据实际需要随你编,以下是几种常用的公式。如图所示: 1.恒等变换:没变化,仅作参考。 2.反转变换:S = L - 1 - x;底片效果。 3.对数变换:S = c * log(1+r);log(1+r)函数为正值,系数c保证了S属于[0, L-1]。窄域映射宽域,宽域映射窄域。 (1)正对数变换:窄变宽,亮域变暗。

kerecs的博客 1万+

图像灰度化处理

在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值、亮度值),灰度范围为0-255,当灰度为255的时候,表示最亮(纯白);当灰度为0的时候,表示最暗(纯黑)。灰度化的好处是:相较于彩色图像灰度图像占内存更小,运行速度更快;灰度图像后可以在视觉上增加对比,突出目标区域。

crossoverpptx的博客 3万+

图像灰度化原理实现

图像灰度化原理实现 一、图像灰度化处理的基本原理 将彩色图像转化成为灰度图像的过程成为图像灰度化处理。彩色图像中的每个像素的颜色有R、G、B三个分量决定,而每个分量有255中值可取,这样一个像素点可以有1600多万(255*255*255)的颜色的变化范围。而灰度图像是R、G、B三个分量相同的一种特殊的彩色图像,其一个像素点的变化范围为255种,所以在数字图像处理种一般

WITNESS 4104

java图像灰度化原理实现_java图像灰度化

示例代码:public class MyShowImage extends JFrame {// 保存当前操作的像素矩阵private int currentPixArray[] = null;// 图像的路径private String fileString = null;// 用于显示图像的标签private JLabel imageLabel = null;// 加载的图像private B...

weixin_28840591的博客 256

数字图像处理(16): 图像颜色空间转换 OpenCV图像灰度化处理

目录 1 图像灰度化原理 2 图像颜色空间转换 3 OpenCV图像灰度化处理 3.1 最大值灰度处理 3.2 平均灰度处理 3.3 加权平均灰度处理 参考资料 1 图像灰度化原理图像处理算法中,往往需要把彩色图像转换为灰度图像。图像灰度化是将一幅彩色图像转换为灰度化图像的过程。彩色图像通常包括R、G、B三个分量,分别显示出红绿蓝等各种颜色,灰度化就是使彩色图像的R、G、...

TechArtisan6的博客 1万+

Python数字图像处理1.2---彩色图像灰度化二值化

本篇将介绍彩色图像灰度化二值化的原理,并使用Python来实现对应算法内容。

Trent1985的专栏 1万+

图像灰度化、二值化

图像像素点 在图像处理中,用RGB三个分量(R:Red,G:Green,B:Blue),即红、绿、蓝三原色来表示真彩色,R分量,G分量,B分量的取值范围均为0~255,比如电脑屏幕上的一个红色的像素点的三个分量的值分别为:255,0,0。 ...

写代码的小男孩 7735

《OpenCv视觉之眼》Python图像处理四 :Opencv图像灰度处理的四种方法及原理

本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的、不同方法的处理,以达到对图像进行去噪、锐化等一系列的操作。同时,希望观看本专栏的小伙伴可以理解到OpenCv进行图像处理的强大哦,如有转载,请注明出处(原文链接作者署名),感谢各位小伙伴啦! 前文参考: 《OpenCv视觉之眼》Python图像处理一 :Opencv-python的简介及Python环境搭建 《OpenCv视觉之眼》Python图像

qq_42451251的博客 1万+

图像灰度化与二值化

图像灰度化 什么是图像灰度化图像灰度化并不是将单纯的图像变成灰色,而是将图片的BGR各通道以某种规律综合起来,使图片显示位灰色。 规律如下: 手动实现灰度化 首先我们采用手动灰度化的方式: 其思想就是: 先创建一个跟原来长宽一样的空白图片,然后将原图片中图片各个像素按照下面公式填入图片中,实现灰度化。 import cv2 import numpy as np from skimage.color import rgb2gray from PIL import Image import matplo

瞳瞳瞳呀 4408

图像处理灰度化二值化

       在图像处理中,用RGB三个分量(R:Red,G:Green,B:Blue),即红、绿、蓝三原色来表示真彩色,R分量,G分量,B分量的取值范围均为0~255,比如电脑屏幕上的一个红色的像素点的三个分量的值分别为:255,0,0。 像素点    像素点是最小的图像单元,一张图片由好多的像素点构成,下图是一张美女的大白腿...

hpc904286589的博客 4731

matlab 灰度化原理公式,MATLAB的Sobel图像边缘灰度值检测算法的详细公式实现资料概述...

图像边缘就是图像灰度值突变的地方,也就是图像在该部分的像素值变化速度非常之快,就比如在坐标轴上一条曲线有刚开始的平滑突然来个大转弯,在变化出的导数非常大。Sobel算子主要用作边缘检测,它是一离散型差分算子,用来计算图像亮度函数灰度之近似值。边缘是指其周围像素灰度急剧变化的那些像素的集合。边缘存在于目标、背景区域之间,所以,边缘是图像分割所依赖的最重要的依据。由于边缘是位置的标志,对灰度的变化不...

weixin_36035750的博客 1146

图像预处理算法————灰度化处理

图像预处理算法适合在FPGA上完成,原理简单且需要快速处理,通常有灰度化、中值、均值滤波等,以及颜色空间转换算法。灰度图像是一种特殊的彩色图像(R=G=B的彩色图像) 只有一种颜色分量,单通道的0-255方法:一般有分量法、最大值法、平均值法、加权平均法四种方法对彩色图像进行灰度化。 除以256可以看作是向右移8位,同样,512,1024,2048等2的n次都可以分析:只有加法乘法以及移位操作 //求平均法GRAY = (R+B+G)/3=((R+B+G)*85)>>8 =((R+B+G)*(64+16

weixin_48988753的博客 7338

详解Java如何实现图像灰度化

来源  http://www.jb51.net/article/91257.htm   24位彩色图与8位灰度图 首先要先介绍一下24位彩色图像,在一个24位彩色图像中,每个像素由三个字节表示,通常表示为RGB。通常,许多24位彩色图像存储为32位图像,每个像素多余的字节存储为一个alpha值,表现有特殊影响的信息[1]。 在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中...

千里之行的专栏 1933
上一篇: 创建Win32 DLL的步骤和使用
下一篇: BMP文件格式分析
小大小丑
博客等级 码龄18年 483粉丝 425原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值