课程设计--基于VC的BMP图像二值化处理平台-精品
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计--基于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王华, 叶爱亮, 祁⽴学等. Visual C++ 6.0 编程实例与技巧. 北京:机械⼯业出版社, 1999.
2李光明. Visual C++ 6.0 经典实例⼤制作. 北京:中国⼈事出版社,2000.
3严华峰. Visual C++ 课程设计案例精编. 北京:中国⽔利⽔电出版社,2002.
4官章全, 刘加明. Visual C++ 6.0 类库⼤全. 北京:电⼦⼯业出版社,1999.
5张荣梅,梁晓林. Visual C++实⽤教程. 北京:冶⾦⼯业出版社,2004.
6魏亮,李春葆. Visual C++程序设计例学与实践. 北京:清华⼤学出版社,2006.
7陈清华, 朱红. Visual C++课程设计案例精选与编程指导. 南京:东南⼤学出版社,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基础上派⽣出来的, 灰度变换类设计代码如下:
class GrayTrans:public ImgCenterDib
{
public:
int m_nBitCountOut; //输出图像每像素位数
unsigned char * m_pImgDataOut; //输出图像位图数据指针
LPRGBQUAD m_lpColorTableOut; //输出图像颜⾊表
private:
int m_imgWidthOut; //图像的宽,像素为单位
int m_imgHeightOut; //图像的⾼
int m_nColorTableLengthOut; //输出图像颜⾊表长度
public:
GrayTrans();//不带参数的构造函数
GrayTrans(CSize size, int nBitCount, LPRGBQUAD lpColorTable,
unsigned char *pImgData); //带参数的构造函数
~GrayTrans();
CSize GetDimensions();//以像素为单位返回输出图像的宽和⾼
void Binary(int threshold=128); //⼆值化
};
利⽤类向导,给相应的控件定义消息处理函数,如下表
表2 主要的消息处理函数表
序号 ID 号及类名消息处理函数函数功能
3
ID_BinTwo
OnBinTwo
⼆值化
在picture_sysView.cpp 重载消息处理函数,这三个消息处理函数代码基本相似,共同操作伪代码如下:
三、设计主要步骤
新建
获取⽂档类中m_dib 的指针,访问当前DIB 数据;
判断灰度图像还是彩⾊图像;
分别定义GrayTrans 类的对象,调⽤相应的函数;
建⽴⼀个新视图,显⽰分割结果;
建⽴菜单找类⽂件名选择ClassView视图,编辑菜单资源选ResourceView视图。
单击File按Ctrl+w打开类向导
添加菜单处理函数
然后点击Edit Code,直接复制代码就可
添加新类CDib类定义
在Dib.h中复制代码
添加类CDib类中处理函数定义
复制代码
程序运⾏,点击File ,选择*.bmp ⽂件,点击打开,在选择Process →2Value 。
四、运⾏结果
原图
⼆值化处理后的图
五、设计评述
这次课程设计是以Microsoft Visual C++ 6.0 ⽂档视图编程为基础实现的,这就要求对MFC⽂档视图操作有⼀定的了解和操作编程能⼒,在做课程设计前,我查阅了该⽅⾯相关的书籍,对我完成欢迎界⾯和主界⾯的设计有很⼤的帮助。
编程中在不同类之间函数参数和变量的传递和函数的调⽤出了问题,但是理清函数的编译编译顺序和变量的类型这些问题都逐⼀解决,同时增强了对⼯具栏,菜单栏的⼿动操作能⼒。
另外⼀点是对.bmp图像处理的实现,数字图像处理关键是算法的设计思想和算法的实现,通过这次课程设计,使我了解到了算法设计的重要性(算法设计是编程实现的前提),提⾼了⾃⼰动⼿编程的能⼒和汲取⼀些先进算法的思想,这对以后图像处理的深⼊学习⼤有帮助。
该数字图像界⾯是基于Microsoft Visual C++ 6.0的MFC多⽂档实现的,在界⾯设计上看起来过于单调,界⾯设计简单,但易于操作; Visual C++ 6.0的MFC对话框的编程是界⾯看起来更加美观,更接近软件系统,给⼈不⼀样的感觉,提⾼了⼯具栏和菜单栏的编程实现难度和设计的复杂度,这是今后学习的⽅向。
六、参考⽂献:
[1] 郑莉董渊张瑞丰, C++语⾔程序设计(第三版), 清华⼤学出版社 2003
[2]David J.Kruglinski(美)等, Visual C++ 6.0技术内幕,北京希望电⼦出版
社,2002
[3]谢凤英赵丹培, Visual C++ 数字图像处理,电⼦⼯业出版社,2008
[4]求是科技张宏林,精通Visual C++ 数字图像处理典型算法及实现,⼈民邮电出版社,2008
[5]刘锐宁宋坤等, Visual C++从⼊门到精通,清华⼤学出版社,2008
七、代码
// DIB.h
//添加新类CDib类定义
#ifndef __DIB_H__
#define __DIB_H__
#include "ShowDIB.h"
class CDib
{
public:
CDib();
~CDib();
BOOL Draw( CDC *pDC, int nX = -1, int nY = -1, int nWidth = -1, int nHeight = -1, int Style = 1);
BOOL Save( const char *pszFilename );
BOOL Load( const char * );
BOOL SetPalette( CDC * );
// bool Valid;
public:
int m_BitCount;
WORD * m_pWordData;
CPalette m_Palette;
unsigned char *m_pDib, *m_pDibBits;
DWORD m_dwDibSize;
BITMAPINFOHEADER *m_pBIH;
RGBQUAD *m_pPalette;
int m_nPaletteEntries;
public:
bool ConvertToTwoValue();
};
#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;
}
BOOL CDib::Load( const char *pszFilename )
{
CFile cf;
if( !cf.Open( pszFilename, CFile::modeRead ) ) return( FALSE );
DWORD dwDibSize;
dwDibSize =
cf.GetLength() - sizeof( BITMAPFILEHEADER );
pDib = new unsigned char [dwDibSize];
if( pDib == NULL )
return( FALSE );
BITMAPFILEHEADER BFH;
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 )
delete m_pDib;
m_pDib = pDib;
m_dwDibSize = dwDibSize;
m_pBIH = (BITMAPINFOHEADER *) m_pDib;
m_pPalette =
(RGBQUAD *) &m_pDib[sizeof(BITMAPINFOHEADER)]; m_nPaletteEntries = 1 << m_pBIH->biBitCount;
if( m_pBIH->biBitCount > 8 )
m_nPaletteEntries = 0;
else if( 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 *) new char [sizeof(LOGPALETTE)+
m_nPaletteEntries*sizeof(PALETTEENTRY)];
if( pLogPal != NULL ){
pLogPal->palVersion = 0x300;
pLogPal->palNumEntries = m_nPaletteEntries;
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 );
}
BOOL CDib::Save( const char *pszFilename )
{
if( m_pDib == NULL )
return( FALSE );
CFile cf;
if( !cf.Open( pszFilename,
CFile::modeCreate | CFile::modeWrite ) )
return( FALSE );
try{
BITMAPFILEHEADER BFH;
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 ){
return( FALSE );
}
return( TRUE );
}
BOOL CDib::Draw( CDC *pDC, int nX, int nY, int nWidth, int nHeight, int Style ) {。