位图的基本格式

上传人:豆*** 文档编号:122269397 上传时间:2022-07-20 格式:DOCX 页数:35 大小:1.50MB
收藏 版权申诉 举报 下载
位图的基本格式_第1页
第1页 / 共35页
位图的基本格式_第2页
第2页 / 共35页
位图的基本格式_第3页
第3页 / 共35页
资源描述:

《位图的基本格式》由会员分享,可在线阅读,更多相关《位图的基本格式(35页珍藏版)》请在装配图网上搜索。

1、第一章 位图的基本格式 1 1位图文献格式的产生及发展BMP图像文献格式是微软公司为其Windows环境设立的原则图像格式,并且Windows系统软件中还同步内含了一系列支持BMP图像解决的API函数,随着Windows 在世界范畴内的不断普及,BMP文献格式无疑也已经成为PC机上的流行图像文献格式。它的重要特点可以概括为:文献构造与PCX文献格式类似,每个文献只能寄存一幅图像;图像数据与否采用压缩方式寄存,取决于文献的大小与格式,即压缩解决成为图像文献的一种选项,顾客可以根据需要进行选择。其中,非压缩格式是BMP图像文献所采用的一种通用格式。但是,如果顾客拟定将BMP文献格式压缩解决,则Wi

2、ndows设计了两种压缩方式:如果图像为16色模式,则采用RLE4压缩方式,若图像为256色模式,则采用RLE8压缩方式。同步,BMP图像文献格式可以存储单色、16色、256色以及真彩色四种图像数据,其数据的排列顺序与一般文献不同,它以图像的左下角为起点存储图像,而不是以图像的左上角为起点;并且BMP图像文献格式中还存在此外一种与众不同的特点,即其调色板数据所采用的数据构造中,红、绿、蓝三种基色数据的排列顺序也正好与其他图像文献格式相反。总之,BMP图像文献格式拥有许多适合于Windows环境的新特色,并且随着Windows版本的不断更新,微软公司也在不断改善其BMP图像文献格式,例如:目前B

3、MP图像文献版本中容许采用32位颜色表,并且针对32位Windows 的产生,相应的API函数也在不断地推陈出新,这些无疑都同步促成了BMP文献格式的不断风行。但由于BMP文献格式只适合于Windows上的应用软件,而对于DOS环境中的多种应用软件则无法提供相应的支持手段,因此这无疑是阻碍BMP文献格式的流通限度超过PCX文献格式的一种重要因素。1 2 位图文献的类型Windows中定义了两种位图文献类型,即一般位图文献格式与设备无关位图文献格式。其中,由于设备无关位图(DIB)文献格式具有更强的灵活性与完整的图像数据、 压缩方式等定义。BMP图像文献的构造可以分为如下三个部分:文献头、调色板

4、数据以及图像数据。其中文献头的长度为固定值54个字节;调色板数据对所有不超过256色的图像模式都需要进行设立,虽然是单色图像模式也不例外,但是对于真彩色图像模式, 其相应的BMP文献构造中却不存在相应调色板数据的设立信息;图像数据既可以采用一定的压缩算法进行解决,也可以不必对图像数据进行压缩解决,这不仅与图像文献的大小有关,并且也与相应的图像解决软件与否支持通过压缩解决的BMP图像文献有关。如下将分别简介BMP图像文献构造中的这三个重要构成部分。特别值得注意的是:BMP 图像文献构造设计得相称简朴,这无疑有助于图像文献的解决速度,但是同步也使得 BMP图像文献格式具有一定的局限性,即一种BMP

5、图像文献只能存储一幅图像。13 BMP文献格式的构造定义BMP图像文献的文献头定义Windows中将BMP图像文献的文献头提成两个数据构造,其中一种数据构造中涉及BMP文献的类型、大小和打印格式等信息,称为BITMAPFILEHEADER;此外一种数据构造中则涉及BMP文献的尺寸定义等信息,称为 BITMAPINFOHEADER。如果图像文献还需要调色板数据,则将其寄存在文献头信息之后。BITMAPFIEHEADER数据构造在Windowsh中的定义为:typedef structure tagBITMAPFILEHEADERWORD bfType;DWORD bfSize:WORD bfRe

6、served1;WORD bfReserved2:DWORD bfOffBits: BITMAPFILEHEADER;其中,bfType在图像文献存储空间中的数据地址为0,数据类型unsigned char,内容为固定值“BM”,用于标志文献格式,表达该图像文献为BMP文献。bfSize的数据地址为2,类型unsigned long,它以字节为单位,定义位图文献的大小。BfReserved1与bfReserved2的数据地址分别为6和8,数据类型则都为unsigned int,两者都是BMP文献的保存字,没有任何意义,其值必须为0.bfOffBits的数据地址为10,数据类型为unsigned

