ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:22.11KB ,
资源ID:11099238      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-11099238.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(8位灰度图像BMP的保存.docx)为本站会员(b****1)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

8位灰度图像BMP的保存.docx

1、8位灰度图像BMP的保存8位灰度图像BMP的保存zz2012-04-07 21:01在图像处理中,我们经常需要将真彩色图像转换为黑白图像。严格的讲应该是灰度图,因为真正的黑白图像是二色,即只有纯黑,纯白二色。开始之前,我们先简单补充一下计算机中图像的表示原理。计算机中的图像大致可以分成两类:位图(Bitmap)和矢量图(Metafile)。位图可以视为一个二维的网格,整个图像就是由很多个点组成的,点的个数等于位图的宽乘以高。每个点被称为一个像素点,每个像素点有确定的颜色,当很多个像素合在一起时就形成了一幅完整的图像。我们通常使用的图像大部分都是位图,如数码相机拍摄的照片,都是位图。因为位图可以

2、完美的表示图像的细节,能较好的还原图像的原景。但位图也有缺点:第一是体积比较大,所以人们开发了很多压缩图像格式来储存位图图像,目前应用最广的是JPEG格式,在WEB上得到了广泛应用,另外还有GIF,PNG等等。第二是位图在放大时,不可避免的会出现“锯齿”现象,这也由位图的本质特点决定的。所以在现实中,我们还需要使用到另一种图像格式:矢量图。同位图不同,矢量图同位图的原理不同,矢量图是利用数学公式通过圆,线段等绘制出来的,所以不管如何放大都不会出现变形,但矢量图不能描述非常复杂的图像。所以矢量图都是用来描述图形图案,各种CAD软件等等都是使用矢量格式来保存文件的。在讲解颜色转换之前,我们要先对位

3、图的颜色表示方式做一了解。位图中通常是用RGB三色方式来表示颜色的(位数很少时要使用调色板)。所以每个像素采用不同的位数,就可以表示出不同数量的颜色。如下图所示:每像素的位数 一个像素可分配到的颜色数量 1 21 = 2 2 22 = 4 4 24 = 16 8 28 = 256 16 216 = 65,536 24 224 = 16,777,216 从中我们可以看出,当使用24位色(3个字节)时,我们可以得到1600多万种颜色,这已经非常丰富了,应该已接近人眼所能分辨的颜色了。现在计算机中使用最多的就是24位色,别外在GDI+中还有一种32位色,多出来的一个通道用来描述Alpha,即透明分量

4、。24位色中3个字节分别用来描述R,G,B三种颜色分量,我们看到这其中是没有亮度分量的,这是因为在RGB表示方式中,亮度也是直接可以从颜色分量中得到的,每一颜色分量值的范围都是从0到255, 某一颜色分量的值越大,就表示这一分量的亮度值越高,所以255表示最亮,0表示最暗。那么一个真彩色像素点转换为灰度图时它的亮度值应该是多少呢,首先我们想到的平均值,即将R+G+B/3。但现实中我们使用的却是如下的公式:Y = 0.299R+0.587G+0.114B这个公式通常都被称为心理学灰度公式。这里面我们看到绿色分量所占比重最大。因为科学家发现使用上述公式进行转换时所得到的灰度图最接近人眼对灰度图的感

5、觉。因为灰度图中颜色数量一共只有256种(1个字节),所以转换后的图像我们通常保存为8位格式而不是24位格式,这样比较节省空间。而8位图像是使用调色板方式来保存颜色的。而不是直接保存颜色值。调色板中可以保存256颜色,所以可以正好可以将256种灰度颜色保存到调色版中。下面是个私人例子:BITMAPFILEHEADER targetfileheader; BITMAPINFOHEADER targetinfoheader; memset(&targetfileheader,0,sizeof(BITMAPFILEHEADER); memset(&targetinfoheader,0,sizeof(

6、BITMAPINFOHEADER); /构造灰度图的文件头 targetfileheader.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256; targetfileheader.bfSize=192*192+sizeof(RGBQUAD)*256 +sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); targetfileheader.bfReserved1=0; targetfileheader.bfRes

7、erved2=0; targetfileheader.bfType=0x4d42; /构造灰度图的信息头 targetinfoheader.biBitCount=8; targetinfoheader.biSize=sizeof(BITMAPINFOHEADER); targetinfoheader.biHeight=192; targetinfoheader.biWidth=192; targetinfoheader.biPlanes=1; targetinfoheader.biCompression=BI_RGB; targetinfoheader.biSizeImage=0; targe

8、tinfoheader.biXPelsPerMeter=0; targetinfoheader.biYPelsPerMeter=0; targetinfoheader.biClrImportant=0; targetinfoheader.biClrUsed=0; /构造灰度图的调色版 RGBQUAD rgbquad256; int i; for(i=0;i=0;i-) for(long j=0;jbiWidth)*(DWORD)lpBI-biBitCount) *lpBI-biHeight;/ 存储时位图所有像素所占的总字节数dwDIBSize += dwBmBitsSize;lpBI-biS

9、izeImage = dwBmBitsSize; / 位图所有像素所占的总字节数file:/以下五句为文件头结构填充值bmfHdr.bfType =0x4d42; / 文件为BMP类型bmfHdr.bfSize = dwDIBSize + sizeof(BITMAPFILEHEADER);/文件总长度bmfHdr.bfReserved1 = 0;bmfHdr.bfReserved2 = 0;bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + lpBI-biSize+ 256*sizeof(RGBQUAD);file:/位图数据距问件头的偏移

10、量file.Write(LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER);/写文件头file.WriteHuge(lpBI, dwDIBSize);file:/将位图信息(信息头结构、颜色表、像素数据)写入文件:GlobalUnlock(HGLOBAL) m_hDIB);EndWaitCursor();SetModifiedFlag(FALSE); / back to unmodifiedreturn TRUE;二、 调色板的操作灰度图像要正确显示,必须实现逻辑调色板和系统调色板 ,通过在主框架类中处理Windows定义的消息WM_QUERYNEWPALETTE

11、、WM_PALETTECHANGED及视图类中处理自定义消息WM_DOREALIZE(该消息在主框架窗口定义如下:#define WM_REALIZEPAL (WM_USER+100))来实现调色板的操作。void CMainFrame:OnPaletteChanged(CWnd* pFocusWnd) file:/总实现活动视的调色板CMDIFrameWnd:OnPaletteChanged(pFocusWnd);CMDIChildWnd* pMDIChildWnd = MDIGetActive();if (pMDIChildWnd = NULL)returnCView* pView = p

12、MDIChildWnd-GetActiveView();ASSERT(pView != NULL);SendMessageToDescendants(WM_DOREALIZE, (WPARAM)pView-m_hWnd);file:/通知所有子窗口系统调色板已改变BOOL CMainFrame:OnQueryNewPalette()/提供实现系统调色板的机会/ 实现活动视的调色板CMDIChildWnd* pMDIChildWnd = MDIGetActive();if (pMDIChildWnd = NULL)return FALSE; / no active MDI child frame

13、 (no new palette)CView* pView = pMDIChildWnd-GetActiveView();ASSERT(pView != NULL);file:/通知活动视图实现系统调色板pView-SendMessage(WM_DOREALIZE, (WPARAM)pView-m_hWnd);return TRUE;LRESULT CDibView:OnDoRealize(WPARAM wParam, LPARAM)/实现系统调色板ASSERT(wParam != NULL);CDibDoc* pDoc = GetDocument();if (pDoc-m_hDIB = NU

14、LL)return 0L; / must be a new documentCPalette* pPal = pDoc-m_palDIB;file:/调色板的颜色表数据在InitDIBData()函数中实现if (pPal != NULL)CMainFrame* pAppFrame = (CMainFrame*) AfxGetApp()-m_pMainWnd;ASSERT_KINDOF(CMainFrame, pAppFrame);CClientDC appDC(pAppFrame);CPalette* oldPalette = appDC.SelectPalette(pPal, (HWND)

15、wParam) != m_hWnd);file:/只有活动视才可以设为FALSE,/ 即根据活动视的调色板设为前景调色板if (oldPalette != NULL)UINT nColorsChanged = appDC.RealizePalette();/实现系统调色板if (nColorsChanged 0)pDoc-UpdateAllViews(NULL);/更新视图appDC.SelectPalette(oldPalette, TRUE);file:/将原系统调色板置为逻辑调色板elseTRACE0(tSelectPalette failed inCDibView:OnPaletteC

16、hangedn);注:在调用API函数显示位图时,不要忘记设置逻辑调色板,即背景调色板,否则位图将无法正确显示。三、图像的数字化处理通过以上读文件的操作,已经得到图像数据,由于得到的数据包括多余信息,所以在进行数字图像处理时要进一步删除多余信息,只对位图的像素进行操作,以基于模板的高通滤波为例来讲述数字图像处理的实现:void CDibView:OnMENUHighPass() HANDLE data1handle;LPBITMAPINFOHEADER lpBi;CDibDoc *pDoc=GetDocument();HDIB hdib; unsigned char *hData; unsig

17、ned char *data;hdib=pDoc-GetHDIB();BeginWaitCursor();lpBi=(LPBITMAPINFOHEADER)GlobalLock(HGLOBAL)hdib);hData=(unsigned char*)FindDIBBits(LPSTR)lpBi);pDoc-SetModifiedFlag(TRUE);data1handle=GlobalAlloc(GMEM_SHARE,WIDTHBYTES(lpBi-biWidth*8)*lpBi-biHeight);data=(unsigned char*)GlobalLock(HGLOBAL)data1ha

18、ndle);AfxGetApp()-BeginWaitCursor();int i,j,s,t,ms=1;int sum=0,sumw=0;int mask33=-1,-1,-1,-1,9,-1,-1,-1,-1;for(i=0; ibiHeight; i+)for(j=0; jbiWidth; j+)sumw=0; sum=0;for(s=(-ms); s=ms; s+)for(t=(-ms); t=0) & (j+t)=0) & (i+s)biHeight) & (j+t)biWidth)sumw += mask1+s1+t;sum+=*(hData+(i+s)*WIDTHBYTES(lp

19、Bi-biWidth*8)+(j+t)*mask1+s1+t;if(sumw=0) sumw=1; sum/=sumw;if(sum255)sum=255;if(sumbiWidth*8)+j)=sum;for( j=0; jbiHeight; j+)for( i=0; ibiWidth; i+)*(hData+i*WIDTHBYTES(lpBi-biWidth*8)+j)=*(data+i*WIDTHBYTES(lpBi-biWidth*8)+j);AfxGetApp()-EndWaitCursor();GlobalUnlock(HGLOBAL)hdib);GlobalUnlock(data

20、1handle);EndWaitCursor();Invalidate(TRUE);四、图像的基本操作处理1、图像平移图像平移只是改变图像在屏幕上的位置,图像本身并不发生变化。假设原图像区域左上角坐标为(x0, y0),右下角坐标为(x1, y1),将图像分别沿x和y轴平移dx和dy,则新图像的左上角坐标为(x0+dx, y0+dy),右下角坐标为(x1+dx, y1+dy)。坐标平移变换公式为:x1 = x + dxy1 = y + dy在屏幕上实现图像的移动分为四个步骤: 读原图像到缓冲区; 擦除视图上原图像; 计算平移后的新坐标。 利用API函数:StretchDIBits()在新的左上角

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2