当前位置:文档之家› VC数字图像处理编程讲座

VC数字图像处理编程讲座

VC数字图像处理编程讲座
VC数字图像处理编程讲座

VC数字图像处理编程讲座

刘涛

前言

数字图像处理技术与理论是计算机应用的一个重要领域,许多工程应用都涉及到图像处理。“图”是物体透射光或反射光的分布,“像”是人的视觉系统对图的接收在大脑中形成的印象或认识。图像是两者的结合。人类获取外界信息是靠听觉、视觉、触觉、嗅觉、味觉等,但绝大部分(约80%左右)来自视觉所接收的图像信息。图像处理就是对图像信息进行加工处理,以满足人的视觉心理和实际应用的需要。简单的说,依靠计算机对图像进行各种目的的处理我们就称之为数字图像处理。

早期的数字图像处理的目的是以人为对象,为了满足人的视觉效果而改善图像的质量,处理过程中输入的是质量差的图像,输出的是质量好的图像,常用的图像处理方法有图像增强、复原等。随着计算机技术的发展,有一类图像处理是以机器为对象,处理的目的是使机器能够自动识别目标,这称之为图像的识别,因为这其中要牵涉到一些复杂的模式识别的理论,所以我们后续的讲座只讨论其中最基本的内容。由于在许多实际应用的编程中往往都要涉及到数字图像处理,涉及到其中的一些算法,这也是许多编程爱好者感兴趣的一个内容,我们这个讲座就是讨论如何利用微软的Visual C++开发工具来实现一些常用的数字图像处理算法,论述了图像处理的理论,同时给出了VC实现的源代码。

图像处理技术博大精深,不仅需要有很强的数学功底,还需要熟练掌握一门计算机语言,在当前流行的语言中,我个人觉的Visual C++这个开发平台是图像开发人员的首选工具。本讲座只是起到抛砖引玉的作用,希望和广大读者共同交流。

第一节图像的文件格式

要利用计算机对数字化图像进行处理,首先要对图像的文件格式要有清楚的认识,因为我们前面说过,自然界的图像以模拟信号的形式存在,在用计算机进行处理以前,首先要数字化,比如摄像头(CCD)摄取的信号在送往计算机处理前,一般情况下要经过数模转换,这个任务常常由图像采集卡完成,它的输出一般为裸图的形式;如果用户想要生成目标图像文件,必须根据文件的格式做相应的处理。随着科技的发展,数码像机、数码摄像机已经进入寻常百姓家,我们可以利用这些设备作为图像处理系统的输入设备来为后续的图像处理提供信息源。无论是什么设备,它总是提供按一定的图像文件格式来提供信息,比较常用的有BMP格式、JPEG格式、GIF格式等等,所以我们在进行图像处理以前,首先要对图像的格式要有清晰的认识,只有在此基础上才可以进行进一步的开发处理。

在讲述图像文件格式前,先对图像作一个简单的分类。除了最简单的图像外,所有的图像都有颜色,而单色图像则是带有颜色的图像中比较简单的格式,它一般由黑色区域和白色区域

组成,可以用一个比特表示一个像素,“1”表示黑色,“0”表示白色,当然也可以倒过来表示,这种图像称之为二值图像。我们也可以用8个比特(一个字节)表示一个像素,相当于把黑和白等分为256个级别,“0”表示为黑,“255”表示为白,该字节的数值表示相应像素值的灰度值或亮度值,数值越接近“0”,对应像素点越黑,相反,则对应像素点越白,此种图像我们一般称之为灰度图像。单色图像和灰度图像又统称为黑白图像,与之对应存在着彩色图像,这种图像要复杂一些,表示图像时,常用的图像彩色模式有RGB模式、CMYK模式和HIS模式,一般情况下我们只使用RGB模式,R对应红色,G对应绿色,B对应蓝色,它们统称为三基色,这三中色彩的不同搭配,就可以搭配成各种现实中的色彩,此时彩色图像的每一个像素都需要

3个样本组成的一组数据表示,其中每个样本用于表示该像素的一个基本颜色。

对于现存的所有的图像文件格式,我们在这里主要介绍BMP图像文件格式,并且文件里的图像数据是未压缩的,因为图像的数字化处理主要是对图像中的各个像素进行相应的处理,而未压缩的BMP图像中的像素数值正好与实际要处理的数字图像相对应,这种格式的文件最合适我们对之进行数字化处理。请读者记住,压缩过的图像是无法直接进行数字化处理的,如JPEG、GIF等格式的文件,此时首先要对图像文件解压缩,这就要涉及到一些比较复杂的压缩算法。后续章节中我们将针对特殊的文件格式如何转换为BMP格式的文件问题作专门的论述,经过转换,我们就可以利用得到的未压缩的BMP文件格式进行后续处理。对于JPEG、GIF等格式,由于涉及到压缩算法,这要求读者掌握一定的信息论方面的知识,如果展开的话,可以写一本书,限于篇幅原因,我们只作一般性的讲解,有兴趣的朋友可以参考相关书籍资料。

一、BMP文件结构

1. BMP文件组成

BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。文件头主要包含文件的大小、文件类型、图像数据偏离文件头的长度等信息;位图信息头包含图像的尺寸信息、图像用几个比特数值来表示一个像素、图像是否压缩、图像所用的颜色数等信息。颜色信息包含图像所用到的颜色表,显示图像时需用到这个颜色表来生成调色板,但如果图像为真彩色,既图像的每个像素用24个比特来表示,文件中就没有这一块信息,也就不需要操作调色板。文件中的数据块表示图像的相应的像素值,需要注意的是:图像的像素值在文件中的存放顺序为从左到右,从下到上,也就是说,在BMP文件中首先存放的是图像的最后一行像素,最后才存储图像的第一行像素,但对与同一行的像素,则是按照先左边后右边的顺序存储的;另外一个需要读者朋友关注的细节是:文件存储图像的每一行像素值时,如果存储该行像素值所占的字节数为4的倍数,则正常存储,否则,需要在后端补0,凑足4的倍数。

2. BMP文件头

BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。其结构定义如下:

typedef struct tagBITMAPFILEHEADER

{

WORD bfType; // 位图文件的类型,必须为“BM”

DWORD bfSize; // 位图文件的大小,以字节为单位

WORD bfReserved1; // 位图文件保留字,必须为0

WORD bfReserved2; // 位图文件保留字,必须为0

DWORD bfOffBits; // 位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位} BITMAPFILEHEADER;该结构占据14个字节。

3. 位图信息头

BMP位图信息头数据用于说明位图的尺寸等信息。其结构如下:

typedef struct tagBITMAPINFOHEADER{

DWORD biSize; // 本结构所占用字节数

LONG biWidth; // 位图的宽度,以像素为单位

LONG biHeight; // 位图的高度,以像素为单位

WORD biPlanes; // 目标设备的平面数不清,必须为1

WORD biBitCount// 每个像素所需的位数,必须是1(双色), 4(16色),8(256色)或24(真彩色)之一

DWORD biCompression; // 位图压缩类型,必须是0(不压缩),1(BI_RLE8压缩类型)或2(BI_RLE4

压缩类型)之一

DWORD biSizeImage; // 位图的大小,以字节为单位

LONG biXPelsPerMeter; // 位图水平分辨率,每米像素数

LONG biYPelsPerMeter; // 位图垂直分辨率,每米像素数

DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数

DWORD biClrImportant;// 位图显示过程中重要的颜色数

} BITMAPINFOHEADER;该结构占据40个字节。

注意:对于BMP文件格式,在处理单色图像和真彩色图像的时候,无论图像数据多么庞大,都不对图像数据进行任何压缩处理,一般情况下,如果位图采用压缩格式,那么16色图像采用RLE4压缩算法,256色图像采用RLE8压缩算法。

4. 颜色表-palette

颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。RGBQUAD结构的定义如下:

typedef struct tagRGBQUAD {

BYTErgbBlue;// 蓝色的亮度(值范围为0-255)

BYTErgbGreen; // 绿色的亮度(值范围为0-255)

BYTErgbRed; // 红色的亮度(值范围为0-255)

BYTErgbReserved;// 保留,必须为0

} RGBQUAD;

颜色表中RGBQUAD结构数据的个数由BITMAPINFOHEADER 中的biBitCount项来确定,当biBitCount=1,4,8时,分别有2,16,256个颜色表项,当biBitCount=24时,图像为真彩色,图

像中每个像素的颜色用三个字节表示,分别对应R、G、B值,图像文件没有颜色表项。位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:

typedef struct tagBITMAPINFO {

BITMAPINFOHEADER bmiHeader; // 位图信息头

RGBQUAD bmiColors[1]; // 颜色表

} BITMAPINFO;

注意:RGBQUAD数据结构中,增加了一个保留字段rgbReserved,它不代表任何颜色,必须取固定的值为“0”,同时,RGBQUAD结构中定义的颜色值中,红色、绿色和蓝色的排列顺序与一般真彩色图像文件的颜色数据排列顺序恰好相反,既:若某个位图中的一个像素点的颜色的描述为“00,00,ff,00”,则表示该点为红色,而不是蓝色。

5. 位图数据

位图数据记录了位图的每一个像素值或该对应像素的颜色表的索引值,图像记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。这种格式我们又称为Bottom-Up位图,当然与之相对的还有Up-Down形式的位图,它的记录顺序是从上到下的,对于这种形式的位图,也不存在压缩形式。位图的一个像素值所占的字节数:当biBitCount=1时,8个像素占1个字节;当biBitCount=4时,2个像素占1个字节;当biBitCount=8时,1个像素占1个字节;当biBitCount=24时,1个像素占3个字节,此时图像为真彩色图像。当图像不是为真彩色时,图像文件中包含颜色表,位图的数据表示对应像素点在颜色表中相应的索引值,当为真彩色时,每一个像素用三个字节表示图像相应像素点彩色值,每个字节分别对应R、G、B分量的值,这时候图像文件中没有颜色表。上面我已经讲过了,Windows规定图像文件中一个扫描行所占的字节数必须是4的倍数(即以字为单位),不足的以0填充,图像文件中一个扫描行所占的字节数计算方法:

DataSizePerLine= (biWidth* biBitCount+31)/8;// 一个扫描行所占的字节数

位图数据的大小按下式计算(不压缩情况下):

DataSize= DataSizePerLine* biHeight。

上述是BMP文件格式的说明,搞清楚了以上的结构,就可以正确的操作图像文件,对它进行读或写操作了。

二、GIF图像文件格式

GIF图象格式的全称为Graphics Interchange Format,从这个名字可以看出,这种图像格式主要是为了通过网络传输图像而设计的。GIF文件不支持24位真彩色图像,最多只能存储256色的图像或灰度图像;GIF格式文件也无法存储CMY和HIS模型的图像数据;另外,GIF图像文件的各种数据区域一般没有固定的数据长度和存储顺序,所以为了方便程序寻找数据区,将数据区中的第一个字节作为标志符;最后需要读者注意的是GIF文件存储图像数据是有二种排列顺序:顺序排列或交叉排列。交叉排列的方式适合网络传输,这样一来允许用户在不完全掌握图像数据之前,获取当前图像的轮廓数据。