7、 long,它以字节为单位,批示图像数据在文献内的起始地址,即图像数据针对文献头的偏移量。BITMAPINFOHEADER数据构造用于阐明位图的大小,其定义为:type structure tagBITMAPINFOHEADER DWORD biSize:DWORD biWidth;DWORD biHeight; WORD biPlanes: WORD biBitCount:DWORD biCompression;DWORD biSizelmage; DWORD biXPelsPerMeter:DWORD biYPelsPerMeter:DWORD biClrUsed;DWORD biClrl

8、mportant;BITMAPINFOHEADER;其中,biSize的数据地址为14,数据类型为unsigned long,它以字节为单位指定数据 构造BITMAPINFOHEADER所占用的存储容量,固定值为40。biWidth与biHeight的数据地址分别为18和22,数据类型都是unsigned long,它们分别以像素为单位,给出该BMP文献所描述位图的宽度与高度。若biHeight的取值为正数, 则表白位图为bottomup类型的DIB位图,并且位图原点为左下角。若biHeight的取值为负数,则表白位图为topdown类型的DIB位图并且位图原点为左上角。 注意:一般位图定义中

9、,这两个字段的取值必须为正数。biPlanes的数据地址为26,类型为unsigned int,它代表目的设备的平面数必须为1。biBitCount的数据地址为28,类型为unsigned int,它拟定每个像素所需要的位数。当图像为单色时,该字段的取值为1;当图像为16色时,该字段的取值为4;当图像为256 色时,该字段的取值为8;当图像为真彩色时,该字段的取值为24。biCompression的数据地址为30,类型为unsigned long,它代表bottomup类型位图的压缩类型(注意:topdown类型位图不能进行压缩解决),其也许取值及其含义分别为:若该字段的取值为BIRGB,则表

10、达文献内的图像数据没有通过压缩解决;若该字段的取值为BIRLE8,则表达所压缩的图像数据是256色,采用的压缩措施是RLE8;若该字段的取值为BIRLE4,则表达所压缩的图像数据是16色,采用的压缩措施是RLE4;若该字段的取值为BIBITFIELDS,则表白图像文献内的数据没有通过压缩解决,并且颜色表由分别表达每个像素点的红、绿、蓝三原色的双字构成。 注意:BMP文献格式在解决单色或者真彩色图像时,不管图像数据多么庞大,都不对图像数据进行任何压缩解决。biSizelmage的数据地址为34,类型为unsigned long,它以字节为单位,给出该BMP内图像数据占用的空间大小。若图像文献描述

11、BIRGB位图,则该字段的值必须设立为0。biXPelsPerMeter字段与biYPelsPerMeter字段的数据地址分别为38与42,类型都是 unsigned long,它们分别以每米像素数为单位,给出位图目的设备水平以及垂直方向的辨别率;其中,应用程序可以根据biXPelsPerMeter字段的值,从源位图组中选择与目前设备特点最匹配的位图。biClrUsed的数据地址为46,类型为unsigned long,给出位图实际使用的颜色表中的颜色变址数。如果该字段的取值为0,则代表本位图使用了biBitCount字段值所代表的最大颜色值,其中biBitCount字段的取值与biCompr

12、ession所指定的压缩措施有关。例如:如果图像为16色,而该字段的取值为10,则代表本位图共使用了12种颜色;如果该字段的取值非零,并且biBitCount字段的取值不不小于16,则该字段指定图像或者设备驱动器存取的实际颜色数。若biBitCount字段的取值不小于或者等于16,则该字段指定使Windows系统调色板达到最优性能的颜色表大小。biClrlmportant的数据地址为50,数据类型为unsigned long,它给出位图显示过程中重要颜色的变址数。若该字段的取值为0,则表达所有使用的颜色都是重要颜色。如果位图的描述还需要调色板数据,则应当在BMP文献头之后定义一种颜色表,它涉及

13、若干个表项。其中,每一种表项定义了一种颜色,Windows将其定义为如下的 RGBQUAD构造:typedef tagRGBQUADBYTE rgbBlue;BYTE rgbGreen;BYTE rgbRed; BYTE rgbReserved;RGBQUAD;注意:RGBQUAD数据构造中,增长了一种保存字段rgbReserved,它不代表任何意义,必须取固定值00同步,RGBQUAD构造定义的颜色值中,红色、绿色与蓝色的排列顺序与一般图像文献的颜色数据排列顺序正好相反,即:蓝色的亮度由rgbBlue字段 定义;绿色的亮度由rgbGreen字段定义;红色的亮度由rgbRed字段定义。若位图中

