当前位置:文档之家› 数字图像处理实验教程-V3.1-zsj

数字图像处理实验教程-V3.1-zsj

数字图像处理实验教程-V3.1-zsj
数字图像处理实验教程-V3.1-zsj

青岛科技大学

数字图像处理实验教程信息学院张淑军

版本:V3.1

2011年3月试行

2012-2014年修订

编写说明

1.本书是《数字图像处理》实验教程,配合理论授课内容,巩固所学知识,锻

炼学生动手开发能力。

2.实验课需要学生预习,做好必要的准备,以保证实验效果。每次实验的内容

和目标非常明确,实验过程中请同学们认真动手,举一反三,不依赖例程,能掌握编程思想。

3.为加强学生对于所掌握内容的理解,设计了实验回答问题,环环相扣,使学

生在编程实践的同时巩固知识点,对所学知识融会贯通,为进入本次实验内容打下基础。

4.每次实验由例程和练习两部分组成,例程包含了本次实验的核心内容,要求

学生统一掌握。练习部分考虑了学生编程水平的高低,分为:基础练习;扩展练习;高层进阶三个层次,以激励编程好的学生积极主动往更高层次努力,培养、选拔优秀学生;大多数的学生可以完成扩展练习。

5.每课内容最后罗列了所用到的基本OPENCV函数,方便学生查找使用。未附说

明的函数请学生自行查找OPENCV电子书,锻炼自己解决问题的能力。

6.每次实验完成之后,请学生按要求撰写实验报告,并在最后详细记录“实验

收获与总结”,将实验中遇到的问题和解决过程作为经验教训记录下来,训练学生及时总结归纳和反思、记录的习惯。

目录

目录 (3)

实验1 图像文件读入和显示(验证性,第1章) (4)

实验2 图像采集与显示(综合性,第2章) (16)

实验3 图像坐标变换(综合性,第2章) (20)

实验4 图像灰度变换(综合性,3.1节) (25)

实验5 直方图均衡化(验证性,3.3节) (28)

实验6 滤波器设计(综合性,3.4节) (34)

实验7 颜色空间转换(综合性,第4章) (41)

实验8 图像傅里叶变换(验证性,第5章) (47)

拓展实验基于MFC的图像处理程序设计(综合性) (53)

参考文献 (53)

实验1 图像文件读入和显示(验证性,第1章)

1.实验目的

(1)熟悉VC++6.0开发环境。

(2)了解OpenCV开发库,学会在VC++6.0环境下安装和配置OpenCV。(3)掌握开源库的通用安装和配置方法。

(4)通过运行一个简单的程序,初步了解OpenCV程序的特点。

2.实验内容

(1)编写程序掌握OpenCV加载及显示图像的方法。

(2)查看图像的属性(包括类型、大小、分辨率等),掌握图像的采样和量化、像素间的联系。

3.实验步骤(验证性实验)

(1)检查所用的计算机系统是否已安装了VC++6.0(中英文版本均可)。(2)安装OpenCV 1.0并正确配置,配置文档见“9.OpenCV配置文档”。(3)创建OpenCV控制台项目。

方法1:新建文件

①在VC6.0下新建一个C++源文件:File->New->Files-> C++ Source File,取名为hello.cpp,指定存储目录。

②在hello.cpp的编辑页面键入hello.cpp所给的代码,并保存。

③编译、连接,创建所需的工作区,在Debug目录下得到可执行文件hello.exe。

方法2:新建工程

①在VC6.0下创建一个空的控制台项目(Win32 Console Application),取名为hello,指定存储目录。

②给该项目添加(新建)一个C源代码文件(C++ Source File),取名为hello.cpp。键入所给的代码。

③编译、连接该程序,在Debug目录下得到可执行文件hello.exe。

(4)在工程目录下放入图像文件lena.jpg,运行该项目,得到输出结果。(5)按照上述(1)-(3)步骤重新建立一个新的工程hello2.dsw,键入hello2.cpp 的相关代码,编译、连接,调试参数,得到运行结果。

控制台程序有两种方法运行:

①以命令行方式运行:在cmd命令行窗口(开始->运行->打开,cmd->确定,进入命令行窗口)中找到hello.exe所在的文件夹,输入hello.exe lena.jpg(要求lena.jpg与编译连接好的hello.exe在同一个目录下),运行。

②指定输入参数:在项目配置页依次找Project->Settings->Debug->Program arguments,在其中直接输入程序要求的外部输入参数lena.jpg,运行该程序。(要求lena.jpg与工程文件在同一个目录下。)

为更好地理解控制台程序输入参数的问题,请将程序hello.cpp与程序hello2.cpp做仔细的对比,认真体会。

二者的区别在于,hello2.cpp中的main函数带有两个参数,argc和argv,如下面形式:int main(int argc, char** argv) 或int main(int argc, char* argv[])

这两个参数的作用是:argc 是指命令行输入参数的个数,argv存储了所有的命令行参数。假如程序是hello.exe,如果在命令行运行该程序,运行命令为:hello.exe lena.jpg,则:

argc的值是2,argv[0]是"hello.exe",argv[1]是"lena.jpg"。

(6)修改hello2程序,使其可以同时读取、显示多幅图像。

4.实验回答问题

(1)什么是OpenCV?