GIF文件格式分为87和89两个版本,对于87这个版本,该文件主要是有五个部分组成,它,们是按顺序出现的:文件头块、逻辑屏幕描述块、可选择的调色板块、图像数据块、最后是标志文件结束的尾块,该块总是取固定的值3BH。其中第一和第二两个块用GIF图像文件头结构描述:

GIFHEADER:{

DB Signature; //该字段占六个字节,为了用于指明图像为GIF格式,前三个字符必须为“GIF”,

后三字符用于指定是哪个版本,87或89。

DW ScreenWidth;//

DW ScreenDepth;//占两个字节,以像素为单位表示图像的宽、高

DB GlobalFlagByte;//该字节的各个位用于调色版的描述

DB BackGroundColor;//代表图象的背景颜色的索引

DB AspectRatio;图像的长宽比

}

GIF格式中的调色板有通用调色板和局部调色板之分,因为GIF格式允许一个文件中存储多个图像,因此有这两种调色板,其中通用调色板适于文件中的所有图像,而局部调色板只适用于某一个图像。格式中的数据区域一般分为四个部分,图像数据识别区域,局部调色板数据,采用压缩算法得到的图像数据区域和结束标志区域。

在GIF89版本中,它包含七个部分,分别是文件头、通用调色板数据、图像数据区和四个补充数据区,它们主要是用于提示程序如何处理图像的。

三、JEPG图像文件

JEPG简称为联合摄影专家小组,作为一种技术,主要用于数字化图像的标准编码,JPEG 主要采用有损的压缩编码方式,它比GIF、BMP图像文件要复杂的多,这不是短短的几页篇幅可以将清楚的,万幸的是,我们可以通过一些别的方法将该格式转化为BMP格式。读者需要知道的是在对JEPG文件格式编码时,通常需要分为以下四步:颜色转化、DCT变换、量化、编码。

以上介绍了一些常用的图像文件,对比较复杂的格式,如GIF和JEPG,仅仅作了极其浮浅的介绍,后文我们会和它们作进一步的接触。实际应用中,还有许多图像格式,文章中都没有提到,读者如果需要做进一步的研究,还需要参考一些关于图像格式方面的资料。

第二节BMP图像的基本操作

上一讲我们主要介绍了图像的格式,其中重点说明了BMP文件的存储格式,同时对JEPG 和GIF等常用格式作了简单的介绍。本节主要讲述如何操作BMP文件,如对其读、写和显示等。

在实现数字图象处理的过程中,主要是通过对图像中的每一个像素点运用各种图像处理算法来达到预期的效果,所以进行图像处理的第一步,也是我们最关心的问题,是如何得到图像

中每一个像素点的亮度值;为了观察和验证处理的图像效果,另一个需要解决的问题是如何将处理前后的图像正确的显示出来。我们这章内容就是解决这些问题。

随着科技的发展,图像处理技术已经渗透到人类生活的各个领域并得到越来越多的应用,但是突出的一个矛盾是图像的格式也是越来越多,目前图像处理所涉及的主要的图像格式就有很多种,如TIF、JPEG、BMP等等,一般情况下,为了处理简单方便,进行数字图像处理所采用的都是BMP格式的图像文件(有时也称为DIB格式的图像文件),并且这种格式的文件是没有压缩的。我们通过操作这种格式的文件,可以获取正确显示图像所需的调色板信息,图像的尺寸信息,图像中各个像素点的亮度信息等等,有了这些数据,开发人员就可以对图像施加各种处理算法,进行相应的处理。如果特殊情况下需要处理其它某种格式的图像,如GIF、JEMP等格式的图像文件,可以首先将该格式转换为BMP格式,然后再进行相应的处理。这一点需要读者清楚。

BMP格式的图像文件又可以分为许多种类,如真彩色位图、256色位图,采用RLE(游程编码)压缩格式的BMP位图等等。由于在实际的工程应用和图像算法效果验证中经常要处理的是256级并且是没有压缩的BMP灰度图像,例如通过黑白采集卡采集得到的图像就是这种格式,所以我们在整个讲座中范例所处理的文件格式都是BMP灰度图像。如果读者对这种格式的位图能够作到熟练的操作,那么对于其余形式的BMP位图的操作也不会很困难。

BMP灰度图像作为Windows环境下主要的图像格式之一,以其格式简单,适应性强而倍受欢迎。正如我们在上一讲中介绍过的那样,这种文件格式就是每一个像素用8bit表示,显示出来的图像是黑白效果,最黑的像素的灰度(也叫作亮度)值为“0”,最白的像素的灰度值为“255”,整个图像各个像素的灰度值随机的分布在“0”到“255”的区间中,越黑的像素,其灰度值越接近于“0”,越白(既越亮)的像素,其灰度值越接近于“255”;与此对应的是在该文件类型中的颜色表项的各个RGB分量值是相等的,并且颜色表项的数目是256个。

在进行图像处理时,操作图像中的像素值就要得到图像阵列;经过处理后的图像的像素值需要存储起来;显示图像时要正确实现调色板、得到位图的尺寸信息等。结合这些问题,下面我们针对性的给出了操作灰度BMP图像时的部分函数实现代码及注释。

一、 BMP位图操作

首先我们回顾一下上讲中的重要信息:BMP位图包括位图文件头结构BITMAPFILEHEADER、位图信息头结构BITMAPINFOHEADER、位图颜色表RGBQUAD和位图像素数据四部分。处理位图时要根据文件的这些结构得到位图文件大小、位图的宽、高、实现调色板、得到位图像素值等等。这里要注意的一点是在BMP位图中,位图的每行像素值要填充到一个四字节边界,即位图每行所占的存储长度为四字节的倍数,不足时将多余位用0填充。

有了上述知识,可以开始编写图像处理的程序了,关于在VC的开发平台上如何开发程序的问题这里不再赘述,笔者假定读者都具有一定的VC开发经验。在开发该图像处理程序的过程中,笔者没有采用面向对象的方法,虽然面向对象的方法可以将数据封装起来,保护类中的数据不受外界的干扰,提高数据的安全性,但是这种安全性是以降低程序的执行效率为代价的,

为此,我们充分利用了程序的文档视图结构,在程序中直接使用了一些API函数来操作图像。在微软的MSDN中有一个名为Diblook的例子,该例子演示了如何操作Dib位图,有兴趣的读者可以参考一下,相信一定会有所收获。

启动Visual C++,生成一个名为Dib的多文档程序,将CDibView类的基类设为CscrollView类,这样作的目的是为了在显示位图时支持滚动条,另外在处理图像应用程序的文档类(CDibDoc.h)中声明如下宏及公有变量:

#define WIDTHBYTES(bits) (((bits) + 31) / 32 * 4)//计算图像每行象素所占的字节数目;

HANDLE m_hDIB;//存放位图数据的句柄;

CPalette* m_palDIB;//指向调色板Cpalette类的指针;

CSize m_sizeDoc;//初始化视图的尺寸,该尺寸为位图的尺寸;

最后将程序的字符串表中的字符串资源IDR_DibTYPE修改为:“\nDib\nDib\nDib Files(*.bmp;*.dib)\n.bmp\nDib.Document\nDib Document”。这样作的目的是为了在程序文件对话框中可以选择BMP或DIB格式的位图文件。

1、读取灰度BMP位图

可以根据BMP位图文件的结构,操作BMP位图文件并读入图像数据,为此我们充分利用了VC的文档视图结构,重载了文挡类的OnOpenDocument()函数,这样用户就可以在自动生成程序的打开文件对话框中选择所要打开的位图文件,然后程序将自动调用该函数执行读取数据的操作。该函数的实现代码如下所示:

BOOL CDibDoc::OnOpenDocument(LPCTSTR lpszPathName)

{

LOGPALETTE *pPal;//定义逻辑调色板指针;

pPal=new LOGPALETTE;//初始化该指针;

CFile file;

CFileException fe;

if (!file.Open(lpszPathName, CFile::modeRead | CFile::shareDenyWrite, &fe))

{//以“读”的方式打开文件;

AfxMessageBox("图像文件打不开!");

return FALSE;

}

DeleteContents();//删除文挡;

BeginWaitCursor();

BITMAPFILEHEADER bmfHeader;//定义位图文件头结构;

LPBITMAPINFO lpbmi;

DWORD dwBitsSize;

HANDLE hDIB;

LPSTR pDIB;//指向位图数据的指针;

BITMAPINFOHEADER *bmhdr;//指向位图信息头结构的指针

dwBitsSize = file.GetLength();//得到文件长度

if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) !=sizeof(bmfHeader)) return FALSE;//读取位图文件的文件头结构信息;

if (bmfHeader.bfType != 0x4d42) //检查该文件是否为BMP格式的文件;

return FALSE;

hDIB=(HANDLE) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwBitsSize); //为读取图像文件数据申请缓冲区

if (hDIB == 0)

{

return FALSE;

}

pDIB = (LPSTR) ::GlobalLock((HGLOBAL)hDIB);

//得到申请的缓冲区的指针;

if (file.ReadHuge(pDIB, dwBitsSize - sizeof(BITMAPFILEHEADER)) !=

dwBitsSize - sizeof(BITMAPFILEHEADER) ) {

::GlobalUnlock((HGLOBAL)hDIB);

hDIB=NULL;

return FALSE;

}//此时pDIB数据块中读取的数据包括位图头信息、位图颜色表、图像像素的灰度值;bmhdr=(BITMAPINFOHEADER*)pDIB;//为指向位图信息头结构的指针赋值;

::GlobalUnlock((HGLOBAL)hDIB);

if ((*bmhdr).biBitCount!=8)//验证是否为8bit位图

{

AfxMessageBox("该文件不是灰度位图格式!");

return FALSE;

}

m_hDIB=hDIB;//将内部变量数据赋于全局变量;

//下面是记录位图的尺寸;

m_sizeDoc.cx=bmhdr->biWidth;

m_sizeDoc.cy=bmhdr->biHeight;

//下面是根据颜色表生成调色板;

m_palDIB=new Cpalette;

pPal->palVersion=0x300;//填充逻辑颜色表

pPal->palNumEntries=256;

lpbmi=(LPBITMAPINFO)bmhdr;

for(int i=0;i<256;i++)

{//每个颜色表项的R、G、B值相等,并且各个值从“0”到“255”序列展开;

Pal->palPalentry[i].peRed=lpbmi->bmiColors[i].rgbRed;

pPal->palPalentry[i].peGreen=lpbmi->bmiColors[i].rgbGreen;

pPal->palPalentry[i].peBlue= lpbmi->bmiColors[i].rgbBlue;;

pPal->palPalentry[i].peFlags=0;

}

m_palDIB->CreatePalette(pPal);

//根据读入的数据得到位图的宽、高、颜色表;

if(pPal) delete pPal;

EndWaitCursor();

SetPathName(lpszPathName);//设置存储路径

SetModifiedFlag(FALSE); // 设置文件修改标志为FALSE

return TRUE;

}

上面的方法是通过CFile类对象的操作来读取位图文件的,它需要分析位图中的文件头信息,从而确定需要读取的图像长度。这种方法相对来说有些繁琐,其实还可以以一种相对简单的方法读取位图数据,首先在程序的资源中定义DIB类型资源,然后添加位图到该类型中,将图像数据以资源的形式读取出来,这时候就可以根据所获取的数据中的位图信息结构来获取、显示图像数据了。下面的函数实现了以资源形式装载图像文件数据,该函数的实现代码如下所示:

