基于VC++的图像处理软件模块设计(3)

2019-04-15 15:40

3.2.3.2父类

由于MFC中已有一个支持DDB操作的CBitmap类,因此,很直观的想法是,以CBitmap类为父类派生出的CDib类。但是,从长远考虑,这样做并没有什么好处。首先,CBitmap类是为DDB的操作而设计的,其中没有处理DIB的功能,因此CDib类不能从中继承任何可用的功能。其次,CBitmap类是从CGdiobject中派生来的,CBitmap类以及它从CGdiobject类继承来的数据成员和功能函数对CDib类来说都是不合适的,也是多余的。此外,CBitmap类没有提供有效的文件操作机制。而DIB主要是一种“外部”位图,即它主要以文件形式进行存储和交换,所以CDib类应该能很好的处理文件操作。

MFC中的CObject类是MFC中其他大多数类的根类和基类。它不但提供许多有用的特性,还包括对文件串行化的支持,运行时类信息和对象诊断的输出等。如果从CObject类派生类,则可继承该类的这些特性。另外,CObject类具有最低限度的成员数据和函数,从CObject类派生类所付出的代价是最低的。因此,采用CObject类作为CDib类的父类是很合理的。

从CObject类派生一个类时,可以从如下4个层次的功能中进行选择。

(1) 基本功能:不支持运行时的类信息和串行化,但包含内存诊断处理; (2) 基本功能加上对运行时的类信息的支持;

(3) 基本功能加上对运行时的类信息和动态创建的支持;

(4) 基本功能加上对运行时的类信息、动态创建和串行化的支持;

CObject类的派生类利用几个宏来实现对上述功能的支持,如表3-3所示。

表3-3 用于支持运行时的类信息和串行化 宏 动态创建串行化支持运行时的类型信息(CrunTimeClass::(Carchive::Operator>> (CObject::IsKindof) CreateObject) Carchive::Operator<<) No No No No Yes Yes No No Yes 基本CObject功能 DECLARE_DYNAMIC Yes DECLARE_DYNCREATE Yes DECLARE_SERIAL Yes 由于文件操作对DIB来说很重要的,所以串行化操作是CDib类必须从CObject中继承下来的特性。串行化指在文件中读写对象的过程,MFC把CArchive类的对象作为要串行化的对象和存储媒体之间的桥梁。CArchive类对象用重载的插入操作符(<<)和抽取操作符(>>)来执行读写操作。

要在类中支持串行化,需要在定义类时做如下操作: (1) 以CObject类为父类来派生类;

(2) 覆盖CObject类的虚函数Serialize; (3) 在类的说明使用DECLARE_SERIAL宏; (4) 定义一个不带参数的构造函数;

(5) 在类的实现文件中IMPLEMENT_SERIAL宏。 3.2.3.3数据封装

面向对象方法的一个重要特征就是数据封装。即将类的成员数据隐藏在类中,外界只能通过类的成员函数来操作类的成员数据。这是面对对象方法的重要有点,它可以保护类中的数据不受外部的意外修改。但是,过分“纯粹”的数据封装,需要付出降低程序效率的代价。特别是在设计像CDib这样需要大量使用Win32 API函数的类时,这种缺陷特别突出。因为操作DIB的API函数大多需要一些DIB的属性作为参数。如果硬要将这些属性封装起来,则需要在类中重新实现许多Win32 API函数。这不但要花费很大的精力,而且还可能因此而产生错误和低效。

9

所以,在设计CDib时应采用既尽可能保证数据非封装,又能保证效率的提高。 3.2.3.4继承

CDib类的另一个设计目标应该考虑到,今后可能需要从CDib类中派生子类,即注意其可继承性。通过将有关的成员函数定义为虚函数,可以保证在派生类中重载它们,以支持继承中的多样性。

4 数字图像处理