OpenCV的全称是:Open Source Computer Vision Library 。OpenCV是一个基于BSD 许可证授权(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。它轻量级而且高效——由一系列C 函数和少量C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

(2)通过实验,查看IplImage结构体的数据结构。请给出IplImage结构体的数据结构。

nt nSize; /* IplImage大小 */

int ID; /* 版本 (=0)*/

int nChannels; /* 大多数OPENCV函数支持1,2,3 或 4 个通道 */

int alphaChannel; /* 被OpenCV忽略 */

int depth; /* 像素的位深度

char colorModel[4]; /* 被OpenCV忽略 */

char channelSeq[4]; /* 同上 */

int dataOrder; /* 0 - 交叉存取颜色通道, 1 - 分开的颜色通道. */

int origin; /* 0 - 顶—左结构,

1 - 底—左结构

int align; /* 图像行排列 (4 or 8). OpenCV 忽略它,使用 widthStep 代替 */

int width; /* 图像宽像素数 */

int height; /* 图像高像素数*/

struct _IplROI *roi;/* 图像感兴趣区域. 当该值非空只对该区域进行处理 */ struct _IplImage *maskROI; /* 在 OpenCV中必须置NULL */

void *imageId; /* 同上*/

struct _IplTileInfo *tileInfo; /*同上*/

int imageSize; /* 图像数据大小(在交叉存取格式下imageSize=image->height*image->widthStep),单位字节*/

char *imageData; /* 指向排列的图像数据 */

int widthStep; /* 排列的图像行大小,以字节为单位 */

int BorderMode[4]; /* 边际结束模式, 被OpenCV忽略 */

int BorderConst[4]; /* 同上 */

char *imageDataOrigin; /* 指针指向一个不同的图像数据结构(不是必须排列的),是为了纠正图像内存分配准备的 */

(3)请说明OpenCV配置过程中,各个步骤的意义。

配置VC++6.0环境

下面需要设置VC6.0环境,使得VC6.0在编译OpenCV程序时,能够

知道从何处找到头文件和库文件。

(1)配置头文件目录

依次打开Tools->Options->Directories: 在

Include files中,添加如下目录(6个,通常用前面的4个即可):

(2)配置库文件目录

依次打开Tools->Options->Directories: 在

Library files中,添加如下目录:

(三)配置项目

要使得VC6.0项目能够支持OpenCV,需要在项目中添加OpenCV的库文件链接,使程序能够知道所用的函数是来自哪个库。

依次打开Project->Settings->Link,在

Object/library modules中,添加所需要的lib文件,以空格分开。

通常包括(6个):

cxcore.lib cv.lib cvaux.lib highgui.lib cvcam.lib ml.lib

(4)如何修改程序,使得程序可以显示多幅图像?

5.练习

【基础练习】试着不用参考给定例程,自己写出本次实验的代码,掌握OpenCV 图像处理程序的基本流程和框架。

【扩展练习】编程实现加载并显示三幅图像,其中一幅通过指定文件名的方式读取,另外两幅通过外部输入参数读取。

1.#include

2.#include

3.#include

4.

https://www.doczj.com/doc/804684242.html,ing namespace std;

6.

7.#pragma comment(lib, "cv.lib")

8.#pragma comment(lib, "cxcore.lib")

9.#pragma comment(lib, "highgui.lib")

10.

11.void imshowMany(const std::string& _winName, const vector& _imgs)

;

12.

13.int main(void)

14.{

15. std::vector imgs(6);

16. imgs[0] = cvLoadImage("test.png");

17. imgs[1] = cvLoadImage("test.png");

18. imgs[2] = cvLoadImage("test.png");

19. imgs[3] = cvLoadImage("test.png");

20. imgs[4] = cvLoadImage("test.png");

21. imgs[5] = cvLoadImage("test.png");

22.

23. imshowMany("DOTA2_Hero", imgs);

24. cvWaitKey();

25.

26.return 0;

27.}

28.

29.void imshowMany(const std::string& _winName, const vector& _imgs)

30.{

31.int nImg = (int)_imgs.size();

32.

33. IplImage* dispImg;

34.

35.int size;

36.int x, y;

37.

38.// w - Maximum number of images in a row

39.// h - Maximum number of images in a column

40.int w, h;

41.// scale - How much we have to resize the image

42.float scale;

43.int max;

44.

45.if (nImg <= 0)

46. {

47. printf("Number of arguments too small....\n");

48.return;

49. }

50.else if (nImg > 12)

51. {

52. printf("Number of arguments too large....\n");

53.return;

54. }

55.

56.else if (nImg == 1)

57. {

58. w = h = 1;

59. size = 300;

60. }

61.else if (nImg == 2)

62. {

63. w = 2; h = 1;

64. size = 300;

65. }

66.else if (nImg == 3 || nImg == 4)

67. {

68. w = 2; h = 2;

69. size = 300;

70. }

71.else if (nImg == 5 || nImg == 6)

72. {

73. w = 3; h = 2;

74. size = 200;

75. }

76.else if (nImg == 7 || nImg == 8)

77. {

78. w = 4; h = 2;

79. size = 200;

80. }

81.else

82. {

83. w = 4; h = 3;

84. size = 150;

85. }

86.

87. dispImg = cvCreateImage(cvSize(100 + size*w, 60 + size*h), IPL_DEPTH_8U,

3);

88.

89.for (int i= 0, m=20, n=20; i

90. {

91. x = _imgs[i]->height;

92. y = _imgs[i]->width;

93.

94. max = (x > y)? x: y;

95. scale = (float) ( (float) max / size );

96.

97.if (i%w==0 && m!=20)

98. {

99. m = 20;

100. n += 20+size;

101. }

102. cvSetImageROI(dispImg,cvRect(m, n, (int)(x/scale), (int)(y/scale))) ;

103. cvResize(_imgs[i], dispImg);

104. cvResetImageROI(dispImg);

105. }

106.

107. cvNamedWindow(_winName.c_str());

108. cvShowImage(_winName.c_str(), dispImg);

109.}

6.实验报告要求

实验报告要求写明以下7方面内容:

(1)写明实验目的。

(2)写明实验内容和步骤。

(3)写出完整的控制台程序代码,并加详细的注释。(仅对hello.c)

(4)描绘并解释实验结果,并对实验结果进行分析。

(5)写明实验中存在的不足,以及改进的方法。

(6)回答实验中涉及到的问题。

(7)写出本次实验的体会。

7.预习内容

(1)如何用摄像头采集图像并进行显示?

(2)OpenCV功能的进一步了解。

8.参考程序代码

/* 程序名:hello.cpp

功能:读入指定文件,并在屏幕上显示

*/

#include "cv.h"

#include "highgui.h"

#define FILENAME "lena.jpg"//使用宏定义,指定图像文件名

void main()

{

IplImage* pImg;//定义图像结构变量指针

pImg=cvLoadImage(FILENAME,1);//加载指定文件

cvNamedWindow("image",1);//创建窗口,第2个参数为1表示固定大小,0表示可变大小

cvShowImage("image",pImg);//在指定窗口显示图像文件

cvWaitKey(0);//等待按键,若无此句,程序运行时看不到结果

cvDestroyWindow("image");//销毁窗口

cvReleaseImage(&pImg);//释放图像文件

}

/* 程序名:hello2.cpp

功能:从磁盘中读入任意图像文件,并将图像显示在屏幕上

*/

#include "cv.h"

#include "highgui.h"

//在main函数中,argc表示主程序接收的参数个数,argv数组接收程序参数

//如:当argc=2时,argv[0]表示第0个参数(可执行程序本身),argv[1]表示第1个参数(需人为输入)

//当argc=1时,表示不需要从外界接收参数

int main(int argc, char** argv)

{

IplImage* pImg;//声明IplImage指针

//载入图像

if (argc==2 改为1&& (pImg=cvLoadImage(argv[1],1))!=0)

{

cvNamedWindow("image",0);//创建窗口

cvShowImage("image",pImg);//显示图像

cvWaitKey(0);//等待按键

cvDestroyWindow("image");//销毁窗口

cvReleaseImage(&pImg);//释放图像

return 0;

}

return -1;

}

9.OpenCV函数解释

OpenCV的函数和数据类型命名规则如下:

(1)宏全部使用大写字符,字间用下划线分隔,如:CV_MAX_DIM,IPL_DEPTH_32F。

(2)数据类型以Cv开头,如:CvSize,CvPoint3D64f等。

(3)函数以cv开头,如:cvLoadImage、cvSaveImage等。

需要包含的OpenCV头文件:

"cv.h":OpenCV的基本函数头文件。

"highgui.h":用于用户GUI界面设计的OpenCV专用库,包括很多Windows API 接口函数。

OpenCV基本函数:

cvLoadImage从文件读取图像

语法:IplImage* cvLoadImage(const char* filename,int flag=1)

参数:

filename:待载入的文件名,包括扩展名。可以载入BMP,DIB,JPEG,PNG,PBM,PGM,PPM,SR,RAS和TIFF等文件格式。

flag表示是否是彩色图像(多通道),默认为1,表示读入的图像被强制为3通道的彩色图像

flag=0,表示载入图像强制为单通道灰度图像

flag<0,表示载入图像由文件中的图像通道数决定。

返回值为IplImage结构指针。

cvNamedWindow窗口定义函数

语法:int cvNamedWindow(const char* name,unsigned long flags)

参数Name:窗口名。flags:窗口属性值,可以选择CV_WINDOW_AUTOSIZE1(表示固定大小)和0(或其他大于1的整数:表示可变大小)两种值。

cvShowImage图像显示函数

语法:void cvShowImage(const char * name, const CvArr* image)

参数:name:窗口名称。image:图像类型指针,一般为IplImage型。

说明:CvArr *仅仅被用作函数的参数,用来指明函数接收的数组类型不止一个,如类型IplImage*,CvMat *,甚至是CvSeq *,最终的数组类型是在运行时通过分析数组头的前4个字来判断。

cvWaitKey按键等待函数

语法:int cvWaitKey(int delay=0)

参数:

delay:等待按键毫秒数。

返回值为按键的键号。

cvDestroyWindow窗口注销函数

语法:void cvDestroyWindow(const char* Name);

参数:Name:要注销的窗口名称。

cvReleaseImage图像注销函数

语法:cvReleaseImage(CvArr* image);

参数:image:要注销的IplImage指针

10.OpenCV配置文档

以VC++6.0为例:

(假定OpenCV的安装目录为C:\PROGRAM FILES\OPENCV)

(1)配置头文件目录

依次打开Tools->Options->Directories: 在Include files中,添加如下目录:

C:\PROGRAM FILES\OPENCV\CV\INCLUDE

C:\PROGRAM FILES\OPENCV\CV AUX\INCLUDE

C:\PROGRAM FILES\OPENCV\CXCORE\INCLUDE

C:\PROGRAM FILES\OPENCV\OTHERLIBS\HIGHGUI

C:\PROGRAM FILES\OPENCV\OTHERLIBS\CVCAM\INCLUDE

点击Options之后页面如下:

配置完之后,页面如下:

(2)配置库文件目录

依次打开Tools->Options->Directories: 在Library files中,添加如下目录:C:\PROGRAM FILES\OPENCV\LIB

配置完之后页面如下:

(3)添加库文件链接

这一步对于每一个工程都要配置一次,在新建工程之后,依次打开Project->Settings->Link,在Object/library modules中,添加所需要的lib文件,以空格分开。通常包括:

cxcore.lib cv.lib cvaux.lib highgui.lib cvcam.lib ml.lib

点击Settings->Link,添加6个库之后的页面如下:

程序在链接、运行时,需要OpenCV的动态链接库的支持,如果程序提示找不到dll文件,则需将OpenCV的所有动态链接库文件(OpenCV->bin目录下的8个dll文件)直接拷到系统安装目录system32下,这样OpenCV的程序无

论在本机的何处运行,都没有问题了。

实验2 图像采集与显示(综合性,第2章)

1.实验目的

(1)了解OpenCV中使用摄像头采集图像的方法。

(2)掌握OpenCV进行图像采集、存储与显示的实现方法。

2.实验内容

编写程序,用摄像头采集彩色图像并进行彩色和灰度显示。

3.实验步骤(验证性实验)

(1)首先保证计算机安装了某个摄像头(webcam)及其驱动程序,摄像头能正常采集。

(2)创建OpenCV控制台项目。

(3)添加源文件gray.cpp,并输入相关代码。

(4)编译、连接、运行,得到实验结果。

4.实验回答问题

(1)IplImage结构体中imageData的格式是什么样的?Char*

(2)函数cvCreateImage的最后一个参数的含义是什么?

channels每个图元的颜色通道数。

可以是1, 2, 3 或4.通道是交叉存取的

(3)画出示例代码gray.cpp程序的流程图。

5.练习

【基础练习】修改程序,使得程序能读取硬盘上的A VI视频文件并逐帧显示。【扩展练习】自己编写完整程序实现以下功能:

(1)创建一个窗口

(2)载入图像

(3)显示图像

(4)创建一幅新图像

(5)将原图像转换为灰度图像赋给新图像

(6)在新窗口显示新图像

(7)销毁窗口,释放图像

6.实验报告要求

实验报告要求写明以下7方面内容:

(1)写明实验目的。

(2)写明实验内容和步骤。

(3)写出完整的控制台程序代码,并加详细的注释。

(4)描绘并解释实验结果,并对实验结果进行分析。

(5)写明实验中存在的不足,以及改进的方法。

(6)回答实验中涉及到的问题。

(7)写出本次实验的体会。

7.预习内容

(1)图像坐标变换有哪些?掌握每种变换的公式。

(2)图像坐标变换的级联。

8.参考程序代码

/* 程序名:gray.cpp

说明:从摄像头采集图像,并转化为灰度图显示

*/

#include

#include

#include

#include

int main( int argc, char** argv )

{

//声明IplImage指针

IplImage* pFrame = NULL;

IplImage* pFrImg = NULL;

CvCapture* pCapture = NULL;

int nFrmNum = 0;

//创建窗口

cvNamedWindow("color", 1);

cvMoveWindow("color", 60, 20);

cvNamedWindow("gray", 1);

cvMoveWindow("gray", 400, 20);

if( !(pCapture = cvCaptureFromCAM(-1)))//从摄像头获取图像

//if( !(pCapture = cvCaptureFromA VI(“sea.avi”))) //从视频文件获取图像

{

fprintf(stderr, "Can not open camera.\n");//报错

return -2;

}

//逐帧读取视频

while(pFrame = cvQueryFrame( pCapture ))

{

nFrmNum++;

//如果是第一帧,需要申请内存,并初始化

if(nFrmNum == 1)

{

pFrImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1);

pFrImg->origin=1;//设置图像数据起点为左下角,可设0查看不同结果

}

cvCvtColor(pFrame, pFrImg, CV_RGB2GRAY); //转化成单通道图像(灰度图像)

//显示图像

cvShowImage("color", pFrame);

cvShowImage("gray", pFrImg);

//等待按键事件

cvWaitKey(2);//当前帧采集到之后延迟2毫秒,以便能实现连续显示视频的效果

//cvWaitKey(0);//若参数为0,则无限制等待按键,只能显示第一帧图像}

//销毁窗口

cvDestroyWindow("color");

cvDestroyWindow("gray");

//释放图像和矩阵

cvReleaseImage(&pFrame);

cvReleaseImage(&pFrImg);

cvReleaseCapture(&pCapture);

return 0;

}

9.OpenCV函数解释

需要包含的OpenCV头文件

#include "cxcore.h"

#include "cvcam.h"

#include "windows.h"

cxcore.h:OpenCV核函数头文件

OpenCV基本函数:

OpenCV支持从摄像头和视频文件(A VI)中捕捉图像,使用的两个函数是:cvCaptureFromCAM从摄像头捕捉图像

cvCaptureFromA VI从视频获取图像

返回值均为CvCapture结构体

cvCaptureFromCAM

功能:给从摄像头得到的视频流分配和初始化CvCapture结构。

语法:CvCapture* cvCaptureFromCAM( int index );

参数:index 要使用的摄像头索引,默认为-1。

cvQueryFrame获取视频序列帧的每一帧

语法:IplImage* cvQueryFrame( CvCapture* capture );

参数:capture 视频获取结构。

cvCreateImage创建图像函数

语法:IplImage *cvCreateImage(CvSize size, int depth, int channels)

参数:size:图像的宽、高。depth:图像图元深度。channels每个图元的颜色通道数。

返回值:IplImage结构体。

cvMoveWindow移动窗口函数

语法:void cvMoveWindows(name,int x,int y)

参数:name:窗口的名称。X:窗口左上角的x坐标。Y:窗口左上角的Y坐标。cvGetWindowHandle获取窗口句柄函数

传入参数为窗口名称。

返回值为窗口的句柄。

cvCvtColor色彩空间转换函数

语法:void cvCvtColor(const CvArr* src, CvArr* dst, int code)

参数:src为源图像的不定数组,CvArr*指针,一般情况为IplImage型指针。Dst:目的地址的CvArr指针,一般为IplImage型结构体。Code:色彩转换空间,

常数定义为CV_2

实验3 图像坐标变换(综合性,第2章)

1.实验目的

(1)掌握图像坐标变换的原理和方法。

(2)能设计相应代码实现图像的旋转与缩放变换。

2.实验内容

编写程序用OpenCV实现对图像的各种空间变换。需要实现的功能有:旋转与缩放。

3.实验步骤(综合性实验)

(1)新建源文件rotate.cpp。

(2)编写程序代码,使程序可以对图像进行旋转与缩放。

(3)编译、连接(生成工作区)、运行该文件,得到实验结果。

(4)通过给定的函数,理解所给代码的功能进而改写程序代码,使程序可以对图像实现指定的空间变换,包括平移、旋转、缩放。

4.实验回答问题

(1)请给出图像坐标变换的基本公式和实现原理,并着重说明例程中的算法。(2)写出平移矩阵、缩放矩阵、旋转(绕z轴)矩阵。

5.练习

【基础练习】

(1)修改例程,使得程序可以每次按键旋转一次图像。(这个修改在现在的代码上比较困难,需要把rotate函数解开,直接在main函数里写)

(2)修改例程,使得程序可以连续循环地旋转图像。

答:将if( cvWaitKey(5) == 27 )//如果按键为Escape键,则退出循环

break;

angle =(int) (angle + delta) % 360;

中的break注释掉

【扩展练习】

(1)使用cvFlip函数实现图像绕x,y轴或中心旋转。

(2)修改例程,使得程序可以在旋转图像的同时缩放图像。

【高层进阶】

(1)使用cvResize函数实现图像的缩放功能。

(2)编写程序,实现图像的平移、旋转和缩放综合功能。

6.实验报告要求

实验报告要求写明以下7方面内容:

(1)写明实验目的。

(2)写明实验内容和步骤。

(3)写出空间变换所涉及的图像处理函数,并加详细的注释。

(4)描绘并解释实验结果,并对实验结果进行分析。

(5)写明实验中存在的不足,以及改进的方法。

(6)回答实验中涉及到的问题。

(7)写出本次实验的体会。

7.预习内容

数字图像处理实验1

实验一 实验内容和步骤 练习图像的读取、显示和保存图像数据,步骤如下: (1)使用命令figure(1)开辟一个显示窗口 (2)读入一幅RGB图像,变换为灰度图像和二值图像,并在同一个窗口内显示、二值图像和灰度图像,注上文字标题。 (3)保存转换后的灰度图像和二值图像 (4)在同一个窗口显示转换后的灰度图像的直方图 I=imread('BaboonRGB.bmp'); figure,imshow(I); I_gray=rgb2gray(I); figure,imshow(I_gray); I_2bw=Im2bw(I_gray); figure,imshow(I_2bw); subplot(1,3,1),imshow(I),title('RGB图像'); subplot(1,3,2),imshow(I_gray),title('灰度图像'); subplot(1,3,3),imshow(I_2bw),title('二值图像'); imwrite(I_gray,'Baboongray.png'); imwrite(I_2bw,'Baboon2bw.tif'); figure;imhist(I_gray);

RGB 图 像灰度图 像二值图 像 050100150200250 500 1000 1500 2000 2500 3000

(5)将原RGB 图像的R 、G 、B 三个分量图像显示在figure(2)中,观察对比它们的特点,体会不同颜色所对应的R 、G 、B 分量的不同之处。 [A_RGB,MAP]=imread('BaboonRGB.bmp'); subplot(2,2,1),imshow(A_RGB),title('RGB'); subplot(2,2,2),imshow(A_RGB(:,:,1)),title('R'); subplot(2,2,3),imshow(A_RGB(:,:,2)),title('G'); subplot(2,2,4),imshow(A_RGB(:,:,3)),title('B'); (6)将图像放大1.5倍,插值方法使用三种不同方法,在figure(3)中显示放大后的图像,比较不同插值方法的结果有什么不同。将图像放大到其它倍数,重复实验;A=imread('BaboonRGB.bmp'); figure(3),imshow(A),title('原图像'); B=imresize(A,1.5,'nearest'); figure(4),imshow(B),title('最邻近法') C=imresize(A,1.5,'bilinear'); ; figure(5),imshow(C),title('双线性插值'); D=imresize(A,1.5,'bicubic'); figure(6),imshow(D),title('双三次插值 '); RGB R G B

数字图像处理四个实验报告,带有源程序

数字图像处理 实验指导书 学院:通信与电子工程学院 专业:电子信息工程 班级: 学号: 姓名: XX理工大学

实验一 MATLAB数字图像处理初步 一、实验目的与要求 1.熟悉及掌握在MATLAB中能够处理哪些格式图像。 2.熟练掌握在MATLAB中如何读取图像。 3.掌握如何利用MATLAB来获取图像的大小、颜色、高度、宽度等等相关信息。 4.掌握如何在MATLAB中按照指定要求存储一幅图像的方法。 5.图像间如何转化。 二、实验原理及知识点 1、数字图像的表示和类别 一幅图像可以被定义为一个二维函数f(x,y),其中x和y是空间(平面)坐标,f 在任何坐标处(x,y)处的振幅称为图像在该点的亮度。灰度是用来表示黑白图像亮度的一个术语,而彩色图像是由单个二维图像组合形成的。例如,在RGB彩色系统中,一幅彩色图像是由三幅独立的分量图像(红、绿、蓝)组成的。因此,许多为黑白图像处理开发的技术适用于彩色图像处理,方法是分别处理三副独立的分量图像即可。 图像关于x和y坐标以及振幅连续。要将这样的一幅图像转化为数字形式,就要求数字化坐标和振幅。将坐标值数字化成为取样;将振幅数字化成为量化。采样和量化的过程如图1所示。因此,当f的x、y分量和振幅都是有限且离散的量时,称该图像为数字图像。 作为MATLAB基本数据类型的数值数组本身十分适于表达图像,矩阵的元素和图像的像素之间有着十分自然的对应关系。 图1 图像的采样和量化 根据图像数据矩阵解释方法的不同,MA TLAB把其处理为4类: 亮度图像(Intensity images) 二值图像(Binary images) 索引图像(Indexed images) RGB图像(RGB images)

数字图像处理实验报告

数字图像处理实验报告 实验一数字图像基本操作及灰度调整 一、实验目的 1)掌握读、写图像的基本方法。 2)掌握MATLAB语言中图像数据与信息的读取方法。 3)理解图像灰度变换处理在图像增强的作用。 4)掌握绘制灰度直方图的方法,理解灰度直方图的灰度变换及均衡化的方 法。 二、实验内容与要求 1.熟悉MATLAB语言中对图像数据读取,显示等基本函数 特别需要熟悉下列命令:熟悉imread()函数、imwrite()函数、size()函数、Subplot()函数、Figure()函数。 1)将MATLAB目录下work文件夹中的forest.tif图像文件读出.用到imread, imfinfo 等文件,观察一下图像数据,了解一下数字图像在MATLAB中的处理就是处理一个矩阵。将这个图像显示出来(用imshow)。尝试修改map颜色矩阵的值,再将图像显示出来,观察图像颜色的变化。 2)将MATLAB目录下work文件夹中的b747.jpg图像文件读出,用rgb2gray() 将其 转化为灰度图像,记为变量B。 2.图像灰度变换处理在图像增强的作用 读入不同情况的图像,请自己编程和调用Matlab函数用常用灰度变换函数对输入图像进行灰度变换,比较相应的处理效果。 3.绘制图像灰度直方图的方法,对图像进行均衡化处理 请自己编程和调用Matlab函数完成如下实验。 1)显示B的图像及灰度直方图,可以发现其灰度值集中在一段区域,用 imadjust函 数将它的灰度值调整到[0,1]之间,并观察调整后的图像与原图像的差别,调整后的灰