/////////////////////////////////////////////////////////////////

HANDLE LoadDIB(UINT uIDS, LPCSTR lpszDibType)

{

LPCSTR lpszDibRes =MAKEINTRESOURCE(uIDS);//根据资源标志符确定资源的名字;

HINSTANCE hInst=AfxGetInstanceHandle();//得到应用程序的句柄;

HRSRC hRes=::FindResource(hInst,lpszDibRes, lpszDibType);//获取资源的句柄,这里lpszDibType为

资源的名字“DIB”;

If(hRes==NULL) return NULL

HGLOBAL hData=::LoadResource(hInst, hRes);//转载资源数据并返回该句柄;

return hData;

}

2、灰度位图数据的存储

为了将图像处理后所得到的像素值保存起来,我们重载了文档类的OnSaveDocument()函数,这样用户在点击Save或SaveAs子菜单后程序自动调用该函数,实现图像数据的存储。该函数的具体实现如下:

///////////////////////////////////////////////////////////////////

BOOL CDibDoc::OnSaveDocument(LPCTSTR lpszPathName)

{

CFile file;

CFileException fe;

BITMAPFILEHEADER bmfHdr; // 位图文件头结构;

LPBITMAPINFOHEADER lpBI;//指向位图头信息结构的指针;

DWORD dwDIBSize;;

if (!file.Open(lpszPathName, CFile::modeCreate |CFile::modeReadWrite | CFile::shareExclusive, &fe))

{

AfxMessageBox("文件打不开");

return FALSE;

}//以读写的方式打开文件;

BOOL bSuccess = FALSE;

BeginWaitCursor();

lpBI = (LPBITMAPINFOHEADER) ::GlobalLock((HGLOBAL) m_hDIB);

if (lpBI == NULL) return FALSE;

dwDIBSize = *(LPDWORD)lpBI + 256*sizeof(RGBQUAD);

//图像的文件信息所占用的字节数;

DWORD dwBmBitsSize;//BMP文件中位图的像素所占的字节数

dwBmBitsSize=WIDTHBYTES((lpBI->biWidth)*((DWORD)lpBI->biBitCount))

*lpBI->biHeight;// 存储时位图所有像素所占的总字节数

dwDIBSize += dwBmBitsSize; //BMP文件除文件信息结构外的所有数据占用的总字节数;

lpBI->biSizeImage = dwBmBitsSize; // 位图所有像素所占的总字节数

//以下五句为文件头结构填充值

bmfHdr.bfType =0x4d42; // 文件为"BMP"类型

bmfHdr.bfSize = dwDIBSize + sizeof(BITMAPFILEHEADER);//文件总长度

bmfHdr.bfReserved1 = 0;

bmfHdr.bfReserved2 = 0;

bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + lpBI->biSize + 256*sizeof(RGBQUAD);

//位图数据距离文件头的偏移量;

file.Write((LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER));//向文件中写文件头信息;

file.WriteHuge(lpBI, dwDIBSize);

//将位图信息(信息头结构、颜色表、像素数据)写入文件;

::GlobalUnlock((HGLOBAL) m_hDIB);

EndWaitCursor();

SetModifiedFlag(FALSE); // 将文档设为“干净”标志,表示此后文档不需要存盘提示;

return TRUE;

}

二、调色板的操作

通过上面的操作,我们已经可以获取图像中的数据了,现在的又一个问题是如何在窗口中显示出图像数据。灰度图像要正确显示,必须实现逻辑调色板和系统调色板。首先我们介绍一下逻辑调色板结构LOGPALETTE,该结构定义如下:

typedef struct tagLOGPALETTE

{

WORD palVersion;//调色板的板本号,应该指定该值为0x300;

WORD palNumEntries;//调色板中的表项数,对于灰度图像该值为256;

PALETEENTRY palPalEntry[1];//调色板中的颜色表项,由于该表项的数目不一定,所以这里数组长度

定义为1,灰度图像对应的该数组的长度为256;

}LOGPALETTE;

颜色表项结构PALETTEENTRY定义了调色板中的每一个颜色表项的颜色和使用方式,定义如下:

typedef struct tagPALETTEENTRY

{

BYTE peRed; //R分量值;

BYTE peGreen; //G分量值;

BYTE peBlue; //B分量值;

BYTE peFlags; // 该颜色被使用的方式,一般情况下设为“0”;

}PALETTEENTRY;

Windows系统使用调色板管理器来管理与调色板有关的操作,通常活动窗口的调色板即是当前系统调色板,所有的非活动窗口都必须按照此系统调色板来显示自己的颜色,此时调色板管理器将自动的用系统调色板中的最近似颜色来映射相应的显示颜色。如果窗口或应用程序按自己的调色板显示颜色,就必须将自己的调色板载入到系统调色板中,这种操作叫作实现调色板,实现调色板包括两个步骤,既首先将调色板选择到设备上下文中,然后在设备上下文中实现它。可以通过CDC::SelectPalette()、CDC::RealizePalette()或相应的API函数来实现上述的两个步骤。在实现调色板的过程中,通过在主框架类中处理Windows定义的消息WM_QUERYNEWPALETTE 、WM_PALETTECHANGED及视图类中处理自定义消息WM_DOREALIZE(该消息在主框架窗口定义如下:#define WM_REALIZEPAL (WM_USER+101))来实现调色板的操作。当系统需要处理调色板的变化时,将向程序的主窗

口发送WM_QUERYNEWPALETTE 、WM_PALETTECHANGED,例如当某一窗口即将激活时,主框架窗口将收到WM_QUERYNEWPALETTE消息,通知该窗口将要收到输入焦点,给它一次机会实现其自身的逻辑调色板;当系统调色板改变后,主框架窗口将收到WM_PALETTECHANGED消息,通知其它窗口系统调色板已经改变,此时每一窗口都应该实现其逻辑调色板,重画客户区。

由于上述的调色板变更消息是发往主框架窗口的,所以我们只能在主窗口中响应这两个消息,然后由主框架窗口通知各个视窗,使得程序激活时能自动装载自己的调色板。我们定义的用户消息WM_REALIZEPAL用于主框架窗口通知视窗它已经收到调色板变更消息,视窗应该协调其调色板。下面我们给出了各个消息的响应处理函数的具体实现代码和注释://////////////////////////////////////////////////////////

void CMainFrame::OnPaletteChanged(CWnd* pFocusWnd)

{//总实现活动视的调色板

CMDIFrameWnd::OnPaletteChanged(pFocusWnd);

CMDIChildWnd* pMDIChildWnd = MDIGetActive();//得到活动的子窗口指针;

if (pMDIChildWnd == NULL) return

CView* pView = pMDIChildWnd->GetActiveView();//得到视图的指针;

ASSERT(pView != NULL);

SendMessageToDescendants(WM_DOREALIZE, (WPARAM)pView->m_hWnd);

//通知所有子窗口系统调色板已改变

}

////////////////////////////////////////////////

BOOL CMainFrame::OnQueryNewPalette()//提供实现系统调色板的机会

{

// 实现活动视的调色板

CMDIChildWnd* pMDIChildWnd = MDIGetActive();//得到活动的子窗口指针;

if (pMDIChildWnd == NULL) return FALSE;//no active MDI child frame (no new palette)

CView* pView = pMDIChildWnd->GetActiveView();//得到活动子窗口的视图指针;

ASSERT(pView != NULL);

//通知活动视图实现系统调色板

pView->SendMessage(WM_DOREALIZE, (WPARAM)pView->m_hWnd);

return TRUE;

}

/////////////////////////////////////////////////

BOOL CDibView::OnDoRealize(WPARAM wParam, LPARAM)//实现系统调色板

{

ASSERT(wParam != NULL);

CDibDoc* pDoc = GetDocument();

if (pDoc->m_hDIB == NULL) return FALSE; // must be a new document

CPalette* pPal = pDoc->m_palDIB;

//调色板的颜色表数据在InitDIBData()函数中实现

if (pPal != NULL)

{

CMainFrame* pAppFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;//得到程序的主框架指

针;

ASSERT_KINDOF(CMainFrame, pAppFrame);

CClientDC appDC(pAppFrame);//获取主框架的设备上下文;

CPalette* oldPalette = appDC.SelectPalette(pPal, ((HWND)wParam) != m_hWnd);

//只有活动视才可以设为"FALSE",即根据活动视的调色板设为"前景"调色板;

if (oldPalette != NULL)

{

UINT nColorsChanged = appDC.RealizePalette();//实现系统调色板

if (nColorsChanged > 0) pDoc->UpdateAllViews(NULL);//更新视图

appDC.SelectPalette(oldPalette, TRUE);

//将原系统调色板置为背景调色板

}

else

{

TRACE0(“\tSelectPalette failed in”);

}

}

return TRUE;

}

注:在调用API函数显示位图时,不要忘记设置逻辑调色板,即"背景"调色板,否则位图将无法正确显示,读者可以从后面的显示部分的实现看出我们在显示时实现了逻辑调色板。上述的处理相对来说比较繁琐复杂,可能对于初学者来说也比较难于理解,所以如果我们的程序仅仅限于处理灰度图像,可以采用另外一种相对简单的办法,即在文档类的初始化阶段定义一个灰度调色板,然后在设备上下文中实现它,这样作的好处是在度取灰度位图时可以不再考虑文件中的颜色表信息,提高了文件读取速度,笔者在开发一个基于机器视觉的项目时采用的就是这种方法,取的了比较满意的效果。首先定义一个指向逻辑颜色表结构LOGPALETTE的指针pPal,填充该指针,然后将该指针与调色板指针联系起来,该方法的具体实现如下://///////////////////////////////////////////////////////

CDibDoc::CDibDoc()

{

……………………….

LOGPALETTE *Pal;

Pal=new LOGPALETTE;

m_palDIB=new Cpalette;

pPal->palVersion=0x300;

pPal->palNumEntries=256;

for(int i=0;i<256;i++)

{//每个颜色表项的R、G、B值相等,并且各个值从“0”到“255”序列展开;

Pal->palPalentry[i].peRed=i;

pPal->palPalentry[i].peGreen=i;

pPal->palPalentry[i].peBlue=i;

pPal->palPalentry[i].peFlags=0;

}

m_palDIB->CreatePalette(pPal);

…………………..

}

三、图像的显示

显示DIB位图数据可以通过设备上下文CDC对象的成员函数CDC::Bitblt()或CDC::StretchBlt()来实现,也可以通过API函数SetDIBBitsToDevice()或StretchDIBBits()来实现,函数中具体所用到的各个参数的意义可以参考MSDN。其中StretchDIBBits()和CDC::StretchBlt()可以将图像进行放大和缩小显示。当从文档中装入位图文件时,CDIBView类的OnInitialUpdate函数将被调用,因此可以在该函数中实现对视图尺寸的设置,用于正确的显示位图,然后就可以在视图类的OnDraw()函数中正确的显示位图了。这两个函数的具体实现代码分别如下所示:

/////////////////////////////////////////////////////////////

void CDIBView::OnInitialUpdate()

{

CscrollView::OnInitalUpdate();

CDIBDoc *pDoc=GetDocument();

If(pDoc->m_hDIB==NULL)//如果位图数据为空,设置m_sizeDoc的默认尺寸;

pDoc->m_sizeDoc.cx=pDoc->m_sizeDoc.cy=100;

SetScrollSizes(MM_TEXT,pDoc-> m_sizeDoc);

}

/////////////////////////////////////////////////////////////

void CDIBView::OnDraw(CDC *pDC)

{

BITMAPINFOHEADER *lpDIBHdr;//位图信息头结构指针;

BYTE *lpDIBBits;//指向位图像素灰度值的指针;

BOOL bSuccess=FALSE;

CPalette*OldPal=NULL;//调色板指针;

HDC hDC=pDC->GetSafeHdc();//获取当前设备上下文的句柄;

CDIBDoc *pDoc=GetDocument();//获取活动文档的指针;

If(pDoc->m_hDIB ==NULL)

{//判断图像数据是否为空;

AfxMessageBox("图像数据不能为空,请首先读取图像数据!");

return;

}

lpDIBHdr=( BITMAPINFOHEADER *)GlobalLock(pDoc->m_hDIB);//得到图像的位图头信息

lpDIBBits=lpDIBHdr+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD);//获取保存图像像素值的缓冲区的指针;

if(pDoc-> m_palDIB)

{//如果存在调色板信息,实现逻辑调色板;

OldPal=pDC-> SelectPalette(pDoc-> m_palDIB,TRUE);

PDC->RealizePalette();

}

else

{

AfxMessageBox("图像的调色板数据不能为空,请首先读取调色板信息!");

return ;

}

SetStretchBltMode(hDC,COLORONCOLOR);

//显示图像

BSuccess=StretchDIBBits(hDC,0,0,pDoc-> m_sizeDoc.cx, pDoc-> m_sizeDoc.cy,

0, pDoc-> m_sizeDoc.cy,0, pDoc-> m_sizeDoc.cy,

lpDIBBits,(LPBITMAPINFO)lpDIBHdr,

DIB_RGB_COLORS,

SRCCOPY);

GlobalUnlock(pDoc->m_hDIB);

If(OldPal)//恢复调色板;

PDC->SelectPalette(OldPal,FALSE);

retrun;

}

