数字图像处理实验教程V31zsjWord文件下载.docx
《数字图像处理实验教程V31zsjWord文件下载.docx》由会员分享,可在线阅读,更多相关《数字图像处理实验教程V31zsjWord文件下载.docx(62页珍藏版)》请在冰豆网上搜索。
实验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)*/
nChannels;
大多数OPENCV函数支持1,2,3
或
4
个通道
*/
alphaChannel;
被OpenCV忽略
depth;
像素的位深度
char
colorModel[4];
channelSeq[4];
同上
dataOrder;
0
-
交叉存取颜色通道,
1
分开的颜色通道.
*/
origin;
顶—左结构,
底—左结构
align;
图像行排列
(4
or
8).
OpenCV
忽略它,使用
widthStep
代替
width;
图像宽像素数
height;
图像高像素数*/
struct
_IplROI
*roi;
图像感兴趣区域.
当该值非空只对该区域进行处理
_IplImage
*maskROI;
在
OpenCV中必须置NULL
void
*imageId;
同上*/
_IplTileInfo
*tileInfo;
/*同上*/
imageSize;
图像数据大小(在交叉存取格式下imageSize=image->
height*image->
widthStep),单位字节*/
*imageData;
指向排列的图像数据
widthStep;
排列的图像行大小,以字节为单位
BorderMode[4];
边际结束模式,
BorderConst[4];
*imageDataOrigin;
指针指向一个不同的图像数据结构(不是必须排列的),是为了纠正图像内存分配准备的
(3)请说明OpenCV配置过程中,各个步骤的意义。
配置VC++6.0环境
下面需要设置VC6.0环境,使得VC6.0在编译OpenCV程序时,能够知道从何处找到头文件和库文件。
(1)配置头文件目录
依次打开Tools->
Options->
Directories:
在Include
files中,添加如下目录(6个,通常用前面的4个即可):
(2)配置库文件目录
在Library
files中,添加如下目录:
(三)配置项目
要使得VC6.0项目能够支持OpenCV,需要在项目中添加OpenCV的库文件链接,使程序能够知道所用的函数是来自哪个库。
依次打开Project->
Link,在Object/library
modules中,添加所需要的lib文件,以空格分开。
通常包括(6个):
cxcore.lib
cv.lib
cvaux.lib
highgui.lib
cvcam.lib
ml.lib
(4)如何修改程序,使得程序可以显示多幅图像?
5.练习
【基础练习】试着不用参考给定例程,自己写出本次实验的代码,掌握OpenCV图像处理程序的基本流程和框架。
【扩展练习】编程实现加载并显示三幅图像,其中一幅通过指定文件名的方式读取,另外两幅通过外部输入参数读取。
1.#include
<
cv.h>
2.#include
highgui.h>
3.#include
vector>
4.
5.using
namespace
std;
6.
7.#pragma
comment(lib,
"
cv.lib"
)
8.#pragma
cxcore.lib"
9.#pragma
highgui.lib"
10.
11.void
imshowMany(const
std:
:
string&
_winName,
const
vector<
IplImage*>
&
_imgs);
12.
13.int
main(void)
14.{
15.
imgs(6);
16.
imgs[0]
=
cvLoadImage("
test.png"
);
17.
imgs[1]
18.
imgs[2]
19.
imgs[3]
20.
imgs[4]
21.
imgs[5]
22.
23.
imshowMany("
DOTA2_Hero"
imgs);
24.
cvWaitKey();
25.
26.
return
0;
27.}
28.
29.void
_imgs)
30.{
31.