图像处理就是用一系列特定操作来改变图像的像素,以达到特定的目标,比如使图像跟清晰,或从图像中提取某些特定的信息等。数字图像处理是现代图像处理的主要方法,具有再现性好,精度高,适用面广和灵活性大的优点。

数字图像处理由数字处理系统完成,其结构如图4-1所示。它主要包括图像采集系统、计算机图像处理系统和图像输出系统3部分。

图4-1 图像处理系统

计算机图像处理系统由计算机软硬件系统组成。计算机图像处理的软件系统是基于数字图像处理的理论和算法而设计的一系列程序,用以实现图像的增强、变换、变形、压缩和彩色处理等操作。

数字图像处理的内容非常丰富,是现代计算机的重要应用方向,从功能上可以将数字图像处理划分为3大类,如图4-2所示。

10

图4-2 数字图像处理功能划分

从图像处理对图像像素的处理方式上可以划分为点处理和区域处理两种。点处理是一种输出像素值仅取决于输入像素值的图像处理方法;区域处理的输出像素值不仅与输入像素值有关,而且与输入像素在一定范围内的相邻像素值有关。 4.1图像处理的基本方法

基本的图像处理方法可分为点处理和区域处理两类。

点处理相对较简单,只能改变图像的灰度分布,但不会改变图像内的空间关系。点处理可以按预定的方式改变图像的灰度直方图。最常用的点处理是灰度直方图均衡。区域处理在处理某一像素时,利用与该像素相邻的一组像素,经过某种变换得到处理后图像中某一点的像素值。目标像素的邻域一般是由像素组成的二维矩阵,该矩阵的大小为奇数。目标像素位于该矩阵的中央,即目标像素就是区域的中心像素。经过处理后,目标像素的值为经过特定算法计算后所得的结果。区域中心像素周围的那些像素值在二维方向上提供了图像的亮度变化趋势的信息。图像中像素的亮度在一定距离上的变化速率称为图像的空间频率。区域处理将改变图像的空间频率信息,减缓或增强图像中的某些特定的频率分量[13]。

主要的区域处理算法有卷积法、中值滤波法和Sobel边缘检测法。我们这里只介绍卷积法。 (1) 卷积原理

卷积可以简单地看成加权求和的过程。卷积时使用的权用一个很小的矩阵来表示,矩阵的大小是奇数,而且与使用的区域的大小相同。这种权矩阵叫做卷积核,区域中的每个像素分别与卷积核中的每个元素相乘,所有乘积之和即为区域中心像素的新值。卷积核中各元素叫做卷积系数。卷积核中卷积系数的大小、方向及排列次序决定了卷积的图像处理效果。大多数常用的卷积核都是3×3的,所有卷积核的行、列数都是奇数[14]。 (2) 低通滤波:图像平滑与模糊

低通滤波的基本思路是保留图像空间频率的低频成分,减少图像的高频成分。低通滤波可以降低图像中的视觉噪声,同时除去图像中的高频部分后,图像中那些本来不明显的低频成分就更容易识别了[15]。 (3) 高通滤波:图像锐化与清晰

高通滤波增强图像的高频空间频率成分,阻挡低频中间频率成分。相对于高频成分来说,低频成分被削弱了。在需要突出图像中的高频成分时,可对图像进行高通滤波。 (4) 平滑与锐化

对图像进行低通滤波将使图像平滑;而对图像进行高通滤波将使图像锐化。因此图像的平滑与锐化处理实际上就是对图像进行低、高通滤波,即用低、高通滤波器作为卷积核来对图像进行卷积处理。 (5) 图像描述的形态学方法

“形态学”是描述动植物形态和结构的一门生物学分支,这里借用来指一种图像处理的方法。图像处理的形态学方法是一种“数学形态学”方法,用来提取图像成分,并据此来对图像区域的形状进行表示和描述。数学形态学的数学语言是集合理论,其中的集合代表图像中物体的形状。图像处理中常用的数学形态学方法包括腐蚀、膨胀、开、闭、边缘提取和图像细化等。 4.2图像处理软件设计 4.2.1设计步骤和要点