度直方图与原灰度直方图的区别。 2) 对B 进行直方图均衡化处理,试比较与源图的异同。 3) 对B 进行如图所示的分段线形变换处理,试比较与直方图均衡化处理的异同。 图1.1 分段线性变换函数 三、实验原理与算法分析 1. 灰度变换 灰度变换是图像增强的一种重要手段,它常用于改变图象的灰度范围及分布,是图象数字化及图象显示的重要工具。 1) 图像反转 灰度级范围为[0, L-1]的图像反转可由下式获得 r L s --=1 2) 对数运算:有时原图的动态范围太大,超出某些显示设备的允许动态范围, 如直接使用原图,则一部分细节可能丢失。解决的方法是对原图进行灰度压缩,如对数变换: s = c log(1 + r ),c 为常数,r ≥ 0 3) 幂次变换: 0,0,≥≥=γγc cr s 4) 对比拉伸:在实际应用中,为了突出图像中感兴趣的研究对象,常常要求 局部扩展拉伸某一范围的灰度值,或对不同范围的灰度值进行不同的拉伸处理,即分段线性拉伸: 其对应的数学表达式为:

数字图像处理实验三中值滤波和均值滤波实验报告

数字图像处理实验三中值滤波和均值滤波实验报告

数字图像处理实验三 均值滤波、中值滤波的计算机实现12281166 崔雪莹计科1202班 一、实验目的: 1)熟悉均值滤波、中值滤波处理的理论基础; 2)掌握均值滤波、中值滤波的计算机实现方法; 3)学习VC++ 6。0 的编程方法; 4)验证均值滤波、中值滤波处理理论; 5)观察均值滤波、中值滤波处理的结果。 二、实验的软、硬件平台: 硬件:微型图像处理系统,包括:主机, PC机;摄像机; 软件:操作系统:WINDOWS2000或WINDOWSXP应用软件:VC++ 6.0 三、实验内容: 1)握高级语言编程技术; 2)编制均值滤波、中值滤波处理程序的方法; 3)编译并生成可执行文件; 4)考察处理结果。 四、实验要求: 1)学习VC++确6。0 编程的步骤及流程; 2)编写均值滤波、中值滤波的程序;

3)编译并改错; 4)把该程序嵌入试验二给出的界面中(作适当修改); 5)提交程序及文档; 6)写出本次实验的体会。 五、实验结果截图 实验均值滤波采用的是3X3的方块,取周围的像素点取得其均值代替原像素点。边缘像素的处理方法是复制边缘的像素点,增加一个边框,计算里面的像素值得均值滤波。

六、实验体会 本次实验在前一次的实验基础上增加均值滤波和中值滤波,对于椒盐噪声的处理,发现中值滤波的效果更为好一点,而均值滤波是的整个图像变得模糊了一点,效果差异较大。本次实验更加增加了对数字图像处理的了解与学习。 七、实验程序代码注释及分析 // HistDemoADlg.h : 头文件 // #include "ImageWnd.h" #pragma once // CHistDemoADlg 对话框 class CHistDemoADlg : public CDialogEx { // 构造

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

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

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

东南大学数字图像处理实验报告

数字图像处理 实验报告 学号:04211734 姓名:付永钦 日期:2014/6/7 1.图像直方图统计 ①原理:灰度直方图是将数字图像的所有像素,按照灰度值的大小,统计其所出现的频度。 通常,灰度直方图的横坐标表示灰度值,纵坐标为半个像素个数,也可以采用某一灰度值的像素数占全图像素数的百分比作为纵坐标。 ②算法: clear all PS=imread('girl-grey1.jpg'); %读入JPG彩色图像文件figure(1);subplot(1,2,1);imshow(PS);title('原图像灰度图'); [m,n]=size(PS); %测量图像尺寸参数 GP=zeros(1,256); %预创建存放灰度出现概率的向量 for k=0:255 GP(k+1)=length(find(PS==k))/(m*n); %计算每级灰度出现的概率end figure(1);subplot(1,2,2);bar(0:255,GP,'g') %绘制直方图 axis([0 255 min(GP) max(GP)]); title('原图像直方图') xlabel('灰度值') ylabel('出现概率') ③处理结果:

原图像灰度图 100 200 0.005 0.010.0150.020.025 0.030.035 0.04原图像直方图 灰度值 出现概率 ④结果分析:由图可以看出,原图像的灰度直方图比较集中。 2. 图像的线性变换 ①原理:直方图均衡方法的基本原理是:对在图像中像素个数多的灰度值(即对画面起主 要作用的灰度值)进行展宽,而对像素个数少的灰度值(即对画面不起主要作用的灰度值)进行归并。从而达到清晰图像的目的。 ②算法: clear all %一,图像的预处理,读入彩色图像将其灰度化 PS=imread('girl-grey1.jpg'); figure(1);subplot(2,2,1);imshow(PS);title('原图像灰度图'); %二,绘制直方图 [m,n]=size(PS); %测量图像尺寸参数 GP=zeros(1,256); %预创建存放灰度出现概率的向量 for k=0:255

数字图像处理上机实验三

医学图像处理实验三1、计算图像的梯度,梯度值和梯度角。 I=imread('C:\Users\Administrator\Desktop\cat.jpg'); B=rgb2gray(I); C=double(B); e=1e-6;%10^-6 [dx,dy]=gradient(C);%计算梯度 G=sqrt(dx.*dx+dy.*dy);%梯度幅值 figure,imshow(uint8(G)),title('梯度图像'); pha=atan(dy./(dx+e)) figure,imshow(pha,[]) 图 1

图 2 梯度角图 2、计算图像边缘检测,用滤波器方式实现各种算子。 (1)Roberts算子 clear; I=imread('C:\Users\admin\Desktop\mao.jpg'); B=rgb2gray(I); [m,n]=size(B); nB=B; robertsnum=0;%经roberts算子计算得到的每一个像素的值robertsthreshold=0.6;%设定阈值 for j=1:m-1;%进行边界提取 for k=1:n-1 robertsnum=abs(B(j,k)-B(j+1,k+1))+abs(B(j+1,k)-B(j,k+1)); if(robertsnum>robertsthreshold) nB(j,k)=255; else nB(j,k)=0; end end end subplot(1,2,1);imshow(B);title('原图'); subplot(1,2,2);imshow(nB,[]);title('Robert算子处理后的图像');

数字图像处理实验 实验二