四、小结

在本期讲座里我们主要介绍了如何操作灰度位图,它具有较强的代表性,同时为后续的图像处理编程的学习作了必要的准备工作,经过学习,对于如何操作其它类型的BMP格式的图像文件,可以达到举一反三的作用。

第三节BMP图像显示的特效操作

上期讲座中我们主要讲述了BMP图像数据的存取、图像的显示和调色板的操作等内容,在上面的学习基础上,我们可以进一步深化,学习并掌握图像特效显示技术。有了这种技术,可以用来在今后的项目开发中美化我们的软件界面,提高软件的视觉效果。在如今的商业软件中,几乎每一幅图像的显示都采用了图像特效显示,例如读者比较熟悉的Windows的屏幕保护程序就采用了各种各样的图像特效显示,使人感到眼花缭乱和耳目一新。专业图像处理软件更是提供了丰富的显示方式供用户使用,可以方便的在程序中实现图像的特效显示,如PhotoShop 、Authorware等。本节主要介绍如何实现图像的浮雕、雕刻、百页窗、旋转、扫描、栅条、马赛克、和渐显渐隐显示等效果。通过这期讲座的学习,读者朋友们也可以自己动手制作拥有特效显示效果的软件了。

图像的显示我们讲过主要有BitBlt()、SetDIBitsToDevice()和StretchDIBits()等函数。需要读者注意的是,在特效显示时,并不是每个显示函数都适宜,BitBlt()函数主要是用来显示设备无关位图(DDB),后两个函数用来显示设备无关位图(DIB)。由于我们讲座里处理的是设备无关位图,所以我们主要关心的是后两个函数的应用,其中SetDIBitsToDevice()使用起来较死板,远不如StretchDIBits()用的灵活,并且对大多数的特效显示无能为力,所以为了实现图像的特效显示效果,需要使用StretchDIBits()函数来显示图像,具体什么原因,我想可能是微软在实现这些函数时使用的方法不同吧。这些函数如何使用,各个参数的含义,可以参考微软的MSDN。

实现图像的特殊效果的显示的基本思路是要么是操作图像的像素,要么是对图像分块按一定的方向或次序,分阶段的显示或擦除对应的图像块。对于第二种显示的思路,其中的要点是:1.划分图像块;2.确定图像块的操作次序;3.显示或清除对应的图像块;4.在两个连续显示的图像块之间插入一个固定的延迟。其中图像块的划分决定了图像的显示方式,图像块的显示顺序决定了显示的方向和细分的依据。不同的效果决定了不同的分块方法和显示次序,我们将在后面的各种特效显示中介绍如何分块和决定次序。为了使图像的显示过程明显的表现出来,实现显示的特效,就需要在图像块的依此显示中插入固定的延迟。也许读者朋友会想到利用sleep()函数或用Settime()来实现延迟,由于Windows是个基于消息的多任务操作系统,这些方法所产生的延迟时间对于图像的显示来说是不精确的,为了实现与机器无关的更精确的时间延迟,可以采用timeGetTime()函数来产生微秒级的延迟。使用这个函数时为了编译不产生错误,要

在连接设置中引入“Winmm.lib”库,并要包含头文件“Mmsystem.h”。这里我们首先给出一个延迟函数,它用来实现固定时间的延迟:

void DelayTime(DWORD time)

{

DWORD BeginTime ,EndTime;

BeginTime=timeGetTime();//得到当前的系统时间、单位为微秒;

do

{

EndTime=TimeGetTime();//再次得到当前的系统时间;

}

while((EndTime-BeginTime)

}

一、操作位图的像素实现显示的特效

我们首先介绍直接操作图像中的像素的灰度值来实现图像显示的特效、这里我们主要介绍如何实现图像的浮雕和雕刻效果。经常看电视的朋友们不知注意到没有,有些电视连续剧在每集片头或片尾部分都有显示一些特殊效果的图像,比如前一阵子中央一套放的《长征》和《康熙王朝》,这些特效称为"图像的浮雕效果"和"图像的雕刻效果",经过这些特效处理后的图像增强了观众们的视觉效果,它们看上去仿佛是使用3D技术作的,这也许就是为什么这种技术那么流行的原因吧。其实,我们完全可以用一些简单的数字图像处理算法来实现这些看似复杂高深的显示效果。下面以一个标准的Lena灰度图像为原图,给出了处理后的效果图,同时给出了VC开发平台上的部分实现源代码。

1."浮雕"图像

"浮雕"图象效果是指图像的前景前向凸出背景。所谓的"浮雕"概念是指标绘图像上的一个像素和它左上方的那个像素之间差值的一种处理过程,为了使图像保持一定的亮度并呈现灰色,我在处理过程中为这个差值加了一个数值为128的常量。需要读者注意的是,当设置一个像素值的时候,它和它左上方的像素都要被用到,为了避免用到已经设置过的像素,应该从图像的右下方的像素开始处理,下面是实现的源代码:

void CDibView::OnFDImage() //产生"浮雕"效果图函数

{

HANDLE data1handle;//用来存放图像数据的句柄;

LPBITMAPINFOHEADER lpBi;//图像的信息头结构;

CDibDoc *pDoc=GetDocument();//得到文挡指针;

HDIB hdib;//用来存放图像数据的句柄;

unsigned char *pData;//指向原始图像数据的指针;

unsigned char *data;//指向处理后图像数据的指针;

hdib=pDoc->m_hDIB;//拷贝存放已经读取的图像文件数据句柄;

lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hdib);//获取图像信息头

pData=(unsigned char*)FindDIBBits((LPSTR)lpBi);

//FindDIBBits是我定义的一个函数、根据图像的结构得到位图的灰度值数据、

pDoc->SetModifiedFlag(TRUE);

//设置文档修改标志为“真”、为后续的修改存盘作准备;

data1handle=GlobalAlloc(GMEM_SHARE,WIDTHBYTES(lpBi->biWidth*8)*lpBi->biHeight);//声明一个缓

冲区用来暂存处理后的图像数据;

data=(unsigned char*)GlobalLock((HGLOBAL)data1handle);//得到该缓冲区的指针;

AfxGetApp()->BeginWaitCursor();

int i,j,buf;

for( i=lpBi->biHeight; i>=2; i--)//从图像右下角开始对图像的各个像素进行“浮雕”处理;

for( j=lpBi->biWidth; j>=2; j--)

{

//浮雕处理

buf=*(pData+(lpBi->biHeight-i)*WIDTHBYTES(lpBi->biWidth*8)+j)-*(pData+(lpBi->biHeight-

i+1)*WIDTHBYTES(lpBi->biWidth*8)+j-1)+128;

if(buf>255) buf=255;

if(buf<0)buf=0; *(data+(lpBi->biHeight-i)*WIDTHBYTES(lpBi->biWidth*8)+j)=(BYTE)buf;

}

for( j=0; jbiHeight; j++)

for( i=0; ibiWidth; i++)

//重新写回原始图像的数据缓冲区;

*(pData+i*WIDTHBYTES(lpBi->biWidth*8)+j)=*(data+i*WIDTHBYTES(

lpBi->biWidth*8)+j);AfxGetApp()->EndWaitCursor();

pDoc->m_hDIB =hdib//将处理过的图像数据写回pDoc中的图像缓冲区;

GlobalUnlock((HGLOBAL)hdib);//解锁、释放缓冲区;

GlobalUnlock((HGLOBAL)data1handle);

GlobalFree((HGLOBAL)hdib);

GlobalFree((HGLOBAL)data1handle);

Invalidate(TRUE);//显示图像

}

2."雕刻"图像

上面讲述了通过求一个像素和它左上方像素之间的差值并加上一个常数的方法生成"浮雕"效果的灰度图像,"雕刻"图像与之相反,它是通过取一个像素和它右下方的像素之间的差值并加上一个常数,这里我也取128,经过这样处理,就可以得到"雕刻"图像,这时候图像的前景

凹陷进背景之中。同样需要读者注意的是为了避免重复使用处理过的图像像素,处理图像时要从图像的左上方的像素开始处理。实现代码如下:

void CDibView::OnDKImage()

{

// TODO: Add your command handler code here

HANDLE data1handle;//这里的内部变量与前面的含义一致、这里不再赘述;

LPBITMAPINFOHEADER lpBi;

CDibDoc *pDoc=GetDocument();

HDIB hdib;

unsigned char *pData;

unsigned char *data;

hdib=pDoc->m_hDIB;//拷贝图像数据的句柄;

lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hdib);

pData=(unsigned char*)FindDIBBits((LPSTR)lpBi);

pDoc->SetModifiedFlag(TRUE);

data1handle=GlobalAlloc(GMEM_SHARE,WIDTHBYTES(lpBi->biWidth*8)*lpBi->biHeight);//申请缓冲

区;

data=(unsigned char*)GlobalLock((HGLOBAL)data1handle);//得到新的缓冲去的指针;AfxGetApp()-

>BeginWaitCursor();

int i,j,buf;

for( i=0;i<=lpBi->biHeight-2; i++)//对图像的各个像素循环进行"雕刻"处理;

for( j=0;j<=lpBi->biWidth-2; j++)