14、某个像素点的颜色描述为“00,00,FF,00”,则表达该点的颜色为纯红色,而不是纯蓝色。综上,在DIB位图文献构成中,紧随BITMAPFILEHEADER构造其后的数据构造为 BITMAPINFO,两者共同构成完整的位图文献。Windows将BITMAPINFO构造定义为:typedef structure tagBITMAPINFOBITMAPINFOHEADER bmiHeader:RGBQUAD bmiColor1;BITMAPINFO;其中,bmiHeader字段指向涉及位图颜色格式以及大小定义的BITMAPHEADERINFO构造。bmiCo1or1字段指向RGBQUAD构造数组或

15、者定义位图颜色值的双字数据构造,它定义了BMP图像文献的颜色表,它涉及多少个表项是由 BITMAPINFOHEADER数据构造中的biBitCount字段定义的:若该字段的取值为1,则颜色表中共涉及两个表项;若该字段的取值为4,则颜色表中共涉及16个表项;若该字段的取值为8,则颜色表中共涉及256个表项;若该字段的取值为16,并且 BITMAPINFOHEADER构造定义中指定bmiColors字段的取值为BI_RGB,则颜色表中的表项为空,位图阵列中每个字代表一种像素,字中每5位上的值代表该像素点一种基色的亮度,其中最低5位代表蓝色亮度,依次为绿色与红色,字的最高位没有任何意义。 若该字段的

16、取值为24,则颜色表中的表项为空,而位图阵列的每三个字节代表一种像素,这3个字节直接定义了像素颜色中蓝、绿、红三种基色的相对亮度。若该字段的取值为32,并且BITMAPINFOHEADER构造定义中bmiColors字段的取值为BIRGB,则颜色表中的表项为空,且位图阵列中的每个双字代表一种像素的三原色亮度构成。注意:颜色表中的数据应当按照重要性的帧序进行排列。此外,如果应用程序中需要使用DIB位图,则bmiColors字段可觉得16位的无符号整数数组,这些整数指定目前逻辑调色板的颜色索引,而不是显式的RGB值。固然,如果位图存储在文献中或者需要传送到其他应用程序,则该字段中不能涉及调色板索引

17、值。 第二章 图像解决技术简介现做一种简朴的系统对图像解决的多种措施做一简介。下面具体简介系统的实现与功能。21 界面简介在普遍使用图形顾客界面的今天,使界面和应用程序的内容有机地结合在一起,遵守人性化准则,已经成为应用程序开发的一种重要方面。由于Windows应用程序都是在窗体中运营的,因此界面设计重要就是窗体设计。顾客界面设计是一种艺术,同步又有科学的原则和行为准则可以遵循。GUI操作系统的经销商耗费了数以万计的小时只是用来测试和改善她们的GUI界面,其中记载了大量的顾客的感觉和喜好,改正了界面中不合理的部分和障碍因素努力设计最和谐的界面。系统美观是GUI设计中重要的一部分,但GUI设计更

18、重要的是有关实用性、功能和易用性的方面问题。一种好的GUI界面有十条原则可以遵循:1充足发挥GUI界面设计的强大功能2使用形象化的设计3使系统不必要的交互最小化4容许以多种措施访问界面5界面由顾客完全控制6在任何时候都协助顾客7使顾客信任界面8限制顾客的选择9提供迅速响应10符合工业原则本系统采用VC+的应用向导功能,设计了一种单文档窗口界面。考虑到位图大小的变化,因此界面上设计了滚动条。当位图超过窗口原始尺寸时,自动浮现滚动条并可通过拖拉滚动条看到所有位图。界面如图(1)所示。 图(1)22 位图的读入进行图像解决的第一步就是读入位图。由于本系统对于同一幅图像要解决多次,因此在读入位图后要存

19、储位图的数据,使输入一幅位图可以进行多次解决。根据位图文献的构造特点及VC+语言的功能,分如下几步读入位图:221 定义变量 根据位图构造类型,定义如下几种变量 BYTE* m_pDIBData; BITMAPINFO* m_pBMPInfo; BITMAPFILEHEADER bfh;222 读入位图先用下面的语句1)打开一种对话框选择位图文献名,然后用语句2)将变量名保存在FileName变量中。由于FileName是CString 类型,因此在语句3)中打开文献时用GetBuffer()函数取内存中的值。接着语句4)中用Read() 函数读入位图头文献中的数据。1)CfileDialog

