课程设计基于VC的BMP图像二值化处理平台精品.docx
- 文档编号:30150644
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:22
- 大小:228.68KB
课程设计基于VC的BMP图像二值化处理平台精品.docx
《课程设计基于VC的BMP图像二值化处理平台精品.docx》由会员分享,可在线阅读,更多相关《课程设计基于VC的BMP图像二值化处理平台精品.docx(22页珍藏版)》请在冰豆网上搜索。
课程设计基于VC的BMP图像二值化处理平台精品
课程设计说明书
学生姓名:
学号:
学生姓名:
学号:
学生姓名:
学号:
学生姓名:
学号:
学院:
中北大学信息商务学院
专业:
电子信息工程
题目:
专用基本技能实践:
基于VC的BMP图像二值化处理平台
指导教师:
陈平职称:
副教授
2014年12月26日
课程设计任务书
14/15学年第一学期
学院:
中北大学信息商务学院
专业:
电子信息工程
学生姓名:
学号:
学生姓名:
学号:
学生姓名:
学号:
学生姓名:
学号:
课程设计题目:
专用基本技能实践:
基于VC的BMP图像二值化处理平台
起迄日期:
2014年12月29日~2015年1月10日
课程设计地点:
C304教室
指导教师:
系主任:
下达任务书日期:
2014年12月26日
课程设计任务书
1.设计目的:
(1)掌握VC++程序开发平台;
(2)掌握对话框模式的可视化实现和按钮消息的响应;
(3)掌握应用VC++库函数实现BMP图像文件的打开、显示和二值化处理等功能。
2.设计内容和要求(包括原始数据、技术参数、条件、设计要求等):
(1)查阅相关资料,掌握基于面向对象的编程方法;
(2)主界面采用对话框或菜单模式,通过文件对话框,打开图像文件;
(3)通过控件控制关联,实现BMP图像数据的显示;
(4)通过对图像的灰度数据进行有条件的赋值,实现图像的二值化处理并显示。
(5)要求3位同学各自实现不同分工。
3.设计工作任务及工作量的要求〔包括课程设计计算说明书(论文)、图纸、实物样品等〕:
(1)要求设计组的每个成员都要了解设计的要求和思路;
(2)编写详细的设计说明书三份;
(3)要求有正确的运行结果及结果分析。
课程设计任务书
4.主要参考文献:
1王华,叶爱亮,祁立学等.VisualC++6.0编程实例与技巧.北京:
机械工业出版社,1999.
2李光明.VisualC++6.0经典实例大制作.北京:
中国人事出版社,2000.
3严华峰.VisualC++课程设计案例精编.北京:
中国水利水电出版社,2002.
4官章全,刘加明.VisualC++6.0类库大全.北京:
电子工业出版社,1999.
5张荣梅,梁晓林.VisualC++实用教程.北京:
冶金工业出版社,2004.
6魏亮,李春葆.VisualC++程序设计例学与实践.北京:
清华大学出版社,2006.
7陈清华,朱红.VisualC++课程设计案例精选与编程指导.南京:
东南大学出版社,2004.
5.设计成果形式及要求:
提供详细的设计说明书三份
软件设计结果
6.工作计划及进度:
2014年
12月29日~12月31日:
学习VC有关编程方法;
2015
1月1日~1月6日:
在指导教师指导下实现程序设计;
1月7日~1月9日:
撰写课程设计说明书;
1月10日:
答辩
系主任审查意见:
签字:
年月日
目录
一、设计目的----------------------------------------------------------------1
二、设计主要方案及理论介绍----------------------------1
三、设计主要步骤--------------------------------------2
四、运行结果------------------------------------------6
五、设计评述------------------------------------------7
六、参考文献------------------------------------------7
七、代码----------------------------------------------8
一、设计目的:
1.掌握VC++程序开发平台;
2.掌握对话框模式的可视化实现和按钮消息的响应;
3.掌握应用VC++库函数实现BMP图像文件的打开、显示和二值化处理等功能。
二、设计主要方案及理论介绍
通过vc实现bmp图像二值化处理
图像灰度变换模块
图像灰度变换模块实现了彩色图像变灰度格式,灰度图像变彩色格式和二值化操作。
经过分析图像灰度变换功能,得出图像处理的功能模块图如图4.4所示:
图灰度变换模块功能结构图
灰度变换类GrayTrans是在基类ImgCenterDib基础上派生出来的,灰度变换类设计代码如下:
classGrayTrans:
publicImgCenterDib
{
public:
intm_nBitCountOut;//输出图像每像素位数
unsignedchar*m_pImgDataOut;//输出图像位图数据指针
LPRGBQUADm_lpColorTableOut;//输出图像颜色表
private:
intm_imgWidthOut;//图像的宽,像素为单位
intm_imgHeightOut;//图像的高
intm_nColorTableLengthOut;//输出图像颜色表长度
public:
GrayTrans();//不带参数的构造函数
GrayTrans(CSizesize,intnBitCount,LPRGBQUADlpColorTable,
unsignedchar*pImgData);//带参数的构造函数
~GrayTrans();
CSizeGetDimensions();//以像素为单位返回输出图像的宽和高
voidBinary(intthreshold=128);//二值化
};
利用类向导,给相应的控件定义消息处理函数,如下表
表2主要的消息处理函数表
序号
ID号及类名
消息处理函数
函数功能
3
ID_BinTwo
OnBinTwo
二值化
在picture_sysView.cpp重载消息处理函数,这三个消息处理函数代码基本相似,共同操作伪代码如下:
三、设计主要步骤
新建
建立菜单找类文件名选择ClassView视图,编辑菜单资源选ResourceView视图。
单击File按Ctrl+w打开类向导
添加菜单处理函数
然后点击EditCode,直接复制代码就可
添加新类CDib类定义
在Dib.h中复制代码
添加类CDib类中处理函数定义
复制代码
程序运行,点击File,选择*.bmp文件,点击打开,在选择Process→2Value。
四、运行结果
原图
二值化处理后的图
5、设计评述
这次课程设计是以MicrosoftVisualC++6.0文档视图编程为基础实现的,这就要求对MFC文档视图操作有一定的了解和操作编程能力,在做课程设计前,我查阅了该方面相关的书籍,对我完成欢迎界面和主界面的设计有很大的帮助。
编程中在不同类之间函数参数和变量的传递和函数的调用出了问题,但是理清函数的编译编译顺序和变量的类型这些问题都逐一解决,同时增强了对工具栏,菜单栏的手动操作能力。
另外一点是对.bmp图像处理的实现,数字图像处理关键是算法的设计思想和算法的实现,通过这次课程设计,使我了解到了算法设计的重要性(算法设计是编程实现的前提),提高了自己动手编程的能力和汲取一些先进算法的思想,这对以后图像处理的深入学习大有帮助。
该数字图像界面是基于MicrosoftVisualC++6.0的MFC多文档实现的,在界面设计上看起来过于单调,界面设计简单,但易于操作;VisualC++6.0的MFC对话框的编程是界面看起来更加美观,更接近软件系统,给人不一样的感觉,提高了工具栏和菜单栏的编程实现难度和设计的复杂度,这是今后学习的方向。
六、参考文献:
[1]郑莉董渊张瑞丰,C++语言程序设计(第三版),清华大学出版社2003
[2]DavidJ.Kruglinski(美)等,VisualC++6.0技术内幕,北京希望电子出版社,2002
[3]谢凤英赵丹培,VisualC++数字图像处理,电子工业出版社,2008
[4]求是科技张宏林,精通VisualC++数字图像处理典型算法及实现,人民邮电出版社,2008
[5]刘锐宁宋坤等,VisualC++从入门到精通,清华大学出版社,2008
7、代码
//DIB.h
//添加新类CDib类定义
#ifndef__DIB_H__
#define__DIB_H__
#include"ShowDIB.h"
classCDib
{
public:
CDib();
~CDib();
BOOLDraw(CDC*pDC,intnX=-1,intnY=-1,intnWidth=-1,intnHeight=-1,intStyle=1);
BOOLSave(constchar*pszFilename);
BOOLLoad(constchar*);
BOOLSetPalette(CDC*);
//boolValid;
public:
intm_BitCount;
WORD*m_pWordData;
CPalettem_Palette;
unsignedchar*m_pDib,*m_pDibBits;
DWORDm_dwDibSize;
BITMAPINFOHEADER*m_pBIH;
RGBQUAD*m_pPalette;
intm_nPaletteEntries;
public:
boolConvertToTwoValue();
};
#endif
//DIB.cpp
//添加类CDib类中处理函数定义
#include"stdafx.h"
#include"DIB.h"
CDib:
:
CDib()
{
m_pDib=NULL;
m_pWordData=NULL;
}
CDib:
:
~CDib()
{
if(m_pDib!
=NULL)
delete[]m_pDib;
if(m_pWordData!
=NULL)
delete[]m_pWordData;
}
BOOLCDib:
:
Load(constchar*pszFilename)
{
CFilecf;
if(!
cf.Open(pszFilename,CFile:
:
modeRead))
return(FALSE);
DWORDdwDibSize;
dwDibSize=
cf.GetLength()-sizeof(BITMAPFILEHEADER);
pDib=newunsignedchar[dwDibSize];
if(pDib==NULL)
return(FALSE);
BITMAPFILEHEADERBFH;
try{
if(cf.Read(&BFH,sizeof(BITMAPFILEHEADER))
!
=sizeof(BITMAPFILEHEADER)||
BFH.bfType!
='MB'||
cf.Read(pDib,dwDibSize)!
=dwDibSize){
delete[]pDib;
return(FALSE);
}
}
catch(CFileException*e){
e->Delete();
delete[]pDib;
return(FALSE);
}
cf.Close();
if(m_pDib!
=NULL)
deletem_pDib;
m_pDib=pDib;
m_dwDibSize=dwDibSize;
m_pBIH=(BITMAPINFOHEADER*)m_pDib;
m_pPalette=
(RGBQUAD*)&m_pDib[sizeof(BITMAPINFOHEADER)];
m_nPaletteEntries=1<
if(m_pBIH->biBitCount>8)
m_nPaletteEntries=0;
elseif(m_pBIH->biClrUsed!
=0)
m_nPaletteEntries=m_pBIH->biClrUsed;
m_pDibBits=
&m_pDib[sizeof(BITMAPINFOHEADER)+
m_nPaletteEntries*sizeof(RGBQUAD)];
if(m_Palette.GetSafeHandle()!
=NULL)
m_Palette.DeleteObject();
if(m_nPaletteEntries!
=0){
LOGPALETTE*pLogPal=(LOGPALETTE*)newchar
[sizeof(LOGPALETTE)+
m_nPaletteEntries*sizeof(PALETTEENTRY)];
if(pLogPal!
=NULL){
pLogPal->palVersion=0x300;
pLogPal->palNumEntries=m_nPaletteEntries;
for(inti=0;i pLogPal->palPalEntry[i].peRed= m_pPalette[i].rgbRed; pLogPal->palPalEntry[i].peGreen= m_pPalette[i].rgbGreen; pLogPal->palPalEntry[i].peBlue= m_pPalette[i].rgbBlue; } m_Palette.CreatePalette(pLogPal); delete[]pLogPal; } } m_BitCount=8; return(TRUE); } BOOLCDib: : Save(constchar*pszFilename) { if(m_pDib==NULL) return(FALSE); CFilecf; if(! cf.Open(pszFilename, CFile: : modeCreate|CFile: : modeWrite)) return(FALSE); try{ BITMAPFILEHEADERBFH; memset(&BFH,0,sizeof(BITMAPFILEHEADER)); BFH.bfType='MB'; BFH.bfSize=sizeof(BITMAPFILEHEADER)+m_dwDibSize; BFH.bfOffBits=sizeof(BITMAPFILEHEADER)+ sizeof(BITMAPINFOHEADER)+ m_nPaletteEntries*sizeof(RGBQUAD); cf.Write(&BFH,sizeof(BITMAPFILEHEADER)); cf.Write(m_pDib,m_dwDibSize); } catch(CFileException*e){ e->Delete(); return(FALSE); } return(TRUE); } BOOLCDib: : Draw(CDC*pDC,intnX,intnY,intnWidth,intnHeight,intStyle) { longi,j; if(m_pDib==NULL) return(FALSE); longvWidth=(4-m_pBIH->biWidth%4)%4+m_pBIH->biWidth; /*if(m_BitCount! =8) { for(i=0;i for(j=0;j { *(m_pDibBits+i*vWidth+j)=(m_pWordData[i*m_pBIH->biWidth+j]>>(m_BitCount-8)); } } elseif(m_BitCount==16) { for(i=0;i { m_pDibBits[i]=(m_pWordData[i]>>8); } } */ if(nWidth==-1) nWidth=m_pBIH->biWidth; if(nHeight==-1) nHeight=m_pBIH->biHeight; if(Style) { StretchDIBits(pDC->m_hDC,nX,nY, nWidth,nHeight, 0,0, m_pBIH->biWidth,m_pBIH->biHeight, m_pDibBits, (BITMAPINFO*)m_pBIH, BI_RGB,SRCCOPY); } else { SetDIBitsToDevice(pDC->m_hDC,nX,nY, m_pBIH->biWidth,m_pBIH->biHeight, 0,0, 0,m_pBIH->biHeight, m_pDibBits, (BITMAPINFO*)m_pBIH, BI_RGB); } return(TRUE); } BOOLCDib: : SetPalette(CDC*pDC) { if(m_pDib==NULL) return(FALSE); if(m_Palette.GetSafeHandle()==NULL) return(TRUE); pOldPalette=pDC->SelectPalette(&m_Palette,FALSE); pDC->RealizePalette(); pDC->SelectPalette(pOldPalette,FALSE); return(TRUE); } boolCDib: : ConvertToTwoValue() { DWORDi,size; unsignedchar*p; //一个二值化程序 //以128为界划分 p=m_pDibBits; size=m_dwDibSize-(m_pDibBits-m_pDib); for(i=0;i { if(*p<128) { *p=0; } else { *p=255; } p++; } returntrue; } voidCShowDIBView: : OnFileOpen()//打开一张bmp图像 { staticcharszFilter[]="BMPFiles(*.BMP)|*.BMP|AllFiles(*.*)|*.*||"; CFileDialogFileDlg(TRUE,NULL,NULL, OFN_HIDEREADONLY,szFilter); if(FileDlg.DoModal()==IDOK&& m_Dib.Load(FileDlg.GetPathName())){ InvalidateRect(NULL,TRUE); UpdateWindow(); } } voidCShowDIBView: : OnFileSave()//文件保存 { //TODO: Addyourcommandhandlercodehere staticcharszFilter[]="BMPFiles(*.BMP)|*.BMP|AllFiles(*.*)|*.*||"; CFileDialogFileDlg(FALSE,"bmp",NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter); if(FileDlg.DoModal()==IDOK&& m_Dib.Save(FileDlg.GetPathName())){ InvalidateRect(NULL,TRUE); UpdateWindow(); } } voidCShowDIBView: : OnPROCESS2value() { //TODO: Addyourcommandhandlercodehere if(m_Dib.ConvertToTwoValue()) { InvalidateRect(NULL,TRUE); UpdateWindow(); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 基于 VC BMP 图像 二值化 处理 平台 精品