版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、用VC+实现直方图均衡化一试验目地:(1)、学会了解 C+ 是使用;(2)、学会用 C+ 解决图像处理问题(3)、学会使用 C+ 实现直方图均衡化 二、实验内容:用 VC+ 实现直方图均衡化 ;三、实验步骤:1 首先建立一个工程。打开VC+6.0,单击 文件【files 新建【new】f工程【projects】在打开的 projects 下选择 MFC App Wizard exe宀在 project name 下输入自己的工程名例如(Zhifangtujunhenghua )宀单击【ok】宀在打开的对话框中选择基于单文档【single document】T在第四步“ MFC App Wiza
2、rd step 4 of 6 ”面板中删掉【隐藏工具栏】和【打印和打印预览】两个选项,之后的全部选择默认,单击 finish ,出现一个“ New Project Information ”窗 口,单击【ok】。一个简单的工程框架就建好了。2、现在我们正式开始在新建工程 Zhifangtujunhenghua 中进行编程实现 bmp 位图的直方图均 衡化。点击左边框中的【ResourceView】框找到【Menu】点开,双击 Menu 下的图标,在右 面的显示框中创建两个菜单:打开ID:ID_FILE_OPEN直方图均衡化ID: ID_ZHIFANGTU显示原图ID:IDM_YUANTU3、给
3、这两个菜单建立类向导。在右边的窗口中右击“打开”,选择“建立类向导” ,然后在打开的对话框中操作, “Class name选择CZhifangtujunhenghuaView ” Object IDs 中选 择“ ID_FILE_OPEN ”Message中选择“ COMMAND ”,点击“ Add Function ” 键就会在Member fun ctio ns 中如下图 1 显示,然后点击Edit Code ”,在自动生成的 On FileOpen 函数中编写代码:void CZhifangtujunhenghuaView:OnFileOpen()/ TODO: Add your com
4、mand handler code hereCFileDialog fileDlg(true); fileDlg.m_ofn.lpstrTitle= 图片打开对话框 ;fileDlg.m_ofn.lpstrFilter=BMP Files(*.bmp)0*.bmp00; if(IDOK=fileDlg.DoModal()m_fileName.Format (%s,fileDlg.GetPathName();m_Dib.LoadFile(m_fileName);Invalidate();同理,操作 显示原图:Class name选择 CShowpictureVie w。点击“Edit Code
5、在自动生 成的“OnYuantu”函数中编写代码:Void CZhifangtujunhenghuaView:OnYuantu()/ TODO: Add your command handler code here m_Dib.LoadFile(m_fileName);Invalidate();4、同理, 操作 “直方图均衡化” 选择“ CZhifangtujunhenghuaView ”。点击 “Edit Code ”,在自动生成的“ OnZhifangtu ”函数中编写代码:void CZhifangtujunhenghuaView:OnZhifangtu()/ TODO: Add you
6、r command handler code hereif (m_Dib.IsValid()m_Dib.fenbujunhenghua();Invalidate(); 5、创建一个处理位图的类CDib ,且 CDib 类是由 CObject 类派生出来的。点击工程菜单栏中的插入【in sert】宀【insert classic类类型选Generic Class”,宀类名称填CDib ” 宀【ok】。可以看见工程窗口的 Class View 中多了一个 CDib 类;点开 CDib 类的头文件,输入以下代码, 注意变量可以直接复制, 声明的函数不要直接复制 (在 CDib 类右击选择 “Add
7、memberfunction ”,输入函数类型和函数名) 。class CDib: public CObjectpublic:RGBQUAD * m_pRGB;BYTE * m_pData;UINT m_numberOfColors;bool m_valid;BITMAPFILEHEADER bitmapFileHeader;/ 定义了一个文件头结构体的对象BITMAPINFOHEADER * m_pBitmapInfoHeader;/ 定义了一个指向信息头的结构体指针 BITMAPINFO *m_pBitmapInfo;/ 定义了一个结构体指针, BITMAPINFO 是一个包含有 信息头,
8、和调色板的BYTE * pDib;DWORD size;char m_fileName256;public:int dwWidthBytes;int byBitCount;void fenbujunhenghua();void zhifangtu(float *tongji);void SaveFile(const CString filename);void LoadFile(const char * dibFileName);WORD PaletteSize(LPBYTE lpDIB);WORD DIBNumColors(LPBYTE lpDIB); BITMAPINFO * GetInf
9、o();BYTE * GetData();RGBQUAD * GetRGB();UINT GetWidth();UINT GetHeight();UINT GetNumberOfColors();DWORD GetSize(); bool IsValid(); char * GetFileName(); CDib(); virtual CDib();6、对 CDib 类中的函数定义,找到 Dib.cpp 输入代码: CDib:CDib()m_numberOfColors=0; size = 0; m_valid=0; byBitCount=0; dwWidthBytes=0;CDib:CDib
10、()GlobalFreePtr(m_pBitmapInfo);char * CDib:GetFileName()return m_fileName;bool CDib:IsValid()return m_valid;DWORD CDib:GetSize()if (m_pBitmapInfoHeader-biSizeImage!=0)return m_pBitmapInfoHeader-biSizeImage;elseDWORD height = (DWORD)GetHeight();DWORD width = (DWORD)GetWidth(); return height * width;U
11、INT CDib:GetNumberOfColors()int numberOfColors;if (m_pBitmapInfoHeader-biClrUsed=0)&(m_pBitmapInfoHeader-biBitCountbiBitCount)case 1: numberOfColors = 2;break;case 4: numberOfColors = 16;break; case 8: numberOfColors = 256;break;else/若不是上面的情况,则直接返回颜色数numberOfColors=(int)m_pBitmapInfoHeader-biClr
12、Used;return numberOfColors;UINT CDib:GetHeight()return (UINT)m_pBitmapInfoHeader-biHeight;UINT CDib:GetWidth()return (UINT)m_pBitmapInfoHeader-biWidth;RGBQUAD * CDib:GetRGB()return m_pRGB;256 色BYTE * CDib:GetData()return m_pData;BITMAPINFO * CDib:GetInfo()return m_pBitmapInfo;WORD CDib:DIBNumColors(
13、LPBYTE lpDIB)WORD wBitCount;/DIB bit countwBitCount = (LPBITMAPCOREHEADER)lpDIB)-bcBitCount; switch(wBitCount)case 1: return 2;case 4: return 16;case 8: return 256;default:return 0;WORD CDib:PaletteSize(LPBYTE lpDIB)return(DIBNumColors(lpDIB)*sizeof(RGBTRIPLE);void CDib:LoadFile(const char *dibFileN
14、ame)strcpy(m_fileName,dibFileName);/ 将路径名称拷贝到 m_fileName 之中 CFiledibFile(m_fileName,CFile:modeRead);/ 创建 CFile 类对象,只读方式 dibFile.Read(void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER);/ 读取文件头的 内容if(bitmapFileHeader.bfType = 0 x4d42)/ 判断是否为 bmp 格式, 单步调试你会发现, 此时 的bfType 值DWORD fileLength = dibFile.G
15、etLength();/ 读取文件的大小,你可以试试跟踪此值 来看看它是否和你要打开的图片大小一致size = fileLength - sizeof(BITMAPFILEHEADER);/ 文件大小 -文件头结构体的大小,此时你会发现,文件头的大小的确是 14 字节pDib = (BYTE *)GlobalAllocPtr(GMEM_MOVEABLE,size);/ 详见说明( 2)dibFile.Read(void *)pDib,size);/ 通过读取,把读出的数据存入刚才分配的内存之中dibFile.Close();/ 文件操作完成之后关闭文件m_pBitmapInfo=(BITMAP
16、INFO *)pDib;/BITMAPINFO 结构体指针指向该内存m_pBitmapInfoHeader = (BITMAPINFOHEADER *)pDib;/ 信息头指向该内存 m_pRGB = (RGBQUAD*)(pDib + m_pBitmapInfoHeader-biSize);/ 调色板指针指向 该内存的调色板部分。因为 pDib 原本指向信息头, 偏移 40 字节(信息头结构体的大小) 之 后便到了调色板部分,因此用加法来实现指针的偏移int m_numberOfColors = GetNumberOfColors();/ 调用 GetNumberOfColors 函数来得
17、到颜色数if(m_pBitmapInfoHeader-biClrUsed = 0)m_pBitmapInfoHeader-biClrUsed=m_numberOfColors;/ 把 颜 色 数 赋 予 biClrUsed之中DWORD colorTableSize=m_numberOfColors * sizeof(RGBQUAD);/ 用每个调色板结 构体大小乘以颜色数量,得到调色板的大小m_pData = pDib + m_pBitmapInfoHeader-biSize+ colorTableSize;/ 这时候代表把m_pData 指针指向实际图像数据了if (m_pRGB = (R
18、GBQUAD *)m_pData) / 如果调色板指针位置和实际图像位置 指针指向位置相同,那就代表没有调色板m_pRGB = NULL;/ 指针赋予空m_pBitmapInfoHeader-biSizeImage = GetSize();/ 赋予实际位图的大小m_valid = true;else/如果不是 bmp 位图则失败m_valid = false;AfxMessageBox(This isnt a bitmap file!);void CDib:SaveFile(const CString filename)strcpy(m_fileName,filename);CFile dib
19、File(m_fileName,CFile:modeCreate|CFile:modeWrite);dibFile.Write(void *)&bitmapFileHeader,sizeof(BITMAPFILEHEADER); dibFile.Write(void*)pDib,size);dibFile.Close();void CDib:zhifangtu(float *tongji)int i;int j;int huidu256; /灰度计数int wide,height;/原图长、宽/变量初始化memset(huidu,0,sizeof(huidu);wide=this-Ge
20、tWidth();height=this-GetHeight();LPBYTE temp1=new BYTEwide*height;/新图像缓冲区/复制原图像到缓存 图像memcpy(temp1,m_pData,wide*height);for(i=0;iheight;i+)for(j=0;jwide;j+)unsigned char temp=temp1wide*i+j;/灰度统计计数huidutemp+;/计算灰度分布密度for(i=0;iGetData();zhifangtu(fps_R);for(i=0;i256;i+)if(i=0)temp_r0=fps_R0;elsetemp_ri=temp_ri-1+fps_Ri;nNs_Ri=(int)(2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- dba面试题及答案
- 中班打击乐郊游课件
- 孤独之旅课件
- 《业务开发管理》课件
- 一起真快乐课件
- 河南省濮阳市2024-2025学年高二上学期11月期中考试数学试题(无答案)
- 天津市塘沽第二中学2024-2025学年七年级上学期期中考试数学试卷(无答案)
- 小猪佩奇平均分课件
- 【语文课件】敬畏生命-
- 高一物理《速度变化快慢的描述-加速度》-教学设计、课后练习、学习任务单
- 高考模拟作文写作:“如何辨别取舍信息”导写(附:写作指导及范文点评)
- 四年级数学老师家长会ppt
- 喜马拉雅有声书用户行为市场报告课件
- 2009-2022历年江苏省苏州工业园区管委会直属事业单位统一公开招聘人员《综合知识与能力素质》试题(管理类)含答案2022-2023上岸必备汇编4
- ACS510变频器参数表
- G344项目临建工程施工方案-12号定稿
- 小学数学人教四年级上册(2022年新编)平行四边形和梯形认识平行四边形
- 少先队主题班会工作汇报模板009号课件
- 电气设备常见故障分析
- 造纸和纸制品公司安全风险分级管控清单
- 双重预防体系培训考试卷(含答案)
评论
0/150
提交评论