实验二MATLAB图像运算一、实验目的 1.了解图像的算术运算在数字图像处理中的初步应用。 2.体会图像算术运算处理的过程和处理前后图像的变化。 二、实验步骤 1.图像的加法运算-imadd 对于两个图像f x,y和 (x,y)的均值有: g x,y=1 f x,y+ 1 (x,y) 推广这个公式为: g x,y=αf x,y+β (x,y) 其中,α+β=1。这样就可以得到各种图像合成的效果,也可以用于两张图像的衔接。说明:两个示例图像保存在默认路径下,文件名分别为'rice.png'和'cameraman.tif',要求实现下图所示结果。 代码: I1 = imread('rice.png'); I2 = imread('cameraman.tif'); I3 = imadd(I1, I2,'uint8'); I4 = imadd(I1, I2,'uint16'); subplot(2, 2, 1), imshow(I1), title('?-ê?í???1'); subplot(2, 2, 2), imshow(I2), title('?-ê?í???2'); subplot(2, 2, 3), imshow(I3), title('8??í?????ê?'); subplot(2, 2, 4), imshow(I4), title('16??í?????ê?'); 结果截图:

2.图像的减法运算-imsubtract 说明: 背景图像可通过膨胀算法得到background = imopen(I,strel('disk',15));,要求实现下图所示结果。 示例代码如下: I1 = imread('rice.png'); background = imerode(I1, strel('disk', 15)); rice2 = imsubtract(I1, background); subplot(2, 2, 1), imshow(I1), title('?-ê?í???'); subplot(2, 2, 2), imshow(background), title('±3?°í???'); subplot(2, 2, 3), imshow(rice2), title('′|àíoóμ?í???'); 结果截图: 3.图像的乘法运算-immultiply

数字图像处理程序

数字图像处理程序

数字图像处理实验 图像处理实验(一)直方图 灰度变换是图像增强的一种重要手段,使图像对比度扩展,图像更加清晰,特 征更加明显。 灰度级的直方图给出了一幅图像概貌的描述,通过修改灰度直方图来得到图像 增强。 1、灰度直方图 (1)计算出一幅灰度图像的直方图 clear close all I=imread('004.bmp'); imhist(I) title('实验一(1)直方图'); (2)对灰度图像进行简单的灰度线形变换, figure subplot(2,2,1) imshow(I); title('试验2-灰度线性变换'); subplot(2,2,2) histeq(I); (3)看其直方图的对应变化和图像对比度的变化。 原图像 f(m,n) 的灰度范围 [a,b] 线形变换为图像 g(m,n),灰度范围[a’,b’]公式:g(m,n)=a’+(b’-a’)* f(m,n) /(b-a) figure subplot(2,2,1) imshow(I) J=imadjust(I,[0.3,0.7],[0,1],1); title(' 实验一(3)用g(m,n)=a’+(b’-a’)* f(m,n) /(b-a)进行变换 '); subplot(2,2,2) imshow(J) subplot(2,2,3) imshow(I) J=imadjust(I,[0.5 0.8],[0,1],1); subplot(2,2,4) imshow(J) (4) 图像二值化(选取一个域值,(5) 将图像变为黑白图像) figure subplot(2,2,1)

数字图像处理实验报告实验三

中南大学 数字图像处理实验报告实验三数学形态学及其应用

实验三 数学形态学及其应用 一.实验目的 1.了解二值形态学的基本运算 2.掌握基本形态学运算的实现 3.了解形态操作的应用 二.实验基本原理 腐蚀和膨胀是数学形态学最基本的变换,数学形态学的应用几乎覆盖了图像处理的所有领域,给出利用数学形态学对二值图像处理的一些运算。 膨胀就是把连接成分的边界扩大一层的处理。而收缩则是把连接成分的边界点去掉从而缩小一层的处理。 二值形态学 I(x,y), T(i,j)为 0/1图像Θ 腐蚀:[]),(&),(),)((),(0,j i T j y i x I AND y x T I y x E m j i ++=Θ== 膨胀:[]),(&),(),)((),(0 ,j i T j y i x I OR y x T I y x D m j i ++=⊕== 灰度形态学T(i,j)可取10以外的值 腐蚀: []),(),(min ),)((),(1 ,0j i T j y i x I y x T I y x E m j i -++=Θ=-≤≤ 膨胀: []),(),(max ),)((),(1 ,0j i T j y i x I y x T I y x D m j i +++=⊕=-≤≤ 1.腐蚀Erosion: {}x B x B X x ?=Θ: 1B 删两边 2B 删右上 图5-1 剥去一层(皮) 2.膨胀Dilation: {}X B x B X x ↑⊕:= 1B 补两边 2B 补左下 图5-2 添上一层(漆) 3.开运算open :

B B X ⊕Θ=)(X B 4.闭close :∨ Θ⊕=B B X X B )( 5.HMT(Hit-Miss Transform:击中——击不中变换) 条件严格的模板匹配 ),(21T T T =模板由两部分组成。1T :物体,2T :背景。 {} C x x i X T X T X T X ??=?21, 图5-3 击不中变换示意图 性质: (1)φ=2T 时,1T X T X Θ=? (2))()()(21T X T X T X C Θ?Θ=? C T X T X )()(21Θ?Θ= )/()(21T X T X ΘΘ= 6.细化/粗化 (1)细化(Thin ) C T X X T X XoT )(/??=?= 去掉满足匹配条件的点。 图5-4 细化示意图 系统细化{}n B oB XoB T Xo ))(((21=, i B 是1-i B 旋转的结果(90?,180?,270?)共8种情况 适于细化的结构元素 1111000d d I = d d d L 10110 0= (2)粗化(Thick ) )(T X X T X ??=? 用(){}0,01=T (){}0,12=T 时,X X X T X =?=? X 21 1 1 2 3 T ? XoT X ? X X ?T X ΘT T ⊕

数字图像处理——彩色图像实验报告

6.3实验步骤 (1)对彩色图像的表达和显示 * * * * * * * * * * * *显示彩色立方体* * * * * * * * * * * * * rgbcube(0,0,10); %从正面观察彩色立方体 rgbcube(10,0,10); %从侧面观察彩色立方 rgbcube(10,10,10); %从对角线观察彩色立方体 %* * * * * * * * * *索引图像的显示和转换* * * * * * * * * * f=imread('D:\Picture\Fig0604(a)(iris).tif'); figure,imshow(f);%f是RGB真彩图像 %rgb图像转换成8色索引图像,不采用抖动方式 [X1,map1]=rgb2ind(f,8,'nodither'); figure,imshow(X1,map1); %采用抖动方式转换到8色索引图像 [X2,map2]=rgb2ind(f,8,'dither'); figure,imshow(X2,map2); %显示效果要好一些 g=rgb2gray(f); %f转换为灰度图像 g1=dither(g);%将灰色图像经过抖动处理,转换打二值图像figure,imshow(g);%显示灰度图像 figure,imshow(g1);%显示抖动处理后的二值图像 程序运行结果:

彩色立方体原图 不采用抖动方式转换到8色索引图像采用抖动方式转换到8色索引图像 灰度图像抖动处理后的二值图像

(2)彩色空间转换 f=imread('D:\Picture\Fig0604(a)(iris).tif'); figure,imshow(f);%f是RGB真彩图像 %转换到NTSC彩色空间 ntsc_image=rgb2ntsc(f); figure,imshow(ntsc_image(:,:,1));%显示亮度信息figure,imshow(ntsc_image(:,:,2));%显示色差信息figure,imshow(ntsc_image(:,:,3));%显示色差信息 %转换到HIS彩色空间 hsi_image=rgb2hsi(f); figure,imshow(hsi_image(:,:,1));%显示色度信息figure,imshow(hsi_image(:,:,2)); %显示饱和度信息figure,imshow(hsi_image(:,:,3));%显示亮度信息 程序运行结果: 原图 转换到NTSC彩色空间

数字图像处理实验报告

数字图像处理实验报告

实验一数字图像处理编程基础 一、实验目的 1. 了解MA TLAB图像处理工具箱; 2. 掌握MA TLAB的基本应用方法; 3. 掌握MA TLAB图像存储/图像数据类型/图像类型; 4. 掌握图像文件的读/写/信息查询; 5. 掌握图像显示--显示多幅图像、4种图像类型的显示方法; 6. 编程实现图像类型间的转换。 二、实验内容 1. 实现对图像文件的读/写/信息查询,图像显示--显示多幅图像、4种图像类型的显示方法、图像类型间的转换。 2. 运行图像处理程序,并保存处理结果图像。 三、源代码 I=imread('cameraman.tif') imshow(I); subplot(221), title('图像1'); imwrite('cameraman.tif') M=imread('pout.tif') imview(M) subplot(222), imshow(M); title('图像2'); imread('pout.bmp') N=imread('eight.tif') imview(N) subplot(223), imshow(N); title('图像3'); V=imread('circuit.tif') imview(V) subplot(224), imshow(V); title('图像4');

N=imread('C:\Users\Administrator\Desktop\1.jpg') imshow(N); I=rgb2gary(GRB) [X.map]=gary2ind(N,2) RGB=ind2 rgb(X,map) [X.map]=gary2ind(I,2) I=ind2 gary(X,map) I=imread('C:\Users\dell\Desktop\111.jpg'); subplot(231),imshow(I); title('原图'); M=rgb2gray(I); subplot(232),imshow(M); [X,map]=gray2ind(M,100); subplot(233),imshow(X); RGB=ind2rgb(X,map); subplot(234),imshow(X); [X,map]=rbg2ind(I); subplot(235),imshow(X); 四、实验效果

数字图像处理实验报告

数字图像处理试验报告 实验二:数字图像的空间滤波和频域滤波 姓名:XX学号:2XXXXXXX 实验日期:2017 年4 月26 日 1.实验目的 1. 掌握图像滤波的基本定义及目的。 2. 理解空间域滤波的基本原理及方法。 3. 掌握进行图像的空域滤波的方法。 4. 掌握傅立叶变换及逆变换的基本原理方法。 5. 理解频域滤波的基本原理及方法。 6. 掌握进行图像的频域滤波的方法。 2.实验内容与要求 1. 平滑空间滤波: 1) 读出一幅图像,给这幅图像分别加入椒盐噪声和高斯噪声后并与前一张图显示在同一 图像窗口中。 2) 对加入噪声图像选用不同的平滑(低通)模板做运算,对比不同模板所形成的效果,要 求在同一窗口中显示。 3) 使用函数 imfilter 时,分别采用不同的填充方法(或边界选项,如零填 充、’replicate’、’symmetric’、’circular’)进行低通滤波,显示处理后的图 像。 4) 运用 for 循环,将加有椒盐噪声的图像进行 10 次,20 次均值滤波,查看其特点, 显 示均值处理后的图像(提示:利用fspecial 函数的’average’类型生成均值滤波器)。 5) 对加入椒盐噪声的图像分别采用均值滤波法,和中值滤波法对有噪声的图像做处理,要 求在同一窗口中显示结果。 6) 自己设计平滑空间滤波器,并将其对噪声图像进行处理,显示处理后的图像。 2. 锐化空间滤波 1) 读出一幅图像,采用3×3 的拉普拉斯算子 w = [ 1, 1, 1; 1 – 8 1; 1, 1, 1] 对其进行滤波。 2) 编写函数w = genlaplacian(n),自动产生任一奇数尺寸n 的拉普拉斯算子,如5 ×5的拉普拉斯算子 w = [ 1 1 1 1 1 1 1 1 1 1 1 1 -24 1 1 1 1 1 1 1 1 1 1 1 1] 3) 分别采用5×5,9×9,15×15和25×25大小的拉普拉斯算子对