用Visual C++编制ImageProcess的步骤和要点如下:

(1)使用AppWizard生成一个基于多文档的项目ImageProcess; (2)将CImageProcessView类的基类设为CScrollView类;

11

(3)将DIBAPI.H,DIBAPI.CPP,DIB.H和DIB.CPP增加到ImageProcess项目中; (4)将String Table中的字符串资源IDR_TRANSFTYPE修改为:

\\nDib\\ nDib\\ nDib Files (*.bmp; *.dib)\\n.bmp\\nImageProcess.Document\\nImageP Document;

(5)在CImageProcessDoc类中增加一个表示CDib对象指针公共数据成员m_pDib,并在CImageProcessDoc类的构造函数中初始化它;

(6)在CImageProcessDoc类重载的成员函数Serialize的最开始处增加一行语句: m_pDib->Serialize(ar);

(7)修改CImageProcessView类的OnInitialUpdate函数如下: Void CImageProcessView:::OnInitialUpdate() {

CScrollView::OnInitialUpdate();

CImageProcessDoc * pDoc =GetDocument(); Csize sizeTotal(pDoc->m_pDib->GetWidth(), pDoc->m_pDib->GetHeight());

SetScrollSizes(MM_TEXT,sizeTotal);

CMainFrame *pAppFrame=( CMainFrame *) AfxGetApp()->m_pMainWnd; ASSERT_KINDOF(CMainFrame, pAppFrame); CRect rc;

PAppFrame->GetClientRect(&rc);

If (rc.Width() >= sizeTotal.cx && rc.Height() >= sizeTotal.cy && (sizeTotal.cx>0|| sizeTotal.cy>0)) ResizeParentToFit(FALSE); }

(8) 在CImageProcessView:::OnDraw函数中调用CDib::Display函数显示DIB: Void CImageProcessView:::OnDraw (CDC*pDC) {

CImageProcessDoc * pDoc =GetDocument(); ASSERT_VALID(pDoc);

If (!pDoc->m_pDib->IsEmpty()) pDoc-> m_pDib->Display(Pdc,0,0);

}

(9) 用ClassWizard给个菜单命令增加处理函数,包括COMMAND和UPDATA_COMMAND_UI处理函数;

(10)各菜单命令的UPDATA_COMMAND_UI处理函数结构相同,在函数中,将菜单命令的有效条件设为m_pDib不为空;

(11)由于每一种图像处理算法都涉及一个处理的强度,需要调用一个相同的对话框来获取参数。先在资源编辑器中建立该对话框模版IDD_CONVOLUTE,用classWizard为它创建对应的对话框类,并在类代码中实现有关的代码;

(12)调用相应的处理函数实现每一种图像处理的处理函数; (13)协调调色板;

(14)在项目工程中加入输入库winmm.lib,使Delay函数调用的timeGetTime函数能被正确连接。 4.2.2主界面设计

数字图像处理软件主界面,考虑到图像处理的方便,决定采用多文档界面。如图4-3所示。

12

图4-3 数字图像处理软件主界面

4.2.3菜单设计

主菜单如图4-4所示,包括文件、编辑、查看、窗口、图像变换、艺术效果、平锐、边缘检测、边缘增强等菜单项。

图4-4 数字图像处理软件主菜单

另外,图像变换菜单中含有快速傅里叶变换和余弦变换等子菜单;艺术效果中有浮雕和油画等子菜单;边缘检测中有Sobel边缘检测、Hough边缘检测、Canny边缘检测、均匀边缘检测和差异边缘检测等子菜单;边缘增强菜单中有垂直边缘和水平边缘等子菜单;图像形态学中有腐蚀、膨胀、开运算、闭运算,边缘提取等子菜单。如图4-5所示。

13


基于VC++的图像处理软件模块设计(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:绍兴市水务集团有限公司2016年度第一期超短期融资券募集说明书

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: