图像灰度化的方法及编程实现

更新时间:2023-06-04 04:56:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

图像灰度化

第15卷 第1期

2004年3月          广西工学院学报           Vol115 No11

 JOURNALOFGUANGXIUNIVERSITYOFTECHNOLOGY   Mar12004

文章编号 100426410(2004)0120023204

位图图像灰度化的方法及编程实现

游达章1,张建钢2,甘 勇3

(11湖北工学院机械工程学院,湖北武汉 430068;

21武汉科技学院机械系,湖北武汉 430000;31桂林电子工业学院机械系,广西桂林 541004)

摘 要:图像灰度化是许多数字图像处理的初始和基础工作,本文对灰度化的基本原理作了简要阐述,同时分别介绍了8位和24位彩色位图灰度化的具体方法,并给了实现详细代码。

关 键 词:灰度化;位图;方法;代码

中图分类号:TP31714    文献标识码:A

,,广泛运用在纺织、机械、信息科学、生物、、轮廓提取、图像增强等等热点问题的相关技术工作,。本文对彩色图像到灰度图像转变的实现方法作了详细的阐述。

1 彩色图像和灰度图像的基本概念及相互关系

位图图像一般分为单色图像、灰度图像和彩色图像。单色图像只有黑色和白色两种颜色,整个图像由单纯的黑色点和白色点组成。彩色图像的像素点是由R(红色)、G(绿色)、B(兰色)三元色混合而成的,不同含量的R、G、B组成不同的颜色,每一个记录单个像素的位数据单元可表示任意一种颜色。根据这个记录单个像素信息的位数据单元所占位数大小,可分为8位、16位、24位和32位等几种位图。8位位图是指图像一个像素点的颜色信息用8个位(一个字节)来表示;同样,16位位图用16个位(二个字节)来表示,其中R、G、B分别占5位,另外1位他用;24位位图用24个位(三个字节)来表示,其中R占8位、G占8位、B占8位。灰度图像与单色图像的区别是加上颜色深度的概念,单纯的看,灰度图也是黑白的,就像黑白电视显示的图像一样,但是点与点之间黑的程度是不一样的,这就是深度。如果称不同深度的颜色为一色的话,灰度图像就不止只有黑色和白色两种颜色,一般使用的灰度图为256级灰度图,就是说图像由256种不同灰度级的颜色组成[1]。

本文主要介绍对8位和24位两种最常使用彩色位图灰度化的方法。先简单介绍一下位图的结构,这对灰度化的方法有着重要的影响。位图文件结构按顺序一般包括位图文件头结构BITMAPFI位LEHEADER、图信息头结构BITMAPI位图颜色表GBQUAD和图像位数据4部分。对于8位位图的文件NFOHEADER、

结构,这4部分都包括。而24位位图则只包括文件头结构、信息头结构和位数据三部分。这是因为8位位图带有颜色表信息,对于8位位图,WINDOWS采用调色板技术来记录颜色信息,首先在颜色表结构中储存256种给定的彩色颜色,然后在数据位中用一个8位二进制数(值从0~28(256))来表示颜色表中的某一种具体的颜色,这个8位二进制数的实质就是一个索引,在显示颜色时通过这个索引来调用颜色板种对应颜色的R、8位G、8位B来表示,即一G、B值。而24位位图没有颜色表,如前所述,24位位图颜色信息由8位R、

个像素的颜色信息在数据位中直接用3个字节来表示,显示时直接使用R、G、B值,而不需要利用调色板来收稿日期:2004201213

作者简介:游达章(19752),男,湖北洪湖人,湖北工学院讲师,研究生。

图像灰度化

24广西工学院学报                  2004年3月索引。因此,8位位图只能显示256种颜色,叫伪彩色,24位能显示224(约1600万)种颜色叫做真彩色。  彩色图像中像素点的R、蓝色为G、B分量是不等的,如红色用RGB结构来表示为RGB(255,0,0)、

而灰度像素点的R、RGB(0,0,255)。G、B的分量是相等的,既颜色中的含量R=G=B,用RGB表示为(0,0,

(1,1,1)……(255、0)、255、255),其中RGB(0,0,0)为黑色,RGB(255,255,255)为白色,界于两者之间的为

[2]灰度颜色。彩色位图与灰度位图的像素点的R、G、B分量之间有如下对应关系:R

G

B灰度=01299 01587 01

01299 01587 01114301299 01587 01RGB彩色

有了这个公式,就能将一副彩色图像转化为灰度图。又由于8位和24位位图颜色管理有基于调色板和不基于调色板的区别,它们的灰度化方法也不相同,下面分别介绍。

2 8位位图的灰度化

8位位图的文件结构中带有颜色表,表项改变为灰度级颜色,:图像颜色表中第100项的颜色,R(:

G

B=00 0111401299 01587 01114301299 01587 0134167  经过计算,R=132(近似值),G=132,B=132,于是将颜色表的第100项改设为RGB(132,132,132)。  灰度化8位位图的颜色表后,还要创建一个逻辑调色板,并将此逻辑调色板设为系统调色。这是因为图像的显示与WINDOWS编程有很大的关系,WINDOWS的应用程序都有自己的调色板,如果没有,默认为系统调色板。8位位图灰度化以后,要准确的显示,就要创建自己的逻辑调色板,并实现它,否则图像显示失真[3]。

实现代码(主要):

灰度化调色板。m_pPalette为调色板结构指针,设为已知,且指向调色板首地址。m_Palette为一逻辑调色板对象

for(inti=0;i<255;i++)

{

 intgray=0.303m_pPalette[i].rgbRed+0.593m_pPalette[i].rgbGreen+0.113m_pPalette   [i].rgbBlue;m_pPalette[i].rgbRed=m_pPalette[i].rgbGreen=m_pPalette[i].rgbBlue=gray;    创建逻辑调色板

 LOGPALETTE3pLogPal=(LOGPALETTE3)newchar

 [sizeof(LOGPALETTE)+2563sizeof(PALETTEENTRY)];

 pLogPal2>palPalEntry[i].peRed=pLogPal2>palPalEntry[i].peGreen=pLogPal2>palPalEntry   [i].peBlue=gray;

}

m_Palette.CreatePalette(pLogPal);

delete[]pLogPal;

实现逻辑调色板

CPalette3pOldPalette;

pOldPalette=pDC_>SelectPalette(&m_Palette,FALSE);

pDC2>RealizePalette();

pDC2>SelectPalette(pOldPalette,FALSE)

图像灰度化

显示图像。m_pBIH为图像信息头结构,m_pDibBits为指向位数据首地址指针,已知

StretchDIBits(pDC2>m_hDC,nX,nY,nWidth,nHeight,0,0,m_pBIH2>biWidth,m_pBIH2>  biHeight,m_pDibBits,(BITMAPINFO3)m_pBIH,BI_RGB,SRCCOPY);

3 24位位图的灰度化

24位位图的灰度化有两种方案,第一种是将图像位数据中的数据编码方式改变,直接变为灰度颜色,因为24位位图用3个字节来记录颜色信息,且不需要调色板操作,操作相对简单。具体实现方法为:找到位数据初始地址指针m_pDibBits,设置一指针变量m_pLine,分配内存空间,从m_pDibBits开始将每三个字节读取每个像素的R、G、B值,计算灰度后再每三个字节依次填入到分配的内存中,最后将m_pLine值赋予m_pDibBits。代码如下:

  inti;

  intm_heith=GetHeight();intm_width=GetWidth();

  unsignedchar3m_pLine=newunsignedchar[heith_w3    m_pLine=m_pDibBits;

  for(i=m_heith-1;i>=0;i-)

   {

tj_w-1;j+)

          intgray=

       3(m_pDibBits+i3m_width33+j33+0)30.30+3(m_pDibBits+i3m_         width33+j33+1)30.59+3(m_pDibBits+i3m_width33+j33+2)30.11;         3(m_pLine+i3m_width33+j33+0)=3(m_pLine+i3m_width33+j33         +1)=3(m_pLine+i3m_width33+j33+2)=gray;

    }

   }

  m_pDibBits=m_pLine;

第二种方法是将24位真彩色位图变为8位的灰度图,这个转变要复杂一些。在此介绍基本的原理和主要的步骤。首先得创建位图的颜色表,共256个,顺序排列,如(0,0,0),(1,1,1)、……(255,255,255)。然后根据这个颜色表来创建一个逻辑调色板,实现这个逻辑调色板为系统调色板。这两部分代码如同8位处理。第三步就要改写位数据了。像第一种方法一样,只不过分配内存是原来的1 3,此时R=G=B,只用一个字节记录即可,从m_pDibBits依次读取每个像素的R、G、B值,计算灰度后再将这个灰度值直接每字节顺序填入到分配的内存中。第四步就要改变文件信息头中相关信息,此时该图像大小已应变为:信息头结构大小+颜色表结构大小+256(RGBQUAD)结构大小+图像大小。3;所以其信息头中的biSizeImage应为原来的1 biBitCount应为8。这样就完成由24位到8位的转变。此方法比较第一种,虽然操作复杂,但能节约空间。4 结束语

目前对灰度图像的运用越来越多,本文对8位和24位两种最常用的位图图像灰度化作了详细的介绍。同时,对推导其他类型图像的灰度化方法,对灰度数据的保存和写位图文件,以及利用灰度图像开发等其他工作奠定了基础。文中代码在VC++610上经调试、运行通过。

图像灰度化

[ 参 考 文 献 ]

[1]李于剑1VisualC++实践与提高——图形图像编程篇[M]1北京:中国铁道出版社,20011

[2]何 斌,马天予1VisualC++数字图像处理(第二版)[M]1北京:人民邮电出版社,20021

[3]阮秋琦1数字图像处理学[M]1北京:电子工业出版社,20011

Awayofgrayingtheimageofabitmap

andtherealizationofprogramming

123YOUDa2zhang,ZHANGJian2gang,GANYong

(1.MechanicalEngineeringDepartment,Hubei,China;

2.Dept.ofMachinery,WuhanInstituteof,HChina;3.Dept.ofMachinery,Guof,iGuilin541004,China)

Abstract:Tingandfoundamentalworkofprocessingdigitalimages.Thearticlebbasicprinciplesofgraying,andintroducesaspecificwayofgraying82bitand242bitcolourbitmaps.AndthedetailVC++codesaregiven.

Keywords:graying;bitmap;method;code

(责任编辑 赖君荣)

(上接第22页)

AmethodofenquiringindexbasedonXML

YUANQing2neng,TANGPei2he

(Dept.ofComputerEngineering,GuangxiUniversityofTechnology,Liuzhou545006,China)

Abstract:InaccordancewiththecharacteristicsofXMLfile,amethodofbuildingupanindexforXMLfileisgiven.Thestructureofdataandthealgorithmusedinthemethodhavetheadvantagesofimprovingtheaccuracyofenquiring,havinglessindexredundancyandquicklyenquiringundertheconditionofmakingfulluseofthecontextinformationinthetagofXMLfile.

Keywords:XML;tag;index;invertedlist;enquir

(责任编辑 赖君荣)

本文来源:https://www.bwwdw.com/article/9wn1.html

Top