20、 FileDia ( TRUE , bmp , NULL , OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT , BMP文献 (*.bmp) | * . bmp | 所有文献 (* . *) | * . * | ) ; 2)FileName=FileDia.GetPathName();3)rval=file.Open(FileName.GetBuffer(0), CFile:modeRead | CFile:typeBinary,NULL);4)file.Read(&bfh,sizeof(bfh);223 读入位图的数据在这里定义了一种函数OpenBMPFile(

21、) 读入位图的数据。函数的执行语句如下:先定义位图数据构造的变量并初始化,然后用 Read() 函数读入BITMAPFILEHEADER和BITMAPINFOHEADER构造的数据。接着根据BITMAPINFOHEADER构造类型的biBitCount值将位图分类,24bits位图格式和别的位图格式分别解决。将位图的调色板数据和图像数据皆读入内存。224 显示滚动条读入位图数据后,将位图的大小和窗口的大小进行比较,以决定与否显示滚动条。语句如下size.cx=m_pBMPInfo-bmiHeader.biWidth;size.cy=m_pBMPInfo-bmiHeader.biHeight;G

22、etClientRect(&rect);if(rect.left-rect.right)size.cx|(rect.bottom-rect.top)SetScrollSizes(MM_TEXT,size,sizeDefault,sizeDefault);225 显示位图最后调用Invalidate()函数响应OnDraw()函数在屏幕上绘图。OnDraw()函数的实现措施如下:一通过语句段(1)设立目前文档二语句段(2)读入了目前位图的尺寸和位数三语句段(3)调用StretchDIBits() 函数在屏幕上绘图(1)CBmpDoc* pDoc = GetDocument(); ASSERT_V

23、ALID(pDoc);(2)long bmp_Width=m_pBMPInfo-bmiHeader.biWidth; long bmp_Height=m_pBMPInfo-bmiHeader.biHeight; USHORT bmp_bits=m_pBMPInfo-bmiHeader.biBitCount;(3)pDC-SetStretchBltMode(COLORONCOLOR); StretchDIBits(pDC-GetSafeHdc(), 0,0,bmp_Width,bmp_Height, 0,0,bmp_Width,bmp_Height, m_pDIBData,m_pBMPInfo,

24、 DIB_RGB_COLORS,SRCCOPY);23 图像解决前的准备在进行图像解决之前,先定义几种有用的函数1) void GetColor_Index_Origin(CPoint*pPoint , COLORREF* pColor);2) void GetColor_TrueColor_Origin(CPoint*pPoint , COLORREF* pColor);3) BOOL SetColor_Index(CPoint* pPoint , COLORREF Color); 4) BOOL SetColor_TrueColor(CPoint*pPoint , COLORREF Col

25、or); 函数1)和2)用于获得屏幕上每个象素的颜色值。在函数1)和2)中,通过下面的语句块规定只能获得位图内的象素值,而位图范畴外的区域都设立为白色。读入象素值时,依位图格式的不同读取措施也有变化。24Bits位图像素值只能通过GetColor_TrueColor_Origin()函数来读取,而其他格式的象素值则通过GetColor_Index_Origin()函数来读取。在GetColor_Index_Origin()函数内部又对8Bits,4Bits,1Bits三种不同的位图格式进行分别解决。if (pPoint-x=bmp_Width|pPoint-y=bmp_Height) *pCo

26、lor=0; return; 函数3)和4)则用来在屏幕上绘制已知象素值的点。这两个函数同样对不同的象素格式进行不同的解决。这种状况与前面所述的情形相似。24 灰度解决所谓灰度解决是根据输入图像象素的灰度对输出图像象素的灰度进行再定义。这种再定义措施有诸多种,可以根据不同的需要定义不同的措施。本例中的措施是先求出图像上点的象素的灰度值,然后将三种原色红、绿、蓝都赋值为此值,再将红、绿、蓝合成象素点绘制到屏幕上。具体实现流程和算法如下:(1)先判断m_pBMPInfo(涉及BMP图像数据的变量)中与否涉及数据,由于图像解决都是解决m_pBMPInfo中的数据。语句如下: if(m_pBMPInf

27、o=NULL)return;(2)通过BeginWaitCursor() 函数等待响应。(3)通过如下语句段获得位图的长宽尺寸和格式int dwWidth=m_pBMPInfo-bmiHeader.biWidth;int dwHeight=m_pBMPInfo-bmiHeader.biHeight;UINT bitcount=m_pBMPInfo-bmiHeader.biBitCount;(4)对24Bits位图格式和其他格式的位图图像进行不同的解决。对24Bits图像使用如下函数(a)和(b)读取屏幕上某点的象素值和绘制给定象素值的点。(a) GetColor_TrueColor_Origi

28、n(&point,&Color)(b) SetColor_TrueColor(&point,Color)对其他格式使用如下函数进行解决GetColor_Index_Origin(&point,&Color) SetColor_Index(&point,Color)。(5)一方面读取位图数据的点的象素值,进行灰度变换后来再以变换后来的象素值输出到原坐标点。24Bits格式位图的灰度变换程序示例如下:1GetColor_TrueColor_Origin(&point,&Color);DWORD red=Color&0x000000ff;DWORD green=Color&0x0000ff00;gr