{

buf=*(pData+(lpBi->biHeight-i)*WIDTHBYTES(lpBi->biWidth*8)+j)-*(pData+(

lpBi->biHeight-i-1)*WIDTHBYTES(lpBi->biWidth*8)+j+1)+128;//“雕刻”处理;

if(buf>255) buf=255;

if(buf<0)buf=0;

*(data+(lpBi->biHeight-i)*WIDTHBYTES(lpBi->biWidth*8)+j)=(BYTE)buf;

}

for( j=0; jbiHeight; j++)

for( i=0; ibiWidth; i++)//重新将处理后的图像数据写入原始的图像缓冲区内;

*(pData+i*WIDTHBYTES(lpBi->biWidth*8)+j)=*(data+i*WIDTHBYTES(lpBi->biWidth*8)+j);

pDoc->m_hDIB =hdib//将处理过的图像数据写回pDoc中的图像缓冲区;

GlobalUnlock((HGLOBAL)hdib);//解锁、释放缓冲区;

GlobalUnlock((HGLOBAL)data1handle);

GlobalFree((HGLOBAL)hdib);

GlobalFree((HGLOBAL)data1handle);

Invalidate(TRUE);//显示图像

}

3.图像的旋转

根据图像像素的位置来调节该位置的灰度可以实现许多显示的特效,例如图像的镜像、翻转等。灰度图像旋转就是根据这一个思想实现的,它是指把定义的图像绕某一点以逆时针或顺时针方向旋转一定的角度,通常是指绕图像的中心以逆时针方向旋转。首先根据旋转的角度、图像对角线的长度计算旋转后的图像的最大宽度、高度,根据旋转后图象最大的宽度、高度生成新的缓冲区,假设图像的左上角为(left, top),右下角为(right, bottom),则图像上任意点(x, y)绕其中心(xcenter, ycenter)逆时针旋转angle角度后,新的坐标位置(x1, y1)的计算公式为:

xcenter = (width+1)/2+left;

ycenter = (height+1)/2+top;

x1 = (x-xcenter) cosθ - (y - ycenter) sinθ+xcenter;

y1 = (x-xcenter) sinθ+ (y- ycenter) cosθ+ ycenter;

与图像的镜像变换相类似,下一步就是把原图中的(x,y)处象素的灰度值读入新缓冲区的(x1,y1)点处。注意在新缓冲区中与原图没有对应的象素点的值用白色或指定的灰度代替。

二、图像的分块显示和清除

1.图像的扫描显示和清除

扫描显示图像是最基本的特效显示方法,它表现为图像一行行(或一列列)地显示出来或从屏幕上清除掉,有种大戏院种的拉幕效果。根据扫描的方向的不同,可以分为上、下、左、右、水平平分和垂直平分等六种扫描。这里以向下移动为例,分别介绍显示和清除的实现。其余的扫描效果可以依次类推。向下扫描显示的实现方法是:从图像的底部开始将图像一行一行的复制到目标区域的顶部。每复制一行后,复制的行数便要增加一行,并加上一些延迟;向下移动清除的实现方法是图像向下移动显示,并在显示区域的上部画不断增高的矩形。

1)扫描显示的代码:

CdibView::OnImageDownScan()

{

CDibDoc *pDoc=GetDocument();

HDIB hdib;

CClientDC pDC(this);

hdib=pDoc->m_hDIB;//获取图像数据句柄;

BITMAPINFOHEADER *lpDIBHdr;//位图信息头结构指针;

BYTE *lpDIBBits;//指向位图像素灰度值的指针;

HDC hDC=pDC.GetSafeHdc();//获取当前设备上下文的句柄;

lpDIBHdr=( BITMAPINFOHEADER *)GlobalLock(hdib);//得到图像的位图头信息;

数字图像处理教学大纲(2014新版)

数字图像处理 课程编码:3073009223 课程名称:数字图像处理 总学分: 2 总学时:32 (讲课28,实验4) 课程英文名称:Digital Image Processing 先修课程:概率论与数理统计、线性代数、C++程序设计 适用专业:自动化专业等 一、课程性质、地位和任务 数字图像处理课程是自动化专业的专业选修课。本课程着重于培养学生解决智能化检测与控制中应用问题的初步能力,为在计算机视觉、模式识别等领域从事研究与开发打下坚实的理论基础。主要任务是学习数字图像处理的基本概念、基本原理、实现方法和实用技术,并能应用这些基本方法开发数字图像处理系统,为学习图像处理新方法奠定理论基础。 二、教学目标及要求 1.了解图像处理的概念及图像处理系统组成。 2.掌握数字图像处理中的灰度变换和空间滤波的各种方法。 3.了解图像变换,主要是离散和快速傅里叶变换等的原理及性质。 4.理解图像复原与重建技术中空间域和频域滤波的各种方法。 5. 理解解彩色图像的基础概念、模型和处理方法。 6. 了解形态学图像处理技术。 7. 了解图像分割的基本概念和方法。 三、教学内容及安排 第一章:绪论(2学时) 教学目标:了解数字图像处理的基本概念,发展历史,应用领域和研究内容。通过大量的实例讲解数字图像处理的应用领域;了解数字图像处理的基本步骤;了解图像处理系统的组成。 重点难点:数字图像处理基本步骤和图像处理系统的各组成部分构成。 1.1 什么是数字图像处理 1.2 数字图像处理的起源

1.3.1 伽马射线成像 1.3.2 X射线成像 1.3.3 紫外波段成像 1.3.4 可见光及红外波段成像 1.3.5 微波波段成像 1.3.6 无线电波成像 1.3.7 使用其他成像方式的例子 1.4 数字图像处理的基本步骤 1.5 图像处理系统的组成 第二章:数字图像基础(4学时) 教学目标:了解视觉感知要素;了解几种常用的图像获取方法;掌握图像的数字化过程及其图像分辨率之间的关系;掌握像素间的联系的概念;了解数字图像处理中的常用数学工具。 重点难点:要求重点掌握图像数字化过程及图像中像素的联系。 2.1 视觉感知要素(1学时) 2.1.1 人眼的构造 2.1.2 眼镜中图像的形成 2.1.3 亮度适应和辨别 2.2 光和电磁波谱 2.3 图像感知和获取(1学时) 2.3.1 用单个传感器获取图像 2.3.2 用条带传感器获取图像 2.3.3 用传感器阵列获取图像 2.3.4 简单的图像形成模型 2.4 图像取样和量化(1学时) 2.4.1 取样和量化的基本概念 2.4.2 数字图像表示 2.4.3 空间和灰度级分辨率 2.4.4 图像内插 2.5 像素间的一些基本关系(1学时) 2.5.1 相邻像素 2.5.2 临接性、连通性、区域和边界 2.5.3 距离度量 2.6 数字图像处理中所用数学工具的介绍 2.6.1 阵列与矩阵操作

数字图像处理知

数字图像处理知识点总结

数字图像处理知识点总结 第一章导论 1.图像:对客观对象的一种相似性的生动性的描述或写真。 2.图像分类:按可见性(可见图像、不可见图像),按波段数(单波段、多波段、超波段), 按空间坐标和亮度的连续性(模拟和数字)。3.图像处理:对图像进行一系列操作,以到达预期目的的技术。 4.图像处理三个层次:狭义图像处理、图像分析和图像理解。 5.图像处理五个模块:采集、显示、存储、通信、处理和分析。 第二章数字图像处理的基本概念 6.模拟图像的表示:f(x,y)=i(x,y)×r(x,y),照度分量0

称为采样。采样间隔和采样孔径的大小是两个 很重要的参数。采样方式:有缝、无缝和重叠。 9.将像素灰度转换成离散的整数值的过程叫量化。 10.表示像素明暗程度的整数称为像素的灰度级(或灰度值或灰度)。 11.数字图像根据灰度级数的差异可分为:黑白图像、灰度图像和彩色图像。 12.采样间隔对图像质量的影响:一般来说,采样间隔越大,所得图像像素数越少,空间分 辨率低,质量差,严重时出现像素呈块状的国际棋盘效应;采样间隔越小,所得图像像素数越多,空间分辨率高,图像质量好,但数据量大。13.量化等级对图像质量的影响:量化等级越多,所得图像层次越丰富,灰度分辨率高,图 像质量好,但数据量大;量化等级越少,图像层次欠丰富,灰度分辨率低,会出现假轮廓现象,图像质量变差,但数据量小。但在极少数情况下对固定图像大小时,减少灰度级能改善质量,产生这种情况的最可能原因是减少灰度级一般会增加图像的对比度。例如对细节比较丰富的图像数字化。

基于数字图像处理

基于数字图像处理 的目标识别 通过这半个学期对数字图像处理这门课程的学习,我了解了有关数字图像处理的知识,并且对数字图像处理的相关仿真软件——matlab有了更加深入的了解,可以更加熟练的使用matlab软件处理实际问题,从而促进我对数字图像处理这门课程产生更加浓烈的兴趣,也让我对这种仿真软件有了更加全面的认识,了解它更多的功能。在课程结束之际,我利用自己在课堂上学习的一些知识和在课下学习的东西写出以下总结。希望老师给予耐心指导。 一、数字图像处理技术 数字图像处理(Dital Image Processing)又称为计算机图像处理,它是指将图像信号转换成数字信号并利用计算机对其进行处理的过程。数字图像处理是一种通过计算机采用一定的算法对图形图像进行处理的技术。数字图像处理技术已经在各个领域上都有了比较广泛的应用。从接近人们日常生活的照相,电视图像显示,到工业上面对某些零件的处理等,再到军事类的人像识别,雷达目标识别等,这些都离不开数字图像处理的身影。 图像处理的信息量很大,对处理速度的要求也比较高。Matlab强大的运算和图形展示功能,使图像处理变得更加的简单和直观。本文基于

MATLAB的数字图像处理环境,设计并实现了一个图像处理系统,展示如何通过利用Matlab的工具函数和多种算法实现对图形图像的各种处理。论述了利用设计的系统实现图像文件(bmp、jpg、tiff、gif等)进行打开、保存、另存、打印、退出等功能操作,图像预处理功能(包括彩色图像的灰度化变换等、一般灰度图像的二值化处理、色彩增强等),图像分割,图像特征提取等图像处理。 图像的数学表达式可表示为:f(x,y)表示幅图像。x,y,f为有限、离散值。黑白图像可用二维函数f(x,y)表示,其中x,y是平面的二维坐标,f(x,y)表示点(x,y)的亮度值(灰度值)。对模拟图像来讲,f(x,y)显然是连续函数。为了适应数字计算机的处理,必须对连续图像函数进行空间和幅值数字化。空间坐标(x,y)的数字化称为图像采样,而幅值数字化被称为灰度级量化。经过数字化后的图像称为数字图像(或离散图像)。 F(x,y,z)表示三维的图像,f 为点的分布,有限,离散值,为彩色图像的表示方式。 (1)数字图像的灰度图像的阵列表示法。 设连续图像f(x,y)按等间隔采样,排成MxN阵列(一般取方阵列NxN) 图像阵列中每个元素都是离散值,称为像素(pix—el)。在数字图像处理中,一般取阵列N和灰度级C都是2的整数幂,即取N=及G=。对一般电视图像,N取256或512,灰度级C取64级(m=6bit)至256级m=8bit),即可满足图像处理的需要。对特殊要求的图像,如SAR图片取 10000×10000,灰度级m取8bit或者16bit。