数字图像处理实验三

数字图像处理实验报告 学院:电子信息与自动化 专业:电子信息工程 班级:120224 实验人:张文君(12022419) 同组人:姚朱晨(12022417)

实验三: 数字图像的频域增强:低通滤波 一.实验目的 1. 掌握图像滤波的基本定义及目的。 2. 理解频域滤波的基本原理及方法。 3. 掌握进行图像的低通滤波的方法。 二.实验基本原理 频域增强是利用图像变换方法将原来的图像空间中的图像以某种形式转换到其他空间中,然后利用该空间的特有性质方便地进行图像处理,最后再转换回原来的图像空间中,从而得到处理后的图像。 频域增强的主要步骤是: 1.选择变换方法,将输入图像变换到频域空间。 2.在频域空间中,根据处理目的设计一个转移函数,并进行处理。 3.将所得结果用反变换得到增强的图像。 常用的频域增强方法有低通滤波和高通滤波。 低通滤波 图像的能量大部分集中在幅度谱的低频和中频部分,而图像的边缘和噪声对应于高频部分。因此能降低高频成分幅度的滤波器就能减弱噪声的影响。由卷积定理,在频域实现低通滤波的数学表达式: G (u ,v ) =H (u ,v )F (u ,v ) 1) 理想低通滤波器(ILPF ) { 0),u (0 ),(10)v ,u (≤>= v D v u D H 2) 巴特沃斯低通滤波器(BLPF ) n D v u D v u H 20),()12(11 ),(??? ? ??-+= 3)指数型低通滤波器(ELPF ) 2 0),(),(n D v u D e v u H ? ?????-= 三.实验内容与要求

平滑频域滤波 1) 设计理想低通滤波器、巴特沃斯低通滤波器和指数型低通滤波器,截止频率自选。 2) 读出cameraman.tif 这幅图像,加入椒盐躁声,分别采用理想低通滤波器、巴特沃斯低通滤波器和高斯低通滤波器对其进行滤波(截止频率自选),再做反变换得到低通滤波后的空域图像。 四.实验程序 I=imread('cameraman.tif');%读入图像 figure; subplot(2,3,1),imshow(I); title('原图'); I=imnoise(I,'salt & pepper',0.02); %加入椒盐躁声 subplot(2,3,2),imshow(I); title('加入椒盐躁声图'); f=double(I); % 由于MATLAB 不支持unsigned int 型图像计算,故将图像数据变为double 型 g=fft2(f); % 傅里叶变换 g=fftshift(g); % 将傅里叶变化零频率搬移到频谱中间 [M,N]=size(g); % 确定图像大小,M 为行数,N 为列数 D0=100; %截止频率 m=fix(M/2); n=fix(N/2);% 确定傅里叶变化原点(即直流部分),并且数据向0 取整result=zeros(M,N); for i=1:1:M for j=1:1:N d=sqrt((i-m)^2+(j-n)^2);%计算D(u,v) if(d<=D0) h=1;%如果D(u,v)<=D0, H(u,v)=1 else h=0;%如果D(u,v)>D0, H(u,v)=0 end result(i,j)=h*g(i,j); end end result=ifftshift(result);% 傅里叶逆移频,由于之前做过fftshift J1=ifft2(result);% 傅里叶反变换 J2=uint8(real(J1));%提取J1 的实部,并将该数据定义为8 位无符号整数 subplot(2,3,3),imshow(J2) ; title('理想低通滤波图'); n=2;%二阶 D0=150; %截止频率 m=fix(M/2); n=fix(N/2);% 确定傅里叶变化原点(即直流部分),并且数据向0 取整result=zeros(M,N);

数字图像处理实验

《数字图像处理》 实验报告 学院:信息工程学院 专业:电子信息工程 学号: 姓名: 2015年6月18日