29、een=8;DWORD blue=Color&0x00ff0000;blue=16;Color=round(0.3*red+0.59*green+0.11*blue);red*=2;if (red255)red-=255;green*=2;if (green255)green-=255;blue*=2;if (blue255)blue-=255;green=8;blueSetColor_TrueColor(&point,Color);固然,其他格式的位图的灰度变换只需要变化语句1和2即可。(6)调用Invalidate() 函数响应OnDraw()函数在屏幕上绘图。最后用EndWaitCurs

30、or() 函数相应BeginWaitCursor()函数。图(2)即为相应于图(1)的灰度解决后的图像。2 5逆反解决逆反解决也是灰度解决的一种。它的原理是对于256色图像,当输入图像的象素的灰度值为a时,输出图像中该象素灰度值为255-a,即输入象素灰度值的逆反值。具体算法和程序流程如下:(1)先判断m_pBMPInfo(涉及BMP图像数据的变量)中与否涉及数据,由于图像解决都是解决m_pBMPInfo中的数据。语句如下: if(m_pBMPInfo=NULL)return;(2)通过BeginWaitCursor() 函数等待响应。(3)通过如下语句段获得位图的长宽尺寸和格式int dwW

31、idth=m_pBMPInfo-bmiHeader.biWidth;int dwHeight=m_pBMPInfo-bmiHeader.biHeight;UINT bitcount=m_pBMPInfo-bmiHeader.biBitCount;(4)对24Bits位图格式和其他格式的位图图像进行不同的解决。对24Bits图像使用如下函数(a)和(b)读取屏幕上某点的象素值和绘制给定象素值的点。 (a)GetColor_TrueColor_Origin(&point,&Color) (b)GetColor_TrueColor(&point,Color) 对其他格式使用如下函数进行解决GetCo

32、lor_Index_Origin(&point,&Color) SetColor_Index(&point,Color)。(5)一方面读取位图数据的点的象素值,进行逆反变换后来再以变换后来的象素值输出到原坐标点。24Bits格式位图的逆反变换程序示例如下: 1GetColor_TrueColor_Origin(&point,&Color);DWORD red=Color&0x000000ff;DWORD green=Color&0x0000ff00;green=8;DWORD blue=Color&0x00ff0000;blue=16;red=255-red;green=255-green;b

33、lue=255-blue;green=8;blueSetColor_TrueColor(&point,Color);固然,其他格式的位图的逆反变换只需要变化语句1和2即可(6)调用Invalidate() 函数响应OnDraw()函数在屏幕上绘图。最后用EndWaitCursor() 函数相应BeginWaitCursor()函数。图(3)即为相应于图(1)的逆反解决后的图像。26 平滑解决(1)先判断m_pBMPInfo(涉及BMP图像数据的变量)中与否涉及数据,由于图像解决都是解决m_pBMPInfo中的数据。语句如下: if(m_pBMPInfo=NULL) return;(2)通过Be

34、ginWaitCursor() 函数等待响应。(3)通过如下语句段获得位图的长宽尺寸和格式int dwWidth=m_pBMPInfo-bmiHeader.biWidth;int dwHeight=m_pBMPInfo-bmiHeader.biHeight;UINT bitcount=m_pBMPInfo-bmiHeader.biBitCount;(4)对24Bits位图格式和其他格式的位图图像进行不同的解决。对24Bits图像使用如下函数(a)和(b)读取屏幕上某点的象素值和绘制给定象素值的点。(a) GetColor_TrueColor_Origin(&point,&Color)(b) S

35、etColor_TrueColor(&point,Color)对其他格式使用如下函数进行解决GetColor_Index_Origin(&point,&Color) SetColor_Index(&point,Color)。(5)循环读取位图数据的点的象素值,进行平滑解决后来再将解决后来的象素值输出到原坐标点。(6)调用Invalidate() 函数响应OnDraw()函数在屏幕上绘图。最后用EndWaitCursor() 函数相应BeginWaitCursor()函数。图(4)即为相应于图(1)的平滑解决后的图像。27 对比度增强(1)先判断m_pBMPInfo(涉及BMP图像数据的变量)中

36、与否涉及数据,由于图像解决都是解决m_pBMPInfo中的数据。语句如下: if(m_pBMPInfo=NULL) return;(2)通过BeginWaitCursor() 函数等待响应。(3)通过如下语句段获得位图的长宽尺寸和格式int dwWidth=m_pBMPInfo-bmiHeader.biWidth;int dwHeight=m_pBMPInfo-bmiHeader.biHeight;UINT bitcount=m_pBMPInfo-bmiHeader.biBitCount;(4)对24Bits位图格式和其他格式的位图图像进行不同的解决。对24Bits图像使用如下函数(a)和(b

37、)读取屏幕上某点的象素值和绘制给定象素值的点。 (a)GetColor_TrueColor_Origin(&point,&Color) (b)SetColor_TrueColor(&point,Color) 对其他格式使用如下函数进行解决GetColor_Index_Origin(&point,&Color) SetColor_Index(&point,Color)。(5)循环读取位图数据的点的象素值,进行对比度增强解决后来再以解决后来的象素值输出到原坐标点。(6)调用Invalidate() 函数响应OnDraw()函数在屏幕上绘图。最后用EndWaitCursor() 函数相应BeginW