数字图像处理实验指导书模板

《数字图像处理》实验指导书 编写: 罗建军 海南大学三亚学院 10月

目录 一、概述 ....................................................................... 错误!未定义书签。 二、建立程序框架 ....................................................... 错误!未定义书签。 三、建立图像类 ........................................................... 错误!未定义书签。 四、定义图像文档实现图像读/写.............................. 错误!未定义书签。 五、实现图像显示 ....................................................... 错误!未定义书签。 六、建立图像处理类................................................... 错误!未定义书签。 七、实现颜色处理功能............................................... 错误!未定义书签。 (一) 亮度处理................................................................. 错误!未定义书签。 (二) 对比度处理............................................................. 错误!未定义书签。 (三) 色阶处理................................................................. 错误!未定义书签。 (四) 伽马变换................................................................. 错误!未定义书签。 (五) 饱和度处理............................................................. 错误!未定义书签。 (六) 色调处理................................................................. 错误!未定义书签。 八、实现几何变换功能............................................... 错误!未定义书签。 (一) 图像缩放................................................................. 错误!未定义书签。 (二) 旋转......................................................................... 错误!未定义书签。 (三) 水平镜像................................................................. 错误!未定义书签。 (四) 垂直镜像................................................................. 错误!未定义书签。 (五) 右转90度................................................................. 错误!未定义书签。 (六) 左转90度................................................................. 错误!未定义书签。 (七) 旋转180度............................................................... 错误!未定义书签。 九、实现平滑锐化功能............................................... 错误!未定义书签。 十、图像处理扩展编程............................................... 错误!未定义书签。

基于数字图像处理的车牌识别系统

基于数字图像处理的车牌识别系统

基于数字图像处理的车牌识别系统 言经官 电气学院电子112 摘要:车牌识别系统(License Plate Recognition 简称LPR)技术基于数字图像处理,是智能交通系统中的关键技术,同时他的发展也十分迅速,已经逐渐融入到我们的现实生活中。文章介绍了车牌识别系统的意义、图像去噪处理以及图像二值化方法,并通过仿真试验模拟了图像处理的过程。本文所做的工作在于前期的图像预处理工作。本次设计着重在于图像识别方面, 中心工作都为此而展开,文中没有进行车牌的定位处理,而是采用数码相机直接对牌照进行正面拍照,获取原始车牌图像。之后利用Matlab编程对图片进行了大小的调整、彩色图片转化成灰度图片、图片去噪、以及图片二值化等工作。其中,去噪与二值化是关系图像识别率的关键。 关键字:车牌识别系统;图像预处理;字符识别;Matlab;去噪;二值化 引言 智能交通系统(ITS)是当今世界交通管理体系发展的必然趋势,而作为智能交通系统中的重要组成部分之一的车牌自动识别技术,目前已被广泛应用于城市道路监控、高速公路收费与监控、小区与停车场出入口管理、公安治安卡口等场合,成为研究的热点。 伴随我国国民经济的高速发展,国内高速公路、城市道路、停车场建设越来越多,对交通控制,安全管理的要求也日益提高。因此迫切需要采用高科技手段,对违法违章车辆牌照进行登记, 在这种情况下,作为信息来源的自动检索,图像识别技术越来越受到人们的重视。车牌识别系统的出现成为了交通管制必不可少的有力武器。 1 车牌识别系统的目标 利用计算机等辅助设备进行的自动汽车牌照自动识别就是在装备了数字摄像设备和计算机信息管理系统等软硬件平台的基础之上,通过对车辆图像的采集,采用先进的图像处理、模式识别和人工智能技术,在图像中找到车牌的位置,提取出组成车牌号码的全部字符图像,再识别出车牌中的文字、字母和数字,最后给出车牌的真实号码。国外的车牌识别研究始于80 年代,90 年代始已有不少成套的产品出现。由于我国车牌的组成及组合的方式与国外的车牌不一致,使得我们不能直接使用国外的车辆牌照识别系统,而必须针对我国车牌重新设计相应的车辆牌照识别系统。车牌识别的使用环境、背景各有差异,目前还没有一种算法能在不同环境、各种复杂背景条件下达到非常高的车牌识别率,因而车牌识别技术仍然是研究的重点。 2 MATLAB 及其图像处理工具概述 MATLAB 是MAT rix LABora tory( 矩阵实验室) 的缩写, 是Ma thWorks 公司开发的一种功能强、效率高、简单易学的数学软件。MATLAB 7. 1 是一套功能十分强大的工程计算及数据分析软件, 其应用范围涵盖了数学、工业技术、电子科学、医疗卫生、建筑、金融、数字图像处理等各个领域。MATLAB 的图像处理工具箱, 功能十分强大, 支持的图像文件格式丰富, 如* .BMP、* . JPG、* . JPEG、* . GIF、* . ti;f% 95% 94、* . ti;f%95%94F、* . PNG、* . PCX、* . XWD、* . HDF、* . ICO、* .CUR 等。本文将给出MATLAB的图像处理工具箱中的图像处理函数实现图像处理与分析的应用技术实例。

《数字图像处理》课程学习心得

《数字图像处理》课程学习心得 导读:本文《数字图像处理》课程学习心得,仅供参考,如果能帮助到您,欢迎点评和分享。 《数字图像处理》课程学习心得(一) 在这一学期,我选修了《数字图像处理基础》这门课程,同时,老师还讲授了一些视频处理的知识。在这里,梳理一下这学期学到的知识,并提出一些我对这门课程的建议。 图像处理是指对图像信息进行加工,从而满足人类的心理、视觉或者应用的需求的一种行为。图像处理方法一般有数字法和光学法两种,其中数字法的优势很明显,已经被应用到了很多领域中,相信随着科学技术的发展,其应用空间将会更加广泛。数字图像处理又称为计算机图像处理,它是指将图像信号转换成数字信号并利用计算机对其进行处理的过程。数字图像处理是从20世纪60年代以来随着计算机技术和VLSL的发展而产生、发展和不断成熟起来的一个新兴技术领域。数字图像处理技术其实就是利用各种数字硬件与计算机,对图像信息通过转换而得到的电信号进行相应的数学运算,例如图像去噪、图像分割、提取特征、图像增强、图像复原等,以便提高图像的实用性。其特点是处理精度比较高,并且能够对处理软件进行改进来优化处理效果,操作比较方便,但是由于数字图像需要处理的数据量一般很大,因此处理速度有待提高。目前,随着计算机技术的不断发展,计算机的运算速度得到了很大程度的提高。在短短的历史中,它

却广泛应用于几乎所有与成像有关的领域,在理论上和实际应用上都取得了巨大的成就。 1、数字图像处理需用到的关键技术 由于数字图像处理的方便性和灵活性,因此数字图像处理技术已经成为了图像处理领域中的主流。数字图像处理技术主要涉及到的关键技术有:图像的采集与数字化、图像的编码、图像的增强、图像恢复、图像分割、图像分析等。 图像的采集与数字化:就是通过量化和取样将一个自然图像转换为计算机能够处理的数字形式。 图像编码:图像编码的目的主要是来压缩图像的信息量,以便能够满足存储和传输的要求。 图像的增强:图像的增强其主要目的是使图像变得清晰或者将其变换为机器能够很容易分析的形式,图像增强方法一般有:直方图处理、灰度等级、伪彩色处理、边缘锐化、干扰抵制。 图像的恢复:图像恢复的目的是减少或除去在获得图像的过程中因为各种原因而产生的退化,可能是由于光学系统的离焦或像差、被摄物与摄像系统两者之间的相对运动、光学或电子系统的噪声与介于被摄像物跟摄像系统之间的大气湍流等等。 图像的分割:图像分割是将图像划分为一些互相不重叠的区域,其中每一个区域都是像素的一个连续集,通常采用区域法或者寻求区域边界的境界法。 图像分析:图像分析是指从图像中抽取某些有用的信息、数据或

数字图像处理

基于MATLAB的数字图像空域平滑法 摘要:本文通过在MATLAB环境下,对比中值滤波与均值滤波处理带有椒盐噪声的图像,中值滤波不同模板处理加入椒盐噪声的图像以及中值滤波处理加入不同噪声图像的效果图,分析中值滤波的优缺点。 1 引言 图像平滑的目的是为了去除或衰减图像中的噪声和假轮廓,它可以分为空域法和频域法.而空域法就是直接对图像的像素灰度值进行处理,以达到滤除或衰减图像中噪声的目的.空域法主要包括基于平均的方法和中值滤波法.本文重点以中值滤波法为主,详细介绍MATLAB环境下,中值滤波相对均值滤波的优缺点,不同模板中值滤波对加入椒盐噪声图像的处理效果以及中值滤波法对加入不同噪声图像的处理效果。 2 中值滤波的概念 中值滤波是一种典型的低通滤波器,属于非线性滤波技术,它的目的是保护图像边缘的同时去除噪声。所谓中值滤波,是指把以某点(x,y)为中心的小窗口内的所有象素的灰度按从大到小的顺序排列,若窗口中的象素为奇数个,则将中间值作为(x,y)处的灰度值。若窗口中的象素为偶数个,则取两个中间值的平均值作为(x,y)处的灰度值。中值滤波对去除椒盐噪声很有效。中值滤波器的缺点是对所有象素点采用一致的处理,在滤除噪声的同时有可能改变真正象素点的值,引入误差,损坏图像的边缘和细节。 3 中值滤波器与均值滤波器的比较 本文采用的图像是一幅多值图像,首先将其灰度化,并加入椒盐噪声,在MATALB环境下,采用3*3窗口的中值滤波器与均值滤波器处理此图像,编写程序如下: A=imread('1.jpg'); h=ones(3,3)/9; A_zh=rgb2gray(A); A_noi=imnoise(A_zh,'salt & pepper',0.02); A_med=medfilt2(A_noi); A_low=imfilter(A_noi,h); subplot(2,2,1);imshow(A_zh);title('灰度图像'); subplot(2,2,2);imshow(A_noi);title('加入椒盐噪声的图像'); subplot(2,2,3);imshow(A_med);title('中值滤波图像'); subplot(2,2,4);imshow(A_low);title('均值滤波图像'); 程序运行结果如图2所示。图像文件1.jpg中存储着一幅彩色图像,把该文件读入后使用函数imadjust进行调整。调整后的范围是默认的范围【0 0 0;1 1 1】,

基于数字图像处理的车牌识别系统

