数字图像处理实验报告

阿林

数字图像处理实验报告

  数字图像处理实验报告1

  一. 实验内容:

  主要是图像的几何变换的编程实现,具体包括图像的读取、改写,图像平移,图像的镜像,图像的转置,比例缩放,旋转变换等.

  具体要求如下:

  1.编程实现图像平移,要求平移后的图像大小不变;

  2.编程实现图像的镜像;

  3.编程实现图像的转置;

  4.编程实现图像的比例缩放,要求分别用双线性插值和最近邻插值两种方法来实

  现,并比较两种方法的缩放效果;

  5.编程实现以任意角度对图像进行旋转变换,要求分别用双线性插值和最近邻插

  值两种方法来实现,并比较两种方法的旋转效果.

  二.实验目的和意义:

  本实验的目的是使学生熟悉并掌握图像处理编程环境,掌握图像平移、镜像、转置和旋转等几何变换的方法,并能通过程序设计实现图像文件的读、写操作,及图像平移、镜像、转置和旋转等几何变换的程序实现.

  三.实验原理与主要框架:

  3.1 实验所用编程环境:

  Visual C++(简称VC)是微软公司提供的基于C/C++的应用程序集成开发工具.VC拥有丰富的功能和大量的扩展库,使用它能有效的创建高性能的Windows应用程序和Web应用程序.

  VC除了提供高效的C/C++编译器外,还提供了大量的可重用类和组件,包括著名的微软基础类库(MFC)和活动模板类库(ATL),因此它是软件开发人员不可多得的开发工具.

  VC丰富的功能和大量的扩展库,类的重用特性以及它对函数库、DLL库的支持能使程序更好的模块化,并且通过向导程序大大简化了库资源的使用和应用程序的开发,正由于VC具有明显的优势,因而我选择了它来作为数字图像几何变换的开发工具.

  在本程序的开发过程中,VC的核心知识、消息映射机制、对话框控件编程等都得到了生动的体现和灵活的应用.

  3.2 实验处理的对象:256色的BMP(BIT MAP )格式图像

  BMP(BIT MAP )位图的文件结构:

  具体组成图: BITMAPFILEHEADER

  位图文件头

  (只用于BMP文件) bfType=”BM” bfSize bfReserved1

  bfReserved2

  bfOffBits

  biSize

  biWidth

  biHeight

  biPlanes

  biBitCount

  biCompression

  biSizeImage

  biXPelsPerMeter

  biYPelsPerMeter

  biClrUsed

  biClrImportant

  单色DIB有2个表项

  16色DIB有16个表项或更少

  256色DIB有256个表项或更少

  真彩色DIB没有调色板

  每个表项长度为4字节(32位)

  像素按照每行每列的顺序排列

  每一行的字节数必须是4的整数

  倍BITMAPINFOHEADER 位图信息头 Palette 调色板 DIB Pixels DIB图像数据

  1. BMP文件组成

  BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成.

  2. BMP文件头

  BMP文件头数据结构含有BMP文件的类型(必须为BMP)、文件大小(以字节为单位)、位图文件保留字(必须为0)和位图起始位置(以相对于位图

  文件头的偏移量表示)等信息.

  3. 位图信息头

  BMP位图信息头数据用于说明位图的尺寸(宽度,高度等都是以像素为单位,大小

  以字节为单位, 水平和垂直分辨率以每米像素数为单位) ,目标设备的级别,每个像素所需的位数, 位图压缩类型(必须是 0)等信息.

  4. 颜色表

  颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD

  类型的结构,定义一种颜色.具体包含蓝色、红色、绿色的亮度(值范围为0-255)

  位图信息头和颜色表组成位图信息

  5. 位图数据

  位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描

  行之间是从下到上.

  Windows规定一个扫描行所占的字节数必须是 4的倍数(即以long为单位),不足的以0填充.

  3.3 BMP(BIT MAP )位图的显示:

  ①一般显示方法:

  1. 申请内存空间用于存放位图文件

  2. 位图文件读入所申请内存空间中

  3. 在函数中用创建显示用位图, 用函数创建兼容DC,用函数选择显示删除位图

  但以上方法的缺点是: 1)显示速度慢; 2) 内存占用大; 3) 位图在缩小显示时图形失真大,(可通过安装字体平滑软件来解决); 4) 在低颜色位数的设备上(如256显示模式)显示高颜色位数的图形(如真彩色)图形失真严重.

  ②BMP位图缩放显示 :

  用视频函数来显示位图,内存占用少,速度快,而且还可以对图形进行淡化(Dithering )处理.淡化处理是一种图形算法,可以用来在一个支持比图像所用颜色要少的设备上显示彩色图像.BMP位图显示方法如下:

  1. 打开视频函数,一般放在在构造函数中

  2. 申请内存空间用于存放位图文件

  3. 位图文件读入所申请内存空间中

  4. 在 函数中 显示位图

  5. 关闭视频函数 ,一般放在在析构函数中

  以上方法的优点是: 1)显示速度快; 2) 内存占用少; 3) 缩放显示时图形失真小,4) 在低颜色位数的设备上显示高颜色位数的图形图形时失真小; 5) 通过直接处理位图数据,可以制作简单动画.

  3.4 程序中用到的访问函数

  Windows支持一些重要的DIB访问函数,但是这些函数都还没有被封装到MFC中,这些函数主要有:

  1. SetDIBitsToDevice函数:该函数可以直接在显示器或打印机上显示DIB. 在显

  示时不进行缩放处理.

  2. StretchDIBits函数:该函数可以缩放显示DIB于显示器和打印机上.

  3. GetDIBits函数:还函数利用申请到的内存,由GDI位图来构造DIB.通过该函数,

  可以对DIB的格式进行控制,可以指定每个像素颜色的位数,而且可以指定是否进行压缩.

  4. CreateDIBitmap函数:利用该函数可以从DIB出发来创建GDI位图.

  5. CreateDIBSection函数:该函数能创建一种特殊的DIB,称为DIB项,然后返回

  一个GDI位图句柄.

  6. LoadImage函数:该函数可以直接从磁盘文件中读入一个位图,并返回一个DIB

  句柄.

  7. DrawDibDraw函数:Windows提供了窗口视频(VFW)组件,Visual C++支持该

  组件.VFW中的DrawDibDraw函数是一个可以替代StretchDIBits的函数.它的最主要的优点是可以使用抖动颜色,并且提高显示DIB的速度,缺点是必须将VFW代码连接到进程中.

  3.5 图像的几何变换

  图像的几何变换,通常包括图像的平移、图像的镜像变换、图像的转置、图像的缩放和图像的旋转等.

  数字图像处理实验报告2

  一、实验的目的和意义

  实验目的:本实验内容旨在让学生通过用VC等高级语言编写数字图像处理的一些基本算法程序,来巩固和掌握图像处理技术的基本技能,提高实际动手能力,并通过实际编程了解图像处理软件的实现的基本原理。为学生进一步学习数字摄影测量、遥感和地理信息系统等专业课程以及应用图像处理解决实际问题奠定基础。

  二、实验原理和方法

  (1) Raw格式到BMP格式的转换:

  Raw格式:Raw格式文件是按照数字图像组成的二维矩阵,将像素按行列号顺序存储在文件中。这种文件只含有图像像素数据,不含有信息头,因此,在读图像时,需要根据文件大小,计算图像所包含的行列号,或者需要事先知道图像大小(矩阵大小)。RAW文件按图像上行到下行、左列到右列顺序存储。

  BMP格式:BMP文件数据区按图像上下行到上行、左列列到右列顺序存储到数据区。BMP文件由文件头、信息头、颜色表、数据区四个部分组成。

  做Raw格式文件到BMP格式文件的转化,先要为BMP格式文件申请四部分的内存:文件头,位图信息头,颜色表,图象数据,然后根据输入值以及Raw文件信息,BMP格式文件信息计算出这几部分的值,赋给他们,写到BMP文件中去。

  (2) 灰度图象的线性拉伸:

  灰度变化是点运算,将原图象的每个像素的灰度值改成线性变化之后的灰度即可。

  灰度的线性变换就是指图像的中所有点的灰度按照线性灰度变换函数进行变换。灰度变换方程如下:

  该方程为线性方程。式中参数 为输入图像的像素的灰度值,参数 为输出图像的

  灰度值。

  设原图象的灰度范围为[a,b],变化之后的范围为[a’,b’],则:

  fA=(b’-a’)/(b-a)

  fB=-(b’-a’)/(b-a)*a+a’

  如果算出来的值大于255,则让它等于255,小于0则让其等于0。

  (3) 局部处理(3*3高通滤波,3*3低通滤波):

  局部处理在处理某一像素时,利用与该像素相邻的一组像素,经过某种变换得到处理后图像中某一点的像素值。目标像素的邻域一般是由像素组成的二维矩阵,该矩阵的大小为奇数,目标像素位于该矩阵的中央,即目标像素就是区域的中心像素。经过处理后,目标像素的值为经过特定算法计算后所得的结果。

  实际上都是利用卷积来实现的,卷积往往用一个矩阵表示,将矩阵的中心对齐某个像素,矩阵中的值乘到相应的像素中去,然后将所有乘积加起来就得到中心像素的灰度值。边界像素不做处理,仍为原来的灰度值。求出的像素灰度值若超过[0~255],则向离其最近的属于该范围的`像素值靠拢。

  3*3低通滤波的算子见表1。

  3*3高通滤波的算子见表2。

  表格 1

  1/9

  1/9

  1/9

  1/9

  1/9

  1/9

  1/9

  1/9

  1/9

  表格 2

  -1

  -1

  -1

  -1

  9

  -1

  -1

  -1

  -1

  (4) 图象几何处理(图象平移,图象缩放):

  对于图像平移来说,若平移量是(tx,ty),像素在原图像中的坐标为(x0,y0),则变化后的坐标为(x1,y1),x1=x0+tx,y1=y0+ty。平移只需改变像素的灰度值,不必改变位图信息头和调色板内容。

  对于图像缩放,假设放大因子为ratio,缩放的变换矩阵为:

  图像信息头中新图像的宽度和高度都变为原来宽度和高度分别与水平垂直比例的乘积,图像大小变为新宽度(变为4的整数倍)与新高度的乘积。

  (5) 灰度图象中值滤波:

  中值滤波也属于局部处理的一种,将窗口中的各个像素排序之后排序,取中值赋给模板中心的像素,所以窗口中个数一般是基数。

  我用的中值滤波窗口是十字丝的9个数的窗口。

  (6) 灰度图象边缘检测:

  边缘检测有三种算子:Roberts,Prewit,Sobel。三种算子都是做一阶差分的,通过算子算出各个像素的梯度值,将水平梯度的绝对值和垂直梯度的绝对值相加,若此梯度值大于某个阈值,则将其灰度值赋为255,否则赋为0。

  (7) 图象旋转:

  图像旋转一般是以图像中心为中心顺时针旋转,利用图像的四个角点求出图像旋转后的大小。

  先计算以图像中心为原点坐标系下原图像四个角点的坐标值,按照旋转矩阵计算其旋转之后的坐标值,根据四个角点的新坐标值计算出最大宽度和高度作为新图像的宽度和高度值,按照计算值修改位图信息头,申请一块新内存,存储旋转后图像的灰度值。

  旋转矩阵如下:

  同样要求各个像素在原图像中的坐标,先将新图像的坐标系平移到图像中心,做逆时针旋转,然后再平移到屏幕左上角,然后将原图像对应坐标的值赋给新图像。

  (8) 图象二值化:

  判断分析法:假定图像的灰度区间为[0,L-1],则选择一阈值T 将图像的像素分为两组。

  为最大值所对应的T,就是所求判断分析法的分割阈值。

  搜寻到阈值之后,灰度值小于阈值的像素赋0,其他的赋1,修改文件信息头,调色板,申请新内存。

  (9) 图象直方图:

  统计各灰度值出现的频数,以及像素的总个数,用频数除以总个数作为频率,以灰度值作为横坐标,频率作为纵坐标绘图。

  三、实验过程和步骤

  首先要建立一个基于MFC的多文档工程,将视图基类改为滚动视图,以自己的学号命名。

  我用的是书上给的CDib类,类里面有获取BMP宽度,高度的函数,有指向位图信息头的指针,指向图象数据的指针,因此我在文档类(Doc类)里定义了一个CDib类的对象,打开以及保存文件的时候利用这个对象去调用CDib里读取与存储文件的函数,并且可以利用这个对象的两个指针对打开的图象进行各种操作。

  1.Raw格式到BMP格式的转换:

  首先建立一个RawToBMP的对话框,在上面加上四个编辑框(一个输入打开文件的路径一个输入保存文件的路径,另两个),两个按钮,以及默认的确认,取消按钮。利用类向导插入此对话框类,并且为前两个编辑框定义CString的两个变量,用来存储打开与保存文件的路径。同时为两个浏览按钮添加消息响应函数,在消息函数里创建CFileDialog对象,利用此对象的函数将两个路径值赋给前两个编辑框的成员变量。再为OK键添加消息响应函数,分别定义BMP格式文件前三部分数据变量,计算出各变量的值,并且利用一个CFile对象获取Raw图象的数据,利用另一个CFile对象将数据存储到所输入的路径的文件中去,CFile对象的Read函数会自动创建一个文件。

  然后在菜单上新建一个菜单,为菜单添加消息响应函数,在其消息响应函数里创建RowToBMP对话框。这样点击菜单后就会弹出一个对话框,按确定键之后就可以读取Raw文件并且存储BMP文件,完成整个消息循环。