- 1 -
中国科技论文在线
基于 VC++的可视化图像处理系统的实现
康耀尹,赵学军*
作者简介:康耀尹,女,本科生
(中国矿业大学(北京)计算机科学与技术系,北京 100083)
摘要:信息技术的蓬勃发展,尤其是计算机处理数据能力的不断增强,为数字图像技术的飞
速发展提供了广阔的空间,因此开发一个好的图像处理软件至关重要。本文以 VC++为开发
环境,运用MFC设计思想,设计了一套可视化图像处理系统。该系统实现了图像处理领域
的大部分常用算法,且系统界面友好,使用起来非常方便。
关键词: 数字图像处理;VC++;MFC;可视化
中图分类号:
Realization of Visual Image Processing System Based on
VC++ Language
Kang Yaoyin, Zhao Xuejun
(Department of Computer Science and Technology,China University of Mining and
Technology(Beijing),Beijing 100083)
Abstract: With the rapid development of information technology, especially the enhancement of
computers’operational capability, it provides wide space to the application of digital image
processing,so,it is of vital importance to develop a good image processing software. In this paper, a set
of visual image processing system is designed based on VC++ environment and design idea of
MFC and it implements most of image processing ,this system has a very friendly
interface and can be used easily.
Keywords: digital image processing;VC++;MFC;visual
0 引言
图像是人类获取信息、表达信息和传递信息的重要手段。因此,数字图像处理技术已经
成为信息科学、计算机科学、工程科学、地球科学等诸多方面的学者研究图像的有效工具。
数字图像处理,指利用计算机对数字图像进行系列操作,从而获得某种预期结果的技术[1]。
主要包括如下内容:几何处理、算术处理、图像增强、图像复原、图像重建、图像编码、图
像识别、图像理解等。随着计算机在数据处理方面的应用,数字图像处理技术也得到飞速发
展,它广泛应用于空间探测、遥感、生物医学、人工智能以及工业检测等许多领域,并促使
这些学科产生了新的发展[2]。
目前,国内外有很多专门用于图像处理的软件,但是各个软件的侧重点有所不同。并且
图像处理的算法也是千变万化的,所以在实际中,通常需要设计有针对性的图像处理系统以
便学习。本文在 VC++ 开发环境下设计了一套小型数字图像处理系统,操作起来方便简
单。
1 可视化图像处理系统开发技术基础
C++语言特点
C++语言有很高的代码效率,速度比 Matlab 编写的代码快几倍甚至几十倍,由于图像
- 2 -
中国科技论文在线
处理涉及大量数据的复杂运算,故需要选择编码效率高的语言来对其进行处理。C++语言在
图像处理方面的应用非常广泛,另外,采用 C++进行图像编程的原因是它在内存使用的可控
性和编程的灵活性上具有优势。
VC++开发平台简介
VC++是在 Windows 平台下构建 32 位应用程序的强大而又复杂的开发工具,从图形图
像处理到游戏开发,VC++无所不在,它是直接基于 C++的,提供了方便的可视化操作平台,
本设计中主要利用随其一起发布的 MFC 进行系统界面的开发。MFC 是一套 C++类的集合,
利用这些类可以有效的完成 Windows 应用程序的开发,各种类结合起来构成了一个应用程
序框架,AppWizard 可以用来生成初步的框架文件;资源编辑器用于帮助直观地设计用户接
口;ClassWizard 用来协助添加代码到框架文件;最后,编译,则通过类库实现了应用程序
特定的逻辑,采用 MFC 设计思想简化了编程模式,提高了系统开发速度[3]。
2 图像的数字化
从计算机科学的角度来看,所谓数字图像可以理解为对二维函数 f(x,y)进行采样和量化
后得到的图像,因此,通常用二维矩阵来表示一幅数字图像。
采样与量化
采样是对图像空间坐标的离散化,它决定了图像的空间分辨率。就是利用一个网格把待
处理的图像覆盖,然后把每一小格上模拟图像各个亮度取平均值,作为该小方格中点的值;
或者把方格的交叉点处模拟图像的亮度值作为该方格交叉点上的值。这个网络称为采样网
络,采样后形成的图像称为数字图像。对一幅图像采样时,若每行像素为 M 个,每列像素
为 N 个,从而 f(x,y)构成一个 M*N 的实数矩阵:
⎥⎥
⎥⎥
⎦
⎤
⎢⎢
⎢⎢
⎣
⎡
−−−−
−
−
)1,1(...)1,1()0,1(
............
)1,1(...)1,1()0,1(
)1,0(...)1,0()0,0(
MNfNfNf
Mfff
Mfff
矩阵中每个采样点代表一个像素。此外,采样时应合理选择采样间隔,因为它决定了图
像采样后的质量高低[1]。经过采样的图像实现了在空间上的离散化,但像素灰度值仍是连续
的,因此需要将其量化。
量化的方法包括:分层量化、均匀量化、和非均匀量化。分层量化是把每一个离散样本
的连续灰度值只分成有限多的层次,均匀量化是把原图像灰度层次从最暗至最亮均匀分为有
限个层次,如果采用不均匀分层就称为非均匀量化。但是量化也会带来误差,量化分层越多,
则误差越小,但是分层越多,则编码进入计算机所需比特数越多,影响运算速度。所以,应
根据实际情况作出选择[1]。
数字图像的基本类型
计算机一般采用两种方式存储静态图像:一种是位映射;另一种是向量处理。前者是通
过许多像素点表示一幅图像,而矢量图只存储图像轮廓部分,而不是存储图像数据的每一点。
由于矢量图有一个明显缺点,不易制作色调丰富或色彩变化太多的图像,而且绘出图像
不是很逼真,所以经常处理的是位图。位图包括二值图像,灰度图像,伪彩色图像和真彩色
图像四种。
- 3 -
中国科技论文在线
二值图像
单色像中每个像素点仅占一位,其值只有 0 或 1,0 代表黑,1 代表白,或相反。因为
图像中的每个像素仅需 1 位信息,常把单色图像称为是 1 位图像。单色图像具有比简单的格
式,一般由黑色区域和白色区域组成[4]。
灰度图像
灰度图像的存储文件带有图像颜色表,此颜色表共有 256 项,图像颜色表中每表项由红、
绿、蓝颜色分量组成,且红、绿、蓝颜色分量值都相等,即:
),(),(),( yxfyxfyxf bluegreenred ==
每个像素由 8 位组成,其值范围从 0~255,表示 256 种不同的灰度级。每个像素的像
素值 f (x,y)是图像颜色表的表项入口地址[4]。
伪彩色图像
伪彩色图像与灰度图像相似,存储文件中也带有图像颜色表,伪彩色图像具有如下特征:
(1)图像颜色表中的红、绿、蓝颜色分量值不全等,即:
),(),(),( yxfyxfyxf bluegreenred ≠≠
(2)整幅图像仅有 256 种不同的颜色,像素必须由 8 位组成,每个像素的像素值不是
由每个基色分量的数值直接决定,而是把像素值当作图像颜色表的表项入口地址。把具有
256 色的图像称为 8 位彩色图像[4]。
真彩色图像
具有全彩色照片表达能力的图像为 24 位彩色图像,24 位真彩色图像存储文件中不带有
图像颜色表,其具有如下特征:
(1)图像中每一像素由 RGB 三个分量组成,每个分量各占 8 位,每个像素需 24 位;
(2) ),(),,(),,( yxfyxfyxf bluegreenred 取值范围为 0~255。由于 24 位真彩色图像所需的
存储空间很大,处理速度较慢,当需要的存储空间不大,并且要求实时快速处理图像时,一
般都要利用相应的 8 位位图对其进行近似处理,因此 8 位位图是图像技术中涉及范围比较广
泛的一种图像表示方法[4]。
本系统处理的位图文件格式
常用的图像处理文件存存储格式主要有 BMP、JPEG、PCX、TIFF 以及 GIF 等,但是本
系统处理的图片文件格式是 Windows 操作系统推荐和支持的 BMP 格式,即设备无关位图,
这种文件格式的图像数据是未压缩的,反应的是原始图像数据,适合进行处理,它主要包括
四部分内容:位图文件头(BITMAPFILEHEADER)、位图信息头(BITMAPINFOHEADER)、
颜色板及图像数据,以下是各部分的详细信息[5]:
(一)位图文件头结构(BITMAPFILEHEADER):
typedef struct tagBITMAPFILEHEADER{
WORD bfType; //文件类型,必须是 0×424D,即字符串“MB”,代表位图文件
DWORD bfSize; //指定文件大小,包括该结构体的 14 个字节。其中 WORD 为无符号
16 位整数,2 个字节;DWORD 为无符号 32 位整数,4 字节
WORD bfReserved1; //不用考虑
WORD bfReserved2; //不用考虑
- 4 -
中国科技论文在线
DWORD bfOffBits; //指从文件头到实际位图数据的偏移字节数,即文件头、信息头
和调色板的字节之和。
}BITMAPFILEHEADER;
(二)位图信息头(BITMAPINFOHEADER):
typedef struct tagBITMAPFILEHEADER{
DWORD biSize; //指该结构体的大小,DWORD 为 40 个字节。LONG 型是 4 个字节
LONG biWidth; //指图像的宽度,单位是像素
LONG biHeight; //指图像的高度,单位是像素
WORD biplanes; //必须是 1
WORD biBitCount; //指图像数据位数。常用值有 1( 12 色)、4( 42 色)、8( 82
色)、
24(224色)、32(232色)
DWORD biCompression; //指定位图是否压缩。如果该值等于 BI_RGB,表示图像为
非压缩格式
DWORD biSizeImage; //指图像数据的大小
LONG biXPelsPerMeter; //指目标设备的水平分辩率,单位是每米的像素个数
LONG biYPelsPerMeter; //指目标设备的垂直分辩率,单位是每米的像素个数
DWORD biClrUsed; //指图像用到的颜色数,如果该数为 0,则用到的颜色数为 2
的 biBitCount 次方
DWORD biClrImportant; //指图像中重要的颜色数,如果该值为 0,则认为所有的颜
色都是重要的
}BITMAPFILEHEADER;
(三)调色板
typedef struct tagRGBQUAD{
BYTE rgbBlue; //该颜色的蓝色分量
BYTE rgbGreen; //该颜色的绿色分量
BYTE rgbRed; //该颜色的红色分量
BYTE rgbReserved; //保留值
}RGBQUAD;
(四)图像数据
对于用到调色板的位图,图像数据就是该像素颜色在调色板中的索引值。对于真彩色图
像,图像数据就是实际的 R、G、B 值,一个像素是由 3 个字节 24 位组成,第 1 个字节(前
8 位)表示 B,第 2 个字节(中间 8 位)表示 G、第 3 个字节(后 8 位)表示 R。需要注意
的是,BMP 文件是从下到上,从左到右排列的,即读文件时,最先读到的是图像最下面一
行的左边第一个像素,最后读到的是最上面一行的最右一个像素。
3 可视化图像处理系统设计分析
本系统是在 VC++ 开发环境下,基于 MFC 的多文档应用程序(MDI)进行设计的,
这样有利于对比图像处理前后的结果,并且界面友好,凡是需要用户输入参数的都设计了参
数对话框,当用户输入有误时,系统也会提示错误信息,通过对话框设置实现了图像的交互
处理。系统主要包括程序启动界面和主界面的设计,其中启动界面可以为系统带来美观的效
- 5 -
中国科技论文在线
果,总体设计图如下所示:
图 1 系统总体设计
Overall System Design
特效显示模块:该模块实现了图像的扫描显示,滑动显示,渐进显示和马赛克显示。
灰度变换模块:该模块实现了彩色图像灰度化,灰度线性拉伸,反相,直方图绘制以及直
方
图均衡等操作。
几何变换模块:该模块实现了图像的平移,镜像变换,旋转以及缩放操作。
图像增强模块:该模块实现了为图像添加噪声如椒盐噪声、高斯噪声,对图像进行平滑如
邻域平滑、加权平滑、中值平滑,对图像锐化如梯度锐化、拉普拉斯锐化的功能。
图像变换模块:该模块主要实现了对图像进行快速傅里叶变换及快速傅里叶反变换,离
散余弦变换及其反变换的操作。
图像分割模块:该模块实现了图像的阈值分割如最大方差阈值分割,图像边缘检测包括
Roberts 算子、Sobel 算子、Gauss-Laplacian 算子、Krisch 算子检测,图像的轮廓提取及边界
跟踪。
图像复原模块:该模块实现对运动模糊图像的逆滤波及维纳滤波操作。
形态学模块:该模块实现对二值图像的腐蚀、膨胀、开、闭操作。
4 系统设计的实现
启动界面设计的实现
启动界面的设计是通过向应用程序中添加 VC++ 组件中的 Splash screen 组件而实现
的,添加该组件后,应用程序会自动生成 CsplashWnd 类,该类是 CWnd 的派生类。在
CSplashWnd 类中的 OnCreate 函数中的定时器 SetTimer(1, 4000, NULL)设置的时间隔就是启
动画面的显示的时间,在此设置的显示时间是 4s,然后利用 ClassWizard 为 CsplashWnd 类
启动界面
主界面
文
件
处
理
图
像
处
理
打
开
图
像
保
存
图
像
另
存
图
像
特
效
显
示
灰
度
变
换
几
何
变
换
图
像
增
强
图
像
变
换
图
像
分
割
图
像
复
原
形
态
学
处
理
- 6 -
中国科技论文在线
添加 WM_TIMER 消息,隐藏启动画面;如果系统收到键盘或者鼠标单击消息时也会自动隐
藏启动画面。启动画面如下图所示:
图 2 启动界面
Start Interface
主界面设计的实现
基类的设计实现
设备无关位图(DIB)不依赖于具体设备进行显示,并且图像数据未被压缩,其通用性
很强,DIB 一般是以*.BMP 文件的形式保存在磁盘中的。但 MFC 只封装了对设备相关位图
(DDB)的操作,而 Windows 支持的一些重要的 DIB 访问函数,都没有封装到 MFC 中,为此,
在本设计中必须重新构造一个类 CDib,用来封装处理 DIB 位图所需要的成员函数和成员变
量,该类的构造如下[5]:
class CDib
{ public:
unsigned char * m_pImgData; //图像数据指针
LPRGBQUAD m_lpColorTable; //图像颜色表指针
int m_nBitCount; //每像素占的位数
private:
LPBYTE m_lpDib; //指向 DIB 的指针
HPALETTE m_hPalette; //逻辑调色板句柄
int m_nColorTableLength; //颜色表长度(多少个表项)
protected:
int m_imgWidth; //图像的宽,像素为单位
int m_imgHeight; //图像的高,像素为单位
LPBITMAPINFOHEADER m_lpBmpInfoHead; //图像信息头指针
public:
CDib(); //不带参数的构造函数
CDib(CSize size, int nBitCount, LPRGBQUAD lpColorTable, unsigned char *pImgData);
//带参数的构造函数
- 7 -
中国科技论文在线
~CDib(); //析构函数
CSize GetDimensions(); //获取 DIB 的尺寸(宽高)
BOOL Read(LPCTSTR lpszPathName) //DIB 载入内存中
BOOL Write(LPCTSTR lpszPathName); //DIB 存入磁盘中
BOOL Draw(CDC* pDC, CPoint origin, CSize size); //在视图中显示 DIB
void ReplaceDib(CSize size, int nBitCount, LPRGBQUAD lpColorTable,unsigned char
*pImgData); //用新的数据替换 DIB
int ComputeColorTabalLength(int nBitCount); //计算颜色表的长度
private:
void MakePalette(); //创建逻辑调色板
void Empty();} //清理空间
九个图像处理模块类的设计实现
本系统中,图像处理部分包含特效显示、灰度变换、几何变换、图像增强、图像变换、
图像分割、图像复原以及图像形态学处理八个大的模块,每个模块下又有若干处理操作,且
每个操作都有一个函数与之对应,在设计中,为每个大模块构造一个对应的类,这些类在主
程序中得以调用,这样就减少了代码的重复性,同时也简化了编程。每个模块类中封装了必
要的成员变量和该模块下所有图像处理操作所对应的函数,这些类全部基于上节中所构造的
CDib 类进行派生,它们分别是:特效显示类 SpecialShow、灰度变换类 GrayTrans、几何变
换类 GeometryTrans、图像增强类 ImgEnhancement、傅里叶变换类 FFTTrans、离散余弦变换
类 DCTTrans、图像分割类 ImgSegment、图像复原类 ImgRestorement、二值形态学类
Morphology,示意图如下:
图 3 基类的派生类示意图
Derived Classes Of Base Class
每个派生类中封装了该模块下所有图像处理操作对应的操作函数,如特效显示类中封装
基类 CDib
派生的特效显示类 SpecialShow
派生的灰度变换类 GrayTrans
派生的几何变换类 GeometryTrans
派生的图像增强类 ImgEnhancement
派生的傅里叶变换类 FFTTrans
派生的离散余弦变换类 DCTTrans
派生的图像分割类 ImgSegment
派生的图像复原类 ImgRestorement
派生的形态学类 Morphology
- 8 -
中国科技论文在线
了扫描显示、渐进显示、滑动显示以及马赛克显示四个操作所对应的函数,其他派生类也具
有类似的设计,这样在主程序中可以直接调用操作函数进行处理,大大简化了编程。
所有对话框类的设计实现
本系统中,有些图像处理操作需要用户输入参数,以便比较不同参数下图像的处理效果,
从而理解参数变化对处理结果的影响,通过对话框的设计可以实现图像处理的交互功能。当
设计完一个对话框后,要为其生成对应的对话框类,并在其中添加必要的成员变量和成员函
数,以便在主程序中调用。本设计中所有对话框类如下表所示:
表 1 系统对话框类
System Dialog Classes
对话框类 类名 作用
CAvgSmoothDlg 均值平滑对话框类 各种均值模板选择
CHistDrawDlg 直方图绘制对话框类 显示图像直方图
CInverseFilterDlg 逆滤波复原对话框类 逆滤波参数输入
CMedianSmoothDlg 中值滤波对话框类 各种中值模板选择
CMoveDlg 图像平移对话框类 平移参数输入
CRotateDlg 图像旋转对话框类 旋转角度及插值方式输入
CWinnerFliterDlg 维拉滤波复原对话框类 维纳滤波参数输入
CZoomDlg 图像缩放对话框类 缩放参数输入
CLinearStreDlg 灰度线性拉伸对话框类 分段函数转两转折点坐标输入
CNlinearStreDlg 灰度非线性拉伸对话框类 拉伸函数系数输入
CMorphologyStruDlg 二值形态学结构元素对话框类 确定结构元素
主界面菜单栏及对话框设计实现
在应用程序资源视图的菜单资源下,可以进行主界面菜单栏的设计,当我们生成一个多
文档应用程序时,系统会生成一个默认的菜单资源,我们可以在此基础上进行设计,也可以
重新建立菜单资源进行设计。本设计是在原有菜单资源上进行的,首先需要添加特效显示、
灰度变换、几何变换、图像增强、图像变换、图像分割、图像复原、二值形态学八个一级菜
单项,然后再在每个一级菜单下添加若干处理操作的子菜单,每个子菜单都有自己的 ID 号。
如特效显示菜单下包括扫描显示、滑动显示、渐进显示、马赛克显示四个子菜单项目。最后
利用 MFC ClassWard 为每个子菜单项添加事件处理函数,方法是:按 CTRL +W 键,打开
MFC ClassWard 界面,在类名中选择视图类,在对象列表中选择子菜单项所对应的 ID 号,
然后选择 COMMAND 消息,自动生成事件处理函数,最后点击添加代码按钮,添加相应代
码便可完成对子菜单项的消息映射。
在资源视图的对话框资源下,可以设计系统中所用到的对话框,主要是利用控件栏中的
某些控件进行设计,这些控件使用起来非常方便。
系统运行结果
- 9 -
中国科技论文在线
当完成系统总体框架设计并添加代码调试成功后,执行工程中生成的可执行文件,便可
得到以下实验结果:
图 4 实验结果界面
Experimental Result Interface
如图所示,打开一幅.BMP 格式的图像后就可以按照需求点击八个一级菜单下的子菜单
项对图像作相应处理,处理后的图像可以和处理前的图像进行对比,同时不同参数下的处理
结果也可以进行对比。
5 结论
本文在经过大量阅读图像处理方面的书籍,以及理解图像处理各种算法的基础上,设计
了一套小型的数字图像处理系统,下面对系统作简要的总结。
系统优点:
(1)本系统界面友好,凡是需要用户输入参数的算法都设置了相应的对话框,而且用户
参数输入有误时,系统会及时给出错误提示,使得用户可以方便使用系统进行图像处理。
(2)本系统覆盖了图像处理领域的大部分算法图像处理算法,能满足基本的图像处理要
求,具有较好的可移植性和可扩展性,可以方便的增加新的图像处理内容。
(3)本系统基于 MFC 的多文档应用程序框架进行设计,因而,处理后的图像可通过新建
视图进行显示而不会覆盖原图像,便于直观比较处理结果。
系统缺点:
(1)系统处理的图像文件格式显得单一,只能处理 BMP 文件格式图像。
(2)系统中不涉及图像编码及图像分析方面的内容,还有待于继续完善。
[参考文献] (References)
[1]龚声蓉,刘纯平,王强等. 数字图像处理与分析[M]. 北京:清华大学出版社,2006.
- 10 -
中国科技论文在线
[2]刘中合,王瑞雪,王锋德等. 数字图像处理技术现状与发展[J]. 计算机时代,2005,(9):6~8.
[3]侯俊杰. 深入浅出 MFC(第 2 版)[M]. 湖北:华中科技大学出版社,1998.
[4]杨淑莹. VC++图像处理程序设计[M]. 北京:清华大学出版社;北京交通大学出版社,2005.
[5]谢凤英,赵丹培. Visual C++ 数字图像处理[M]. 北京:电子工业出版社,2008.