基于数字图像处理的车牌识别系统 言经官 电气学院电子112 摘要:车牌识别系统(License Plate Recognition 简称LPR)技术基于数字图像处理,是智能交通系统中的关键技术,同时他的发展也十分迅速,已经逐渐融入到我们的现实生活中。文章介绍了车牌识别系统的意义、图像去噪处理以及图像二值化方法,并通过仿真试验模拟了图像处理的过程。本文所做的工作在于前期的图像预处理工作。本次设计着重在于图像识别方面, 中心工作都为此而展开,文中没有进行车牌的定位处理,而是采用数码相机直接对牌照进行正面拍照,获取原始车牌图像。之后利用Matlab编程对图片进行了大小的调整、彩色图片转化成灰度图片、图片去噪、以及图片二值化等工作。其中,去噪与二值化是关系图像识别率的关键。 关键字:车牌识别系统;图像预处理;字符识别;Matlab;去噪;二值化 引言 智能交通系统(ITS)是当今世界交通管理体系发展的必然趋势,而作为智能交通系统中的重要组成部分之一的车牌自动识别技术,目前已被广泛应用于城市道路监控、高速公路收费与监控、小区与停车场出入口管理、公安治安卡口等场合,成为研究的热点。 伴随我国国民经济的高速发展,国内高速公路、城市道路、停车场建设越来越多,对交通控制,安全管理的要求也日益提高。因此迫切需要采用高科技手段,对违法违章车辆牌照进行登记, 在这种情况下,作为信息来源的自动检索,图像识别技术越来越受到人们的重视。车牌识别系统的出现成为了交通管制必不可少的有力武器。 1 车牌识别系统的目标 利用计算机等辅助设备进行的自动汽车牌照自动识别就是在装备了数字摄像设备和计算机信息管理系统等软硬件平台的基础之上,通过对车辆图像的采集,采用先进的图像处理、模式识别和人工智能技术,在图像中找到车牌的位置,提取出组成车牌号码的全部字符图像,再识别出车牌中的文字、字母和数字,最后给出车牌的真实号码。国外的车牌识别研究始于80 年代,90 年代始已有不少成套的产品出现。由于我国车牌的组成及组合的方式与国外的车牌不一致,使得我们不能直接使用国外的车辆牌照识别系统,而必须针对我国车牌重新设计相应的车辆牌照识别系统。车牌识别的使用环境、背景各有差异,目前还没有一种算法能在不同环境、各种复杂背景条件下达到非常高的车牌识别率,因而车牌识别技术仍然是研究的重点。 2 MATLAB 及其图像处理工具概述 MATLAB 是MAT rix LABora tory( 矩阵实验室) 的缩写, 是Ma thWorks 公司开发的一种功能强、效率高、简单易学的数学软件。MATLAB 7. 1 是一套功能十分强大的工程计算及数据分析软件, 其应用范围涵盖了数学、工业技术、电子科学、医疗卫生、建筑、金融、数字图像处理等各个领域。MATLAB 的图像处理工具箱, 功能十分强大, 支持的图像文件格式丰富, 如* .BMP、* . JPG、* . JPEG、* . GIF、* . ti;f% 95% 94、* . ti;f%95%94F、* . PNG、* . PCX、* . XWD、* . HDF、* . ICO、* .CUR 等。本文将给出MATLAB的图像处理工具箱中的图像处理函数实现图像处理与分析的应用技术实例。

数字图像处理基础知识总结

第一章数字图像处理概论 *图像是对客观存在对象的一种相似性的、生动性的描述或写真。 *模拟图像 空间坐标和明暗程度都是连续变化的、计算机无法直接处理的图像 *数字图像 空间坐标和灰度均不连续的、用离散的数字(一般整数)表示的图像(计算机能处理)。是图像的数字表示,像素是其最小的单位。 *数字图像处理(Digital Image Processing) 利用计算机对数字图像进行(去除噪声、增强、复原、分割、特征提取、识别等)系列操作,从而获得某种预期的结果的技术。(计算机图像处理) *数字图像处理的特点(优势) (1)处理精度高,再现性好。(2)易于控制处理效果。(3)处理的多样性。(4)图像数据量庞大。(5)图像处理技术综合性强。 *数字图像处理的目的 (1)提高图像的视感质量,以达到赏心悦目的目的 a.去除图像中的噪声; b.改变图像的亮度、颜色; c.增强图像中的某些成份、抑制某些成份; d.对图像进行几何变换等,达到艺术效果; (2)提取图像中所包含的某些特征或特殊信息。 a.模式识别、计算机视觉的预处理 (3)对图像数据进行变换、编码和压缩,以便于图像的存储和传输。 **数字图像处理的主要研究内容 (1)图像的数字化 a.如何将一幅光学图像表示成一组数字,既不失真又便于计算机分析处理 b.主要包括的是图像的采样与量化 (2*)图像的增强 a.加强图像的有用信息,消弱干扰和噪声 (3)图像的恢复 a.把退化、模糊了的图像复原。模糊的原因有许多种,最常见的有运动模糊,散焦模糊等(4*)图像的编码 a.简化图像的表示,压缩表示图像的数据,以便于存储和传输。 (5)图像的重建 a.由二维图像重建三维图像(如CT) (6)图像的分析 a.对图像中的不同对象进行分割、分类、识别和描述、解释。 (7)图像分割与特征提取 a.图像分割是指将一幅图像的区域根据分析对象进行分割。 b.图像的特征提取包括了形状特征、纹理特征、颜色特征等。 (8)图像隐藏 a.是指媒体信息的相互隐藏。 b.数字水印。 c.图像的信息伪装。 (9)图像通信

数字图像处理代码大全

1.图像反转 MATLAB程序实现如下: I=imread('xian.bmp'); J=double(I); J=-J+(256-1); %图像反转线性变换 H=uint8(J); subplot(1,2,1),imshow(I); subplot(1,2,2),imshow(H); 2.灰度线性变换 MATLAB程序实现如下: I=imread('xian.bmp'); subplot(2,2,1),imshow(I); title('原始图像'); axis([50,250,50,200]); axis on; %显示坐标系 I1=rgb2gray(I); subplot(2,2,2),imshow(I1); title('灰度图像'); axis([50,250,50,200]); axis on; %显示坐标系 J=imadjust(I1,[0.1 0.5],[]); %局部拉伸,把[0.1 0.5]的灰度拉伸为[0 1]

subplot(2,2,3),imshow(J); title('线性变换图像[0.1 0.5]'); axis([50,250,50,200]); grid on; %显示网格线 axis on; %显示坐标系 K=imadjust(I1,[0.3 0.7],[]); %局部拉伸,把[0.3 0.7]的灰度拉伸为[0 1] subplot(2,2,4),imshow(K); title('线性变换图像[0.3 0.7]'); axis([50,250,50,200]); grid on; %显示网格线 axis on; %显示坐标系 3.非线性变换 MATLAB程序实现如下: I=imread('xian.bmp'); I1=rgb2gray(I); subplot(1,2,1),imshow(I1); title('灰度图像'); axis([50,250,50,200]); grid on; %显示网格线 axis on; %显示坐标系 J=double(I1);

基于Matlab的数字图像处理系统毕业设计论文

论文(设计)题目: 基于MATLAB的数字图像处理系统设计 姓名宋立涛 学号201211867 学院信息学院 专业电子与通信工程 年级2012级 2013年6月16日

基于MATLAB的数字图像处理系统设计 摘要 MATLAB 作为国内外流行的数字计算软件,具有强大的图像处理功能,界面简洁,操作直观,容易上手,而且是图像处理系统的理想开发工具。 笔者阐述了一种基于MATLAB的数字图像处理系统设计,其中包括图像处理领域的大部分算法,运用MATLAB 的图像处理工具箱对算法进行了实现,论述了利用系统进行图像显示、图形表换及图像处理过程,系统支持索引图像、灰度图像、二值图像、RGB 图像等图像类型;支持BMP、GIF、JPEG、TIFF、PNG 等图像文件格式的读,写和显示。 上述功能均是在MA TLAB 语言的基础上,编写代码实现的。这些功能在日常生活中有很强的应用价值,对于运算量大、过程复杂、速度慢的功能,利用MATLAB 可以既能快速得到数据结果,又能得到比较直观的图示。 关键词:MATLAB 数字图像处理图像处理工具箱图像变换

第一章绪论 1.1 研究目的及意义 图像信息是人类获得外界信息的主要来源,近代科学研究、军事技术、工农业生产、医学、气象及天文学等领域中,人们越来越多地利用图像信息来认识和判断事物,解决实际问题,由此可见图像信息的重要性,数字图像处理技术将会伴随着未来信息领域技术的发展,更加深入到生产和科研活动中,成为人类生产和生活中必不可少的内容。 MATLAB 软件不断吸收各学科领域权威人士所编写的实用程序,经过多年的逐步发展与不断完善,是近几年来在国内外广泛流行的一种可视化科学计算软件。MATLAB 语言是一种面向科学与工程计算的高级语言,允许用数学形式的语言来编写程序,比Basic、Fortan、C 等高级语言更加接近我们书写计算公式的思维方式,用MATLAB 编写程序犹如在演算纸上排列出公式与求解问题一样。它编写简单、编程效率高并且通俗易懂。 1.2 国内外研究现状 1.2.1 国内研究现状 国内在此领域的研究中具有代表性的是清华大学研制的数字图像处理实验开发系统TDB-IDK 和南京东大互联技术有限公司研制的数字图像采集传输与处理实验软件。 TDB-IDK 系列产品是一款基于TMS320C6000 DSP 数字信号处理器的高级视频和图像系统,也是一套DSP 的完整的视频、图像解决方案,该系统适合院校、研究所和企业进行视频、图像方面的实验与开发。该软件能够完成图像采集输入程序、图像输出程序、图像基本算法程序。可实现对图像信号的实时分析,图像数据相对DSP独立方便开发人员对图像进行处理,该产品融合DSP 和FPGACPLD 两个高端技术,可以根据用户的具体需求合理改动,可以分析黑白和彩色信号,可以完成图形显示功能。 南京东大互联技术有限公司研制的数字图像采集传输与处理实验软件可实现数字图像的采集、传输与处理。可利用软件及图像采集与传输设备,采集图像并实现点对点的数字图像传输,可以观察理解多种图像处理技术的效果和差别,

(完整版)学习数字图像处理心得

学习数字图像处理心得 姓名:黄冬芬学号:070212051 班级:12级通信工程1班数字图像是我们生活中接触最多的图像种类,他伴随人们的生活、学习、工作,并在军事、工业和医学方面发挥着极大地作用,可谓随处可见,尤其在生活方面作为学生的我们,会在外出旅游,生活和工作中拆下许多数字照片,现在已进入信息化时代,图片作为信息的重要载体,在信息传输方面有着不可替代的作用,并且近年来图像处理领域,数字图像处理技术取得了飞速的发展,作为计算机类专业的大学生更加有必要对数字图像处理技术有一定的掌握,而大多数人对于数字图像的知识也很模糊,比如各类繁多的各种图像格式之间的特点,不同的情况该用何种图像格式,还有关于图像的一些基本术语也不甚了解。尤为重要的是一些由于拍摄问题导致的令人不甚满意的照片该如何处理,或者如何对一些照片进行处理实现特殊的表现效果。所以对于数字图像处理这门课大家有着极大地兴趣。我们班有的同学学过Photoshop软件,因此对于数字图像处理有了一些基础,更加想利用这门课的学习加深自己数字图像处理的理解并提高在数字图像处理方面的能力。 通过这8周的学习,我们虽然还没有完全掌握数字图像处理技术,但是收获不少,对于数字图像方面的知识有了更深的了解。更加理解了数字图像处理的本质,即是一些数字矩阵,但灰度图像和彩色图像的矩阵形式是不同的。对于一些耳熟能详的数字图像相关的术语有了明确的认识,比如,常见的像素(衡量图像的大小)、分辨率(衡

量图像的清晰程度)、位图(放大后会失真)、矢量图(经过放大不会失真)等大家都能叫上口但都很模糊的名词。也了解图像处理技术中一些常用处理技术的实质,比如锐化处理是使模糊的图像变清晰,增强图片的边缘等细节。而平滑处理的目的是消除噪声、模糊图像,在提取大目标之前去除小的细节或弥合目标间的缝隙。对常见的RGB图像和灰度图像有了明确的理解,这对大家以后应用Photoshop等图像处理软件对图像进行处理打下了坚实的基础。更重要的是学习到了数字图像处理的思想。通过学习也是对C++编程应用的很好的实践和复习。 当然通过8周的学习还远远不够,也有许多同学收获甚微,我总结了下大家后期学习的态度与前期学习的热情相差很大的原因。刚开始大家是有很高的热情去学习这门课,可随着这门课的更深入的学习,大家渐渐发现课程讲授内容与自己起初想学的实用图像处理技术是有很大的差别的,大家更着眼于如何利用软件、技术去处理图像而得到满意的效果,或者进行一些图像的创意设计,可是课程的内容更偏向于如何通过编程实现如何多图像进行一些类似锐化、边缘提取、模糊、去除噪声等基础功能的实现,这其中涉及很多算法、函数,需要扎实的数学基础和编程基础,并且需要利用大量时间在课下编写代码,并用visual c++软件实现并进行调试,然而大部分人的C++实践能力和编程能力还有待提高,尤其是对于矩阵进行操作的编程尤为是个考验。 在老师授课方面的建议是可以再课上多进行一些具体操作,这

