数字图像处理实验教程V31zsj.docx
- 文档编号:2805606
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:62
- 大小:277.60KB
数字图像处理实验教程V31zsj.docx
《数字图像处理实验教程V31zsj.docx》由会员分享,可在线阅读,更多相关《数字图像处理实验教程V31zsj.docx(62页珍藏版)》请在冰豆网上搜索。
数字图像处理实验教程V31zsj
青岛科技大学
数字图像处理实验教程
信息学院张淑军
版本:
V3.1
2011年3月试行
2012-2014年修订
编写说明
1.本书是《数字图像处理》实验教程,配合理论授课内容,巩固所学知识,锻炼学生动手开发能力。
2.实验课需要学生预习,做好必要的准备,以保证实验效果。
每次实验的内容和目标非常明确,实验过程中请同学们认真动手,举一反三,不依赖例程,能掌握编程思想。
3.为加强学生对于所掌握内容的理解,设计了实验回答问题,环环相扣,使学生在编程实践的同时巩固知识点,对所学知识融会贯通,为进入本次实验内容打下基础。
4.每次实验由例程和练习两部分组成,例程包含了本次实验的核心内容,要求学生统一掌握。
练习部分考虑了学生编程水平的高低,分为:
基础练习;扩展练习;高层进阶三个层次,以激励编程好的学生积极主动往更高层次努力,培养、选拔优秀学生;大多数的学生可以完成扩展练习。
5.每课内容最后罗列了所用到的基本Opencv函数,方便学生查找使用。
未附说明的函数请学生自行查找OpenCV电子书,锻炼自己解决问题的能力。
6.每次实验完成之后,请学生按要求撰写实验报告,并在最后详细记录“实验收获与总结”,将实验中遇到的问题和解决过程作为经验教训记录下来,训练学生及时总结归纳和反思、记录的习惯。
目录
目录3
实验1图像文件读入和显示(验证性,第1章)4
实验2图像采集与显示(综合性,第2章)12
实验3图像坐标变换(综合性,第2章)16
实验4图像灰度变换(综合性,3.1节)21
实验5直方图均衡化(验证性,3.3节)24
实验6滤波器设计(综合性,3.4节)30
实验7颜色空间转换(综合性,第4章)35
实验8图像傅里叶变换(验证性,第5章)41
拓展实验基于MFC的图像处理程序设计(综合性)47
参考文献47
实验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)安装OpenCV1.0并正确配置,配置文档见“9.OpenCV配置文档”。
(3)创建OpenCV控制台项目。
方法1:
新建文件
在VC6.0下新建一个C++源文件:
File->New->Files->C++SourceFile,取名为hello.cpp,指定存储目录。
②在hello.cpp的编辑页面键入hello.cpp所给的代码,并保存。
③编译、连接,创建所需的工作区,在Debug目录下得到可执行文件hello.exe。
方法2:
新建工程
在VC6.0下创建一个空的控制台项目(Win32ConsoleApplication),取名为hello,指定存储目录。
②给该项目添加(新建)一个C源代码文件(C++SourceFile),取名为hello.cpp。
键入所给的代码。
③编译、连接该程序,在Debug目录下得到可执行文件hello.exe。
(4)在工程目录下放入图像文件lena.jpg,运行该项目,得到输出结果。
(5)按照上述
(1)-(3)步骤重新建立一个新的工程hello2.dsw,键入hello2.cpp的相关代码,编译、连接,调试参数,得到运行结果。
控制台程序有两种方法运行:
以命令行方式运行:
在cmd命令行窗口(开始->运行->打开,cmd->确定,进入命令行窗口)中找到hello.exe所在的文件夹,输入hello.exelena.jpg(要求lena.jpg与编译连接好的hello.exe在同一个目录下),运行。
②指定输入参数:
在项目配置页依次找Project->Settings->Debug->Programarguments,在其中直接输入程序要求的外部输入参数lena.jpg,运行该程序。
(要求lena.jpg与工程文件在同一个目录下。
)
为更好地理解控制台程序输入参数的问题,请将程序hello.cpp与程序hello2.cpp做仔细的对比,认真体会。
二者的区别在于,hello2.cpp中的main函数带有两个参数,argc和argv,如下面形式:
intmain(intargc,char**argv)或intmain(intargc,char*argv[])
这两个参数的作用是:
argc是指命令行输入参数的个数,argv存储了所有的命令行参数。
假如程序是hello.exe,如果在命令行运行该程序,运行命令为:
hello.exelena.jpg,则:
argc的值是2,argv[0]是"hello.exe",argv[1]是"lena.jpg"。
(6)修改hello2程序,使其可以同时读取、显示多幅图像。
4.实验回答问题
(1)什么是OpenCV?
OpenCV的全称是:
OpenSourceComputerVisionLibrary 。
OpenCV是一个基于BSD许可证授权(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上。
它轻量级而且高效——由一系列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.
5.using 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
12.
13.int main(void)
14.{
15. std:
:
vector
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
30.{
31.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字图像 处理 实验 教程 V31zsj