目录 实验一图像的读取、存储和显示 (2) 实验二图像直方图分析 (6) 实验三图像的滤波及增强 (15) 实验四噪声图像的复原 (19) 实验五图像的分割与边缘提取 (23) 附录1MATLAB简介 (27)

实验一图像的读取、存储和显示 一、实验目的与要求 1.熟悉及掌握在MATLAB中能够处理哪些格式图像。 2.熟练掌握在MATLAB中如何读取图像。 3.掌握如何利用MATLAB来获取图像的大小、颜色、高度、宽度等等相关信息。 4.掌握如何在MATLAB中按照指定要求存储一幅图像的方法。 5.图像的显示。 二、实验原理 一幅图像可以被定义为一个二维函数f(x,y),其中x和y是空间(平面)坐标,f 在任何坐标处(x,y)处的振幅称为图像在该点的亮度。灰度是用来表示黑白图像亮度的一个术语,而彩色图像是由单个二维图像组合形成的。例如,在RGB彩色系统中,一幅彩色图像是由三幅独立的分量图像(红、绿、蓝)组成的。因此,许多为黑白图像处理开发的技术适用于彩色图像处理,方法是分别处理三副独立的分量图像即可。图像关于x和y坐标以及振幅连续。要将这样的一幅图像转化为数字形式,就要求数字化坐标和振幅。将坐标值数字化成为取样;将振幅数字化成为量化。采样和量化的过程如图1所示。因此,当f的x、y分量和振幅都是有限且离散的量时,称该图像为数字图像。 三、实验设备 (1) PC计算机 (2) MatLab软件/语言包括图像处理工具箱(Image Processing Toolbox) (3) 实验所需要的图片 四、实验内容及步骤 1.利用imread( )函数读取一幅图像,假设其名为flower.tif,存入一个数组中; 2.利用whos 命令提取该读入图像flower.tif的基本信息; 3.利用imshow()函数来显示这幅图像; 4.利用imfinfo函数来获取图像文件的压缩,颜色等等其他的详细信息; 5.利用imwrite()函数来压缩这幅图象,将其保存为一幅压缩了像素的jpg文件设为flower.jpg语法:imwrite(原图像,新图像,‘quality’,q), q取0-100。 6.同样利用imwrite()函数将最初读入的tif图象另存为一幅bmp图像,设为flower.bmp。 7.用imread()读入图像:Lenna.jpg 和camema.jpg; 8.用imfinfo()获取图像Lenna.jpg和camema.jpg 的大小;

数字图像处理实验

学院计算机与通信工程学院专业生物医学工程专业 班级51111 学号5111133 姓名杨静 指导教师贾朔 2014年04月21日

实验一图像的基本运算 一、实验目的: 1、掌握图像处理中的点运算、代数运算、逻辑运算和几何运算及应用。 2、掌握各种运算对于图像处理中的效果。 二、实验内容: 1、(1)选择一幅图像lena8.jpg,设置输入/输出变换的灰度级范围,a=0.2,b=0.6,c=0.1,d=0.9. (2)设置非线性扩展函数的参数c=2. (3)采用灰度级倒置变换函数s=255-r进行图像变换 (4)设置二值化图像的阈值,分别为level=0.4,level=0.7 解:参考程序如下: I=imread('C:\lena8.jpg'); figure; subplot(2,3,1); imshow(I); title('原图'); J=imadjust(I,[0.3;0.6],[0.1;0.9]); %设置灰度变换的范围 subplot(2,3,2); imshow(J); title('线性扩展'); I1=double(I); %将图像转换为double类型 I2=I1/255; %归一化此图像 C=2; K=C*log(1+I2); %求图像的对数变换 subplot(2,3,3); imshow(K); title('非线性扩展'); M=im2bw(I,0.5); M=~M; %M=255-I; %将此图像取反 %Figure subplot(2,3,4); imshow(M); title('灰度倒置'); N1=im2bw(I,0.4); %将此图像二值化,阈值为0.4 N2=im2bw(I,0.7); %将此图像二值化,阈值为0.7 subplot(2,3,5); imshow(N1); title('二值化阈值0.4'); subplot(2,3,6); imshow(N2); title('二值化阈值0.7');

数字图像处理实验报告

数字图像处理实验 报告 学生姓名:学号: 专业年级: 09级电子信息工程二班

实验一常用MATLAB图像处理命令 一、实验内容 1、读入一幅RGB图像,变换为灰度图像和二值图像,并在同一个窗口内分成三个子窗口来分别显示RGB图像和灰度图像,注上文字标题。 实验结果如右图: 代码如下: Subplot (1,3,1) i=imread('E:\数字图像处理\2.jpg') imshow(i) title('RGB') Subplot (1,3,2) j=rgb2gray(i) imshow(j) title('灰度') Subplot (1,3,3) k=im2bw(j,0.5) imshow(k) title('二值') 2、对两幅不同图像执行加、减、乘、除操作,在同一个窗口内分成五个子窗口来分别显示,注上文字标题。 实验结果如右图: 代码如下: Subplot (3,2,1) i=imread('E:\数字图像处理 \16.jpg') x=imresize(i,[250,320]) imshow(x) title('原图x') Subplot (3,2,2) j=imread(''E:\数字图像处理 \17.jpg') y=imresize(j,[250,320]) imshow(y) title('原图y') Subplot (3,2,3) z=imadd(x,y) imshow(z)

title('相加结果');Subplot (3,2,4);z=imsubtract(x,y);imshow(z);title('相减结果') Subplot (3,2,5);z=immultiply(x,y);imshow(z);title('相乘结果') Subplot (3,2,6);z=imdivide(x,y);imshow(z);title('相除结果') 3、对一幅图像进行灰度变化,实现图像变亮、变暗和负片效果,在同一个窗口内分成四个子窗口来分别显示,注上文字标题。 实验结果如右图: 代码如下: Subplot (2,2,1) i=imread('E:\数字图像处理 \23.jpg') imshow(i) title('原图') Subplot (2,2,2) J = imadjust(i,[],[],3); imshow(J) title('变暗') Subplot (2,2,3) J = imadjust(i,[],[],0.4) imshow(J) title('变亮') Subplot (2,2,4) J=255-i Imshow(J) title('变负') 二、实验总结 分析图像的代数运算结果,分别陈述图像的加、减、乘、除运算可能的应用领域。 解答:图像减运算与图像加运算的原理和用法类似,同样要求两幅图像X、Y的大小类型相同,但是图像减运算imsubtract()有可能导致结果中出现负数,此时系统将负数统一置为零,即为黑色。 乘运算实际上是对两幅原始图像X、Y对应的像素点进行点乘(X.*Y),将结果输出到矩阵Z中,若乘以一个常数,将改变图像的亮度:若常数值大于1,则乘运算后的图像将会变亮;叵常数值小于是,则图像将会会暗。可用来改变图像的灰度级,实现灰度级变换,也可以用来遮住图像的某些部分,其典型应用是用于获得掩膜图像。 除运算操作与乘运算操作互为逆运算,就是对两幅图像的对应像素点进行点(X./Y), imdivide()同样可以通过除以一个常数来改变原始图像的亮度,可用来改变图像的灰度级,其典型运用是比值图像处理。 加法运算的一个重要应用是对同一场景的多幅图像求平均值 减法运算常用于检测变化及运动的物体,图像相减运算又称为图像差分运算,差分运算还可以用于消除图像背景,用于混合图像的分离。

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