38、aitCursor()函数。图(5)即为相应于图(1)的进行对比度增强后的图像。28 边沿探测在进行图像测量、模式辨认时,从图像中抽出线、检出图像边沿或抽出图像轮廓是最基本的操作,迄今为止,已经开发了多种成熟的算法。281 用Roberts算子进行边沿探测Roberts算子的体现式如下:gx=f(i,j)-f(i+1,j)2gy=f(i+1,j)-f(i,j+1)2g(i,j)=gx+gy1/2或简朴表达为差分形式:gx=f(i,j)-f(i+1,j)2gy=f(i+1,j)-f(i,j+1)g(i,j)=abs(gx)+abs(gy)具体的程序流程如下:1)先判断m_pBMPInfo(涉及B

39、MP图像数据的变量)中与否涉及数据,由于图像解决都是解决m_pBMPInfo中的数据。语句如下: if(m_pBMPInfo=NULL) return;2)通过BeginWaitCursor() 函数等待响应。3)通过如下语句段获得位图的长宽尺寸和格式 int dwWidth=m_pBMPInfo-bmiHeader.biWidth; int dwHeight=m_pBMPInfo-bmiHeader.biHeight;UINT bitcount=m_pBMPInfo-bmiHeader.biBitCount;4)对24Bits位图格式和其他格式的位图图像进行不同的解决。对24Bits图像使用

40、如下函数(a)和(b)读取屏幕上某点的象素值和绘制给定象素值的点。(a)GetColor_TrueColor_Origin(&point,&Color)(b)SetColor_TrueColor(&point,Color) 对其他格式使用如下函数进行解决GetColor_Index_Origin(&point,&Color) SetColor_Index(&point,Color)。5)循环读取位图数据的点的象素值,用Robert算子进行边沿解决后来再以解决后的象素值输出到原坐标点。6)调用Invalidate() 函数响应OnDraw()函数在屏幕上绘图。最后用EndWaitCursor()

41、 函数相应BeginWaitCursor()函数。图(6)即为相应于图(1)的用Roberts算子进行边沿解决后的图像。282 用Sobel 算子进行边沿解决1)先判断m_pBMPInfo(涉及BMP图像数据的变量)中与否涉及数据,由于图像解决都是解决m_pBMPInfo中的数据。语句如下: if(m_pBMPInfo=NULL) return;2)通过BeginWaitCursor() 函数等待响应。3)通过如下语句段获得位图的长宽尺寸和格式 int dwWidth=m_pBMPInfo-bmiHeader.biWidth; int dwHeight=m_pBMPInfo-bmiHeader

42、.biHeight; UINT bitcount=m_pBMPInfo-bmiHeader.biBitCount;4)对24Bits位图格式和其他格式的位图图像进行不同的解决。对24Bits图像使用如下函数(a)和(b)读取屏幕上某点的象素值和绘制给定象素值的点。 (a)GetColor_TrueColor_Origin(&point,&Color) (b)SetColor_TrueColor(&point,Color)对其他格式使用如下函数进行解决GetColor_Index_Origin(&point,&Color) SetColor_Index(&point,Color)。5)循环读取位

43、图数据的点的象素值,用Sobel算子进行边沿解决后来再以解决后的象素值输出到原坐标点。6)调用Invalidate() 函数响应OnDraw()函数在屏幕上绘图。最后用EndWaitCursor() 函数相应BeginWaitCursor()函数。图(7)即为相应于图(1)的用Sobel算子进行边沿解决后的图像。29 二值解决291 等灰度片法二值化 这种二值解决措施的思路是将输入图像在某两个等宽的灰度级范畴内的所有象素所有置为0(黑),其他灰度级的所有象素所有置为255(白)。则生成黑白二值图像。它的具体程序流程如下:2911 执行过程先测试m_pBMPInfo(涉及BMP图像数据的变量)中

44、与否涉及数据,语句如下: if(m_pBMPInfo=NULL)return;然后通过BeginWaitCursor() 函数等待响应。接着通过如下语句段获得位图的长宽尺寸和格式int dwWidth=m_pBMPInfo-bmiHeader.biWidth;int dwHeight=m_pBMPInfo-bmiHeader.biHeight;UINT bitcount=m_pBMPInfo-bmiHeader.biBitCount;第四步对图像进行二值解决。一方面对24Bits位图格式和其他格式的位图图像分别进行解决。只是使用的函数不同。对24Bits图像使用如下函数(a)和(b)读取屏幕上