数字图像处理试题及答案

一、填空题(每题1分,共15分) 1、列举数字图像处理的三个应用领域 医学 、天文学 、 军事 2、存储一幅大小为10241024?,256个灰度级的图像,需要 8M bit 。 3、亮度鉴别实验表明,韦伯比越大,则亮度鉴别能力越 差 。 4、直方图均衡化适用于增强直方图呈 尖峰 分布的图像。 5、依据图像的保真度,图像压缩可分为 无损压缩 和 有损压缩 6、图像压缩是建立在图像存在 编码冗余 、 像素间冗余 、 心理视觉冗余 三种冗余基础上。 7、对于彩色图像,通常用以区别颜色的特性是 色调 、 饱和度 亮度 。 8、对于拉普拉斯算子运算过程中图像出现负值的情况,写出一种标定方法: m i n m a x m i ((,))*255/()g x y g g g -- 二、选择题(每题2分,共20分) 1、采用幂次变换进行灰度变换时,当幂次取大于1时,该变换是针对如下哪一类图像进行增强。 ( B ) A 图像整体偏暗 B 图像整体偏亮 C 图像细节淹没在暗背景中 D 图像同时存在过亮和过暗背景 2、图像灰度方差说明了图像哪一个属性。( B ) A 平均灰度 B 图像对比度 C 图像整体亮度 D 图像细节 3、计算机显示器主要采用哪一种彩色模型( A ) A 、RG B B 、CMY 或CMYK C 、HSI D 、HSV 4、采用模板[-1 1]T 主要检测( A )方向的边缘。 A.水平 B.45? C.垂直 D.135? 5、下列算法中属于图象锐化处理的是:( C ) A.低通滤波 B.加权平均法 C.高通滤波 D. 中值滤波 6、维纳滤波器通常用于( C ) A 、去噪 B 、减小图像动态范围 C 、复原图像 D 、平滑图像 7、彩色图像增强时, C 处理可以采用RGB 彩色模型。 A. 直方图均衡化 B. 同态滤波 C. 加权均值滤波 D. 中值滤波 8、__B__滤波器在对图像复原过程中需要计算噪声功率谱和图像功率谱。 A. 逆滤波 B. 维纳滤波 C. 约束最小二乘滤波 D. 同态滤波 9、高通滤波后的图像通常较暗,为改善这种情况,将高通滤波器的转移函数加上一常数量以便引入 一些低频分量。这样的滤波器叫 B 。 A. 巴特沃斯高通滤波器 B. 高频提升滤波器 C. 高频加强滤波器 D. 理想高通滤波器 10、图象与灰度直方图间的对应关系是 B __ A.一一对应 B.多对一 C.一对多 D.都不 三、判断题(每题1分,共10分)

数字图像处理课程设计报告

本科综合课程设计报告 题 目 ____________________________ 指导教师__________________________ 辅导教师__________________________ 学生姓名__________________________ 学生学号__________________________ _______________________________ 院(部)____________________________专业________________班 ___2008___年 _12__月 _30__日 数字图像处理演示系统 信息科学与技术学院 通信工程 052

1 主要内容 1.1数字图像处理背景及应用 数字图像处理的目的是改善图像的质量,它以人为对象,以改善人的视觉效果为目的。目前,图像处理演示系统应用领域广泛医学、军事、科研、商业等领域。因为数字图像处理技术易于实现非线性处理,处理程序和处理参数可变,故是一项通用性强,精度高,处理方法灵活,信息保存、传送可靠的图像处理技术。本图像处理演示系统以数字图像处理理论为基础,对某些常用功能进行界面化设计,便于初级用户的操作。 1.2 图像处理演示系统设计要求 能加载和显示原始图像,显示和输出处理后的图像; 系统要便于维护和具备可扩展性; 界面友好便于操作; 1.3 图像处理演示系统设计任务 数字图像处理演示系统应该具备图像的几何变换(平移、缩放、旋转、翻转)、图像增强(空间域的平滑滤波与锐化滤波)的简单处理功能。 1.3.1几何变换 几何变换又称为几何运算,它是图像处理和图像分析的重要内容之一。通过几何运算,可以根据应用的需要使原图像产生大小、形状、和位置等各方面的变化。简单的说,几何变换可以改变像素点所在的几何位置,以及图像中各物体之间的空间位置关系,这种运算可以被看成是将各物体在图像内移动,特别是图像具有一定的规律性时,一个图像可以由另外一个图像通过几何变换来产生。实际上,一个不受约束的几何变换,可将输入图像的一个点变换到输出图像中的任意位置。几何变换不仅提供了产生某些特殊图像的可能,甚至还可以使图像处理程序设计简单化。从变换性质来分可以分为图像的位置变换、形状变换等 1.3.2图像增强 图像增强是数字图像处理的基本内容之一,其目的是根据应用需要突出图像中的某些“有用”的信息,削弱或去除不需要的信息,以达到扩大图像中不同物体特征之间的差别,使处理后的图像对于特定应用而言,比原始图像更合适,或者为图像的信息提取以及其他图像分析技术奠定了基础。一般情况下,经过增强处理后,图像的视觉效果会发生改变,这种变化意味着图像的视觉效果得到了改善,某些特定信息得到了增强。

基于VC++的数字图像处理课程设计

基于VC++的数字图像处理课程设计 一、概述 本次电子课程设计是基于VC++ 6.0 MFC多文档编程编写一个图像处理软件,这个软件能够实现BMP格式图像的浏览与编辑,打开和保存。实现对图像的平滑处理,包括邻域平均法和中值滤波法。还有对图像的锐化处理,包括梯度法和拉普拉斯算子法。 BMP文件是Windows操作系统中的标准图像文件格式,可以分成两类:设备相关位图和设备无关位图,使用非常广。它采用位映射存储格式,除了图像深度可选外,不采用其他任何压缩,因此BMP文件所占用的空间很大。由于BMP文件格式是Windows环境交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。 图像平滑的目的是为了消除噪声,主要处理的方式有邻域平均法即通过提高信噪比,取得较好的平滑效果;空间域低通滤波采用低通滤波的方法去除噪声;以及频率低通滤波法通过除去其高频分量就能去掉噪声,从而使图像的到平滑。 图像锐化的主要目的是为了增强图像边缘、轮廓和细节,使模糊的图像变得更加清晰,颜色、细节变得鲜明突出,图像的质量有所改善,产生更适合人眼观察和识别的图像。 经过平滑的图像变得模糊的根本原因是因为图像受到了平均或积分运算,因此可对其进行逆运算(如微分运算)就可以使图像变得清晰。从频率域来考虑,图像模糊的实质是因为其高频分量被衰减,因此可以用高通滤波器来使图像清晰。 主要功能概述: 1、打开和保存8位bmp图像 2、图像平滑处理:分为邻域平均法和中值滤波法。邻域平均法中又有3*3均值滤波器 法、超限邻域平均法、n*n均值滤波器法、有选择的局部平均化。中值滤波法中有n*n中值滤波器法、十字形中值滤波法、n*n最大值滤波器法。 3、图像锐化处理:分为梯度法和拉普拉斯算子法。 二、程序流程图

数字图像处理学习报告

数字图像处理学习报告 在这一学期,我选修了《数字图像处理基础》这门课程,同时,老师还讲授了一些视频处理的知识。在这里,梳理一下这学期学到的知识,并提出一些我对这门课程的建议。 图像处理是指对图像信息进行加工,从而满足人类的心理、视觉或者应用的需求的一种行为。图像处理方法一般有数字法和光学法两种,其中数字法的优势很明显,已经被应用到了很多领域中,相信随着科学技术的发展,其应用空间将会更加广泛。数字图像处理又称为计算机图像处理,它是指将图像信号转换成数字信号并利用计算机对其进行处理的过程.数字图像处理是从20世纪60年代以来随着计算机技术和VLSL的发展而产生、发展和不断成熟起来的一个新兴技术领域。数字图像处理技术其实就是利用各种数字硬件与计算机,对图像信息通过转换而得到的电信号进行相应的数学运算,例如图像去噪、图像分割、提取特征、图像增强、图像复原等,以便提高图像的实用性。其特点是处理精度比较高,并且能够对处理软件进行改进来优化处理效果,操作比较方便,但是由于数字图像需要处理的数据量一般很大,因此处理速度有待提高。目前,随着计算机技术的不断发展,计算机的运算速度得到了很大程度的提高。在短短的历史中,它却广泛应用于几乎所有与成像有关的领域,在理论上和实际应用上都取得了巨大的成就。 1. 数字图像处理需用到的关键技术 由于数字图像处理的方便性和灵活性,因此数字图像处理技术已经成为了图像处理领域中的主流。数字图像处理技术主要涉及到的关键技术有:图像的采集与数字化、图像的编码、图像的增强、图像恢复、图像分割、图像分析等。 图像的采集与数字化:就是通过量化和取样将一个自然图像转换为计算机能够处理的数字形式。 图像编码:图像编码的目的主要是来压缩图像的信息量,以便能够满足存储和传输的要 求。 图像的增强:图像的增强其主要目的是使图像变得清晰或者将其变换为机器能够很容易 分析的形式,图像增强方法一般有:直方图处理、灰度等级、伪彩色处理、边缘锐化、干扰抵制。 图像的恢复:图像恢复的目的是减少或除去在获得图像的过程中因为各种原因而产生的 退化,可能是由于光学系统的离焦或像差、被摄物与摄像系统两者之间的相对运动、光学或电子系统的噪声与介于被摄像物跟摄像系统之间的大气湍流等等。 图像的分割:图像分割是将图像划分为一些互相不重叠的区域,其中每一个区域都是像素的一个连续集,通常采用区域法或者寻求区域边界的境界法。 图像分析:图像分析是指从图像中抽取某些有用的信息、数据或度量,其目的主要是想得到某种数值结果。图像分析的内容跟人工智能、模式识别的研究领域有一定的交叉。

相关主题
文本预览
相关文档 最新文档