45、某点的象素值和绘制给定象素值的点。(a)GetColor_TrueColor_Origin(&point,&Color)(b)SetColor_TrueColor(&point,Color) 对其他格式使用如下函数进行解决GetColor_Index_Origin(&point,&Color) SetColor_Index(&point,Color)。 2912 算法1 执行一种函数Look(lev,wid,lut)(其中lev=50,wid=100)对lut数组进行赋值,使lut0到lut49的值和lut149到lut255的值等于0x00ffffff。而lut50到lut148的值等于0x

46、00000000。2 进行循环对屏幕上的每一种点实行如下算法3 读取点的象素值,然后分别求出red,green,blue三种颜色的值并把它们转换成整形值Color.然后执行如下语句给点重新赋值并在屏幕上绘出。cc=lutColor;if(cc0)Color =0x00ffffff;elseColor=0x00000000;SetColor_TrueColor(&point,Color);Invalidate(FALSE);292 运用灰度图像直方图阀值二值化根据第一种算法对彩色图像进行解决后发现:对于那些灰度值比较接近的图像解决的效果并不好。甚至在对图像进行解决后的屏幕上一片空白,把图像上点与

47、点之间的差别都抹去了。因此这种二值解决的算法有一定的局限性。于是我想自己谋求一种算法以弥补这种局限性。算法的具体设想如下:由于诸多图像都是有很大的背景,而图像的轮廓上的象素的灰度值都明显的不同于背景上象素的灰度值。于是我想:在图像的每一行,先求出此行上拥有象素数最多的那种灰度值(诸多状况下是背景的灰度值)。然后将具有此灰度值的象素皆置为白色,而将不同于此灰度值的象素皆置为黑色,这样,虽然图像上象素的灰度值与背景的灰度值很接近也能进行灰度解决。图(7)即为一幅背景和图像很接近的位图。如图(8)为用等灰度片法二值化后的图像,可见,图像几乎是一片空白。而运用灰度图像直方图阀值二值化后的图像如图(9)

48、,这种二值化算法满足了规定。固然,这种算法也有很大的局限性,它只能解决只有图像轮廓和背景不同的位图,例如,在进行字符定位时,它只能定位象集装箱那种只有背景和字符两种颜色的状况,而对于汽车车牌号的定位,它却无能为力。由于汽车自身有背景,车牌号又是在车牌内,在这种状况下,通过解决后,整个车牌都会成为黑色。因此,任何一种算法均有其局限性,有它的合用范畴,我们在解决实际问题的时候,应当根据具体状况灵活的谋求和运用最适合的算法。灰度图像直方图阀值二值化算法实现的具体流程如下:扫描图中每一行获得各个象素灰度值计算出每一行的最大阀值开始绘图判断位图数据与否存在选择位图格式其她格式的位图24Bits位图 依次

49、获得每一行上的每个象素的灰度值与此行的最大阀值进行比较依次获得每一行上的每个象素的灰度值与此行的最大阀值进行比较不等于最大阀值灰度值取0灰度值取等于最大阀值灰度值取1等于最大阀值灰度值取1不等于最大阀值灰度值取0调用Ondraw()函数开始绘图29 成果分析 本系统的重要功能就是向读者演示几种图像解决技术解决后的成果,以便读者对图像解决技术有更形象直观的理解。逆反解决事实上也是一种灰度解决,只但是灰度值的变换用一种特别的措施。当灰度解决的时候,对于灰度值的转换用不同的算法就会有不同的解决成果。可以合用于不同的应用场合。平滑解决可以将图像中的凹槽和凸槽解决掉,从而为后来进行更复杂的解决做准备。进

50、行对比度解决后,可以很明显的看出解决后的图像比解决前的图像变的明亮了。边沿解决后,提取了图像的轮廓为后来的解决做准备。二值解决算是一种高档的数字图像解决方式,当图像解决应用于实际时,一般都需要用到二值解决,将现实世界中的彩色图像转化为黑白二色图像。因此二值解决算法是研究得较广的算法。在本例中,使用了两种二值解决算法进行研究。她们各有优缺陷,合用于不同的应用领域。总之,这些图像解决算法都是最基本的算法。但愿读者通过对这些算法的研究后可以进行更进一步的研究。在一种ActiveX控件中使用Pictures在这篇文章中描述了“Picture”数据类型和它在ActiveX控件中如何实现;在文章中重要涉及

51、两层意思:1. 定制“Picture”属性的概述在一组类型中,“Picture”类型对于所有的“ActiveX”控件来说是同样的。它解决图元文献、位图、或者是图标;顾客也可以指定一幅图像在一种“ActiveX”控件中显示。定制的“Picture”属性用“Picture object和“Get/Set”函数实现,其中“Get/Set”函数的功能是容许控件的顾客访问“Picture”属性。控件的顾客通过用“stock Picture”属性页访问“Picture”属性。“ActiveX”控件类提供了几种部件,你可以用这些部件在“ActiveX”控件内实现“Picture”属性 ,这些部件涉及:1 “

52、CPictureHolder”类对于由定制的“Picture”属性显示的项中的“Picture object和”functionality“,这个类提供很容易的访问功能。 2 支持”LPPICTUREDISP“类型的属性,这个功能用”Get/Set“函数实现。 3 有一种操纵”Picture“属性的属性页。这个属性页是一组”stock proper“页中的一部分,它对于”ActiveX”控件是合用的。 2在“ActiveX”控件中实现一种定制的“Picture”属性当控件上显示由顾客选择的图片时,运用可以显示目前图像和有一种容许顾客选择不同的图片的浏览按钮的属性页,顾客可以变化显示的图像。与实

53、现别的属性的程序相似,一种定制的图像属性用一种程序实现。重要的不同之处是定制的属性必须支持“Picture”类型。由于图像属性中的项必须由“ActiveX”控件绘制。在图像属性被充足地实现前,必须增长许多附加内容和做某些调节。为了实现一种定制的图像属性,必须做好如下的内容:1 把代码增长到控件工程中 必须增长一种原则的图像属性页ID号、一种“CPictureHolder”类型的数据成员和一种用“Get/Set”实现的“LPPICTUREDISP”类型的定制的属性。 2 修改控件类中的几种函数对与绘制“ActiveX“控件有关系的几种函数进行调节。附加到控件工程为了给原则的图形属性页增长属性页I

54、D,在控件实现文献中的”BEGIN_PROPPAGEIDS“宏后插入随后的行:PROPPAGEID(CLSID_CPicturePropPage)你还必须把你的BEGIN_PROPPAGEIDS宏的记数参数增长一。下面的行举例阐明了这点:BEGIN_PROPPAGEIDS(CSampleCtrl, 2)为了将”CPictureHolder“的数据成员增长到控件类,在控件类头文献的”protected“部分声明下面的行:CPictureHolder m_pic;命名数据成员的名字为”m_pic“并不是必须的;任何名字都行。下一步,增长一种自定义的属性,它将支持”Picture“类型。调节控件对象

55、 一旦你对控件对象作出了必要的增长,你需要修改几种对”ActiveX“控件的功能有影响的函数。涉及OnResetState”、“OnDraw”和定制的图像属性的“Get/Set”函数,它们在控件类的实现文献里边定义。在这个控件中的“OnResetState”函数中,在调用“COleControl:OnResetState;”后增长下面的可选行:m_pic.CreateEmpty();这句程序设立控件图像为空。为了绘制图像属性,在控件中“OnDraw”函数中调用“CPictureHolder:Render”在控件的定制图形属性的“Get”函数中增长下面的行:return m_pic.GetPic

56、tureDispatch();在控件的定制图形属性的“Set”函数中增长下面的行:m_pic.SetPictureDispatch(newValue);InvalidateControl();图像属性必须设立成固定的,以便于在设计时增长的信息在运营时显示出来。把下面的行增长到“COleControl_derived”类的“DoPropExchange”函数中:PX_Picture(pPX, ControlPicture,m_pic);在你完毕调节后,重新编译你的工程以便合并成新的定制的图像属性的函数性,并且可以用测验容器验证新的属性。 附录 程序代码/灰度解决void CBmpView:OnM

57、enuitem32776() /判断位图数据与否存在if(m_pBMPInfo=NULL)return;BeginWaitCursor(); /读取位图的长度、宽度和格式int dwWidth=m_pBMPInfo-bmiHeader.biWidth;int dwHeight=m_pBMPInfo-bmiHeader.biHeight;UINT bitcount=m_pBMPInfo-bmiHeader.biBitCount;int i=0,j=0; /开始灰度转换switch(bitcount)case 24:for(i=dwHeight-1;i=0;i-)for(j=0;j=8;DWORD

58、 blue=Color&0x00ff0000;blue=16;Color=round(0.3*red+0.59*green+0.11*blue);red*=2;if (red255)red-=255;green*=2;if (green255)green-=255;blue*=2;if (blue255)blue-=255;green=8;blue=0;i-)for(j=0;j=8;DWORD blue=Color&0x00ff0000;blue=16;Color=round(0.3*red+0.59*green+0.11*blue);red*=2;if (red255)red-=255;green*=2;if (green255)green-=255;blue*=2;if (blue255)blue-=255;green=8;blue=16;Color=blue|green|red;SetColor_Index(&point,Color);Invalidate(FALSE);break;default:break;EndWaitCursor();/等

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!