收藏 分享(赏)

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

上传人:dzzj200808 文档编号:2688700 上传时间:2018-09-25 格式:DOC 页数:47 大小:482KB
下载 相关 举报
数字图像处理实验教程-V3.1-zsj.doc_第1页
第1页 / 共47页
数字图像处理实验教程-V3.1-zsj.doc_第2页
第2页 / 共47页
数字图像处理实验教程-V3.1-zsj.doc_第3页
第3页 / 共47页
数字图像处理实验教程-V3.1-zsj.doc_第4页
第4页 / 共47页
数字图像处理实验教程-V3.1-zsj.doc_第5页
第5页 / 共47页
点击查看更多>>
资源描述

1、数字图像处理实验教程 V3.11青岛科技大学数字图像处理实验教程信息学院 张淑军版本:V3.12011年 3月试行2012-2014年修订数字图像处理实验教程 V3.12编写说明1. 本书是数字图像处理实验教程,配合理论授课内容,巩固所学知识,锻炼学生动手开发能力。2. 实验课需要学生预习,做好必要的准备,以保证实验效果。每次实验的内容和目标非常明确,实验过程中请同学们认真动手,举一反三,不依赖例程,能掌握编程思想。3. 为加强学生对于所掌握内容的理解,设计了实验回答问题,环环相扣,使学生在编程实践的同时巩固知识点,对所学知识融会贯通,为进入本次实验内容打下基础。4. 每次实验由例程和练习两部

2、分组成,例程包含了本次实验的核心内容,要求学生统一掌握。练习部分考虑了学生编程水平的高低,分为:基础练习;扩展练习;高层进阶三个层次,以激励编程好的学生积极主动往更高层次努力,培养、选拔优秀学生;大多数的学生可以完成扩展练习。5. 每课内容最后罗列了所用到的基本 OPENCV 函数,方便学生查找使用。未附说明的函数请学生自行查找 OPENCV 电子书,锻炼自己解决问题的能力。6. 每次实验完成之后,请学生按要求撰写实验报告,并在最后详细记录“实验收获与总结” ,将实验中遇到的问题和解决过程作为经验教训记录下来,训练学生及时总结归纳和反思、记录的习惯。数字图像处理实验教程 V3.13目 录目 录

3、 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数字图像处理实验教程 V3.14实验 1 图像文件读入和显示(验证性,第 1章)1. 实验目的(1) 熟悉 VC+6.0

4、 开发环境。(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 控制

5、台项目。方法 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。键入所给的代

6、码。编译、连接该程序,在 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 在同一个目录下) ,运行。指

7、定输入参数:在项目配置页依次找 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)数字图像

8、处理实验教程 V3.15这两个参数的作用是:argc 是指命令行输入参数的个数,argv 存储了所有的命令行参数。假如程序是 hello.exe,如果在命令行运行该程序,运行命令为:hello.exe lena.jpg,则:argc 的值是 2,argv0是“hello.exe“ ,argv1 是“lena.jpg“。(6) 修改 hello2 程序,使其可以同时读取、显示多幅图像。4. 实验回答问题(1) 什么是 OpenCV?(2) 通过实验,查看 IplImage 结构体的数据结构。请给出 IplImage 结构体的数据结构。(3) 请说明 OpenCV 配置过程中,各个步骤的意义。(4

9、) 如何修改程序,使得程序可以显示多幅图像?5. 练习【基础练习】试着不用参考给定例程,自己写出本次实验的代码,掌握OpenCV 图像处理程序的基本流程和框架。【扩展练习】编程实现加载并显示三幅图像,其中一幅通过指定文件名的方式读取,另外两幅通过外部输入参数读取。6. 实验报告要求实验报告要求写明以下 7 方面内容:(1) 写明实验目的。(2) 写明实验内容和步骤。(3) 写出完整的控制台程序代码,并加详细的注释。 (仅对 hello.c)(4) 描绘并解释实验结果,并对实验结果进行分析。(5) 写明实验中存在的不足,以及改进的方法。(6) 回答实验中涉及到的问题。(7) 写出本次实验的体会。

10、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表示可变大小cvSho

11、wImage(“image“,pImg);/在指定窗口显示图像文件数字图像处理实验教程 V3.16cvWaitKey(0);/等待按键,若无此句,程序运行时看不到结果cvDestroyWindow(“image“);/销毁窗口cvReleaseImage(/释放图像文件/* 程序名:hello2.cpp功 能:从磁盘中读入任意图像文件,并将图像显示在屏幕上 */#include “cv.h“#include “highgui.h“/在 main 函数中,argc 表示主程序接收的参数个数,argv 数组接收程序参数/如:当 argc=2 时,argv0表示第 0 个参数(可执行程序本身) ,a

12、rgv1表示第1 个参数(需人为输入)/当 argc=1 时,表示不需要从外界接收参数int main(int argc, char* argv)IplImage* pImg;/声明 IplImage 指针/载入图像if (argc=2 /创建窗口cvShowImage(“image“,pImg);/显示图像cvWaitKey(0);/等待按键cvDestroyWindow(“image“);/销毁窗口cvReleaseImage(/释放图像return 0;return -1;9. OpenCV 函数解释OpenCV 的函数和数据类型命名规则如下:(1) 宏全部使用大写字符,字间用下划线分隔

13、,如:CV_MAX_DIM,IPL_DEPTH_32F。(2) 数据类型以 Cv 开头,如:CvSize,CvPoint3D64f 等。(3) 函数以 cv 开头,如: cvLoadImage、cvSaveImage 等。需要包含的 OpenCV 头文件:“cv.h“:OpenCV 的基本函数头文件。“highgui.h“:用于用户 GUI 界面设计的 OpenCV 专用库,包括很多 Windows 数字图像处理实验教程 V3.17API 接口函数。OpenCV 基本函数:cvLoadImage 从文件读取图像语法:IplImage* cvLoadImage(const char* filen

14、ame,int flag=1)参数:filename:待载入的文件名,包括扩展名。可以载入BMP,DIB,JPEG ,PNG,PBM ,PGM ,PPM ,SR,RAS 和 TIFF 等文件格式。flag 表示是否是彩色图像(多通道) ,默认为 1,表示读入的图像被强制为 3通道的彩色图像flag=0,表示载入图像强制为单通道灰度图像flagOptions-Directories: 在 Include files 中,添加如下目录:C:PROGRAM FILESOPENCVCVINCLUDEC:PROGRAM FILESOPENCVCVAUXINCLUDEC:PROGRAM FILESOPEN

15、CVCXCOREINCLUDEC:PROGRAM FILESOPENCVOTHERLIBSHIGHGUIC:PROGRAM FILESOPENCVOTHERLIBSCVCAMINCLUDE点击 Options 之后页面如下:配置完之后,页面如下:数字图像处理实验教程 V3.19(2)配置库文件目录依次打开 Tools-Options-Directories: 在 Library files 中,添加如下目录:C:PROGRAM FILESOPENCVLIB配置完之后页面如下:数字图像处理实验教程 V3.110(3)添加库文件链接这一步对于每一个工程都要配置一次,在新建工程之后,依次打开 Pro

16、ject-Settings-Link,在 Object/library modules 中,添加所需要的 lib 文件,以空格分开。通常包括:cxcore.lib cv.lib cvaux.lib highgui.lib cvcam.lib ml.lib点击 Settings-Link,添加 6 个库之后的页面如下:数字图像处理实验教程 V3.111程序在链接、运行时,需要 OpenCV 的动态链接库的支持,如果程序提示找不到 dll 文件,则需将 OpenCV 的所有动态链接库文件(OpenCV-bin 目录下的 8 个 dll 文件)直接拷到系统安装目录 system32 下,这样 Ope

17、nCV 的程序无论在本机的何处运行,都没有问题了。数字图像处理实验教程 V3.112实验 2 图像采集与显示(综合性,第 2章)1. 实验目的(1) 了解 OpenCV 中使用摄像头采集图像的方法。(2) 掌握 OpenCV 进行图像采集、存储与显示的实现方法。2. 实验内容编写程序,用摄像头采集彩色图像并进行彩色和灰度显示。3. 实验步骤(验证性实验)(1) 首先保证计算机安装了某个摄像头(webcam)及其驱动程序,摄像头能正常采集。(2) 创建 OpenCV 控制台项目。(3) 添加源文件 gray.cpp,并输入相关代码。(4) 编译、连接、运行,得到实验结果。4. 实验回答问题(1)

18、 IplImage 结构体中 imageData 的格式是什么样的? (2) 函数 cvCreateImage 的最后一个参数的含义是什么?(3) 画出示例代码 gray.cpp 程序的流程图。5. 练习【基础练习】修改程序,使得程序能读取硬盘上的 AVI 视频文件并逐帧显示。【扩展练习】自己编写完整程序实现以下功能:(1) 创建一个窗口(2) 载入图像(3) 显示图像(4) 创建一幅新图像(5) 将原图像转换为灰度图像赋给新图像(6) 在新窗口显示新图像(7) 销毁窗口,释放图像6. 实验报告要求实验报告要求写明以下 7 方面内容:(1) 写明实验目的。(2) 写明实验内容和步骤。(3) 写

19、出完整的控制台程序代码,并加详细的注释。(4) 描绘并解释实验结果,并对实验结果进行分析。(5) 写明实验中存在的不足,以及改进的方法。(6) 回答实验中涉及到的问题。(7) 写出本次实验的体会。7. 预习内容(1) 图像坐标变换有哪些?掌握每种变换的公式。(2) 图像坐标变换的级联。8. 参考程序代码/* 程序名:gray.cpp说 明:从摄像头采集图像,并转化为灰度图显示*/数字图像处理实验教程 V3.113#include #include #include #include int main( int argc, char* argv )/声明 IplImage 指针IplImage*

20、 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 = cvCaptureFromAVI(“sea.avi”) /从视频文件获取图

21、像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)

22、; /转化成单通道图像(灰度图像)/显示图像cvShowImage(“color“, pFrame);数字图像处理实验教程 V3.114cvShowImage(“gray“, pFrImg);/等待按键事件cvWaitKey(2);/当前帧采集到之后延迟 2 毫秒,以便能实现连续显示视频的效果/cvWaitKey(0);/若参数为 0,则无限制等待按键,只能显示第一帧图像/销毁窗口cvDestroyWindow(“color“);cvDestroyWindow(“gray“);/释放图像和矩阵cvReleaseImage(cvReleaseImage(cvReleaseCapture(retu

23、rn 0;9. OpenCV 函数解释需要包含的 OpenCV 头文件#include “cxcore.h“#include “cvcam.h“#include “windows.h“cxcore.h:OpenCV 核函数头文件OpenCV 基本函数:OpenCV 支持从摄像头和视频文件(AVI)中捕捉图像,使用的两个函数是:cvCaptureFromCAM 从摄像头捕捉图像cvCaptureFromAVI 从视频获取图像返回值均为 CvCapture 结构体cvCaptureFromCAM功能:给从摄像头得到的视频流分配和初始化 CvCapture 结构。语法:CvCapture* cvCa

24、ptureFromCAM( int index );参数:index 要使用的摄像头索引,默认为-1。cvQueryFrame 获取视频序列帧的每一帧语法:IplImage* cvQueryFrame( CvCapture* capture );参数:capture 视频获取结构。 cvCreateImage 创建图像函数语法:IplImage *cvCreateImage(CvSize size, int depth, int channels)参数:size:图像的宽、高。depth :图像图元深度。 channels 每个图元的颜色通道数。数字图像处理实验教程 V3.115返回值:Ipl

25、Image 结构体。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 指针,一般

26、为 IplImage 型结构体。 Code:色彩转换空间,常数定义为 CV_2数字图像处理实验教程 V3.116实验 3 图像坐标变换(综合性,第 2章)1. 实验目的(1) 掌握图像坐标变换的原理和方法。(2) 能设计相应代码实现图像的旋转与缩放变换。2. 实验内容编写程序用 OpenCV 实现对图像的各种空间变换。需要实现的功能有:旋转与缩放。3. 实验步骤(综合性实验)(1) 新建源文件 rotate.cpp。(2) 编写程序代码,使程序可以对图像进行旋转与缩放。(3) 编译、连接(生成工作区) 、运行该文件,得到实验结果。(4) 通过给定的函数,理解所给代码的功能进而改写程序代码,使程

27、序可以对图像实现指定的空间变换,包括平移、旋转、缩放。4. 实验回答问题(1) 请给出图像坐标变换的基本公式和实现原理,并着重说明例程中的算法。(2) 写出平移矩阵、缩放矩阵、旋转(绕 z 轴)矩阵。5. 练习【基础练习】(1) 修改例程,使得程序可以每次按键旋转一次图像。 (这个修改在现在的代码上比较困难,需要把 rotate 函数解开,直接在 main 函数里写)(2) 修改例程,使得程序可以连续循环地旋转图像。【扩展练习】(1)使用 cvFlip 函数实现图像绕 x,y 轴或中心旋转。(2)修改例程,使得程序可以在旋转图像的同时缩放图像。【高层进阶】(1) 使用 cvResize 函数实

28、现图像的缩放功能。(2) 编写程序,实现图像的平移、旋转和缩放综合功能。6. 实验报告要求实验报告要求写明以下 7 方面内容:(1) 写明实验目的。(2) 写明实验内容和步骤。(3) 写出空间变换所涉及的图像处理函数,并加详细的注释。(4) 描绘并解释实验结果,并对实验结果进行分析。(5) 写明实验中存在的不足,以及改进的方法。(6) 回答实验中涉及到的问题。(7) 写出本次实验的体会。7. 预习内容(1) 空域图像增强的概念是什么?有哪些分类?(2) 给出几种常见的图像灰度映射函数。8. 参考程序代码/* 程序名:rotate.cpp数字图像处理实验教程 V3.117功 能:使用 OpenC

29、V 函数实现图像的旋转(平移和缩放) 。*/#include #include #include #include #include void myRotate(IplImage* ,int); /声明自定义的图像旋转函数int main()IplImage *src;src=cvLoadImage(“lena.jpg“);if(!src) printf(“加载图片失败!n“);return -1;cvNamedWindow(“src“,1);/窗口固定大小cvMoveWindow(“src“,200,80);/设定窗口左上角坐标位置cvShowImage(“src“, src);int an

30、g=45;cvRotate(src, ang);/旋转图像cvWaitKey(0);cvReleaseImage(cvDestroyWindow(“src“);return 0;void myRotate(IplImage* src,int angle)/自定义图像旋转函数 IplImage *dst=0;dst = cvCloneImage (src);float m6;int w = src-width;int h = src-height;m0 = cos(angle * CV_PI/180);m1 = sin(angle * CV_PI/180);m2 = w*0.5f;数字图像处理实

31、验教程 V3.118m3 = -m1;m4 = m0;m5 = h*0.5f;CvMat M = cvMat( 2, 3, CV_32F, m );/初始化一个 2 行 3 列的矩阵 M(矩阵元素的数据类型为 32 位 float 型)cvGetQuadrangleSubPix( src, dst, /以 M 矩阵变换 src 图像为 dst 图像cvNamedWindow(“dst“,1); cvMoveWindow(“dst“,500,80);cvShowImage(“dst“, dst);9. OpenCV 数据结构与基本函数CvMat 结构定义多通道矩阵,如下(在 cxcore/cxa

32、rray.cpp 中):typedef struct CvMat int type; /元素类型和标记int step; /以字节为单位的行数据长度/* for internal use only */ int* refcount; int hdr_refcount; union uchar* ptr; short* s; int* i; float* fl; double* db; data; /data 指针#ifdef _cplusplus union int rows; int height; ; union int cols; int width; ; #else int rows;

33、 /行数int cols; /列数数字图像处理实验教程 V3.119#endif CvMat;函数说明:cvMat 初始化矩阵函数语法:CvMat cvMat(int rows, int cols, int type, void *data=NULL)参数:rows 矩阵行数,cols 矩阵列数,type 元素类型, data 可选项,指向分配给矩阵头的数据指针。OpenCV 中重要的矩阵变换函数,使用方法为 cvMat* cvCreateMat ( int rows, int cols, int type ); 这里 type 可以是任何预定义类型,预定义类型的结构如下:CV_ (S|U|F

34、)C。于是,矩阵的元素可以是 32位浮点型数据(CV_32FC1),或者是无符号的 8 位三元组的整型数据(CV_8UC3),或者是无数的其他类型的元素。一个 CvMat 的元素不一定就是个单一的数字。在矩阵中可以通过单一(简单)的输入来表示多值,这样我们可以在一个三原色图像上描绘多重色彩通道。对于一个包含 RGB 通道的简单图像,大多数的图像操作将分别应用于每一个通道(除非另有说明) 。cvGetQuadrangleSubPix 使用子像素精度提取像素四边形。该函数通过指定的变换矩阵对原图像进行相应的变换。语法:void cvGetQuadrangleSubPix( const CvArr

35、*src, CvArr *dst, const CvMat *map_matrix)参数:src 输入图像dst 提取的四边形map_matrix 为 2*3 的变换矩阵A | b说明:此函数以子像素精度从图像 src 中提取四边形,并将结果存储于 dst,计算公式如下:dstx + width(dst)/2, y+height(dst)/2 = src( , )121byAx22byAx其中,A 和 b 为几何形变参数,均来自映射矩阵 map_matrix。映射矩阵为:map_matrix= 2211bA此处,非整数坐标 的像素点值通过双线性插值得到。多通道图像yxT),(的每一个通道都单独

36、计算。这个函数旋转图像后,超出原图像部分,默认的是重复边界模式。cvResize 图像大小变换函数功能:函数 cvResize 将图像 src 改变尺寸得到与 dst 同样大小。若设定 ROI,函数将按常规支持 ROI.语法:void cvResize( const CvArr* src, CvArr* dst, int interpolation= 数字图像处理实验教程 V3.120CV_INTER_LINEAR );参数:src 输入图像dst 输出图像interpolation 插值方法,包括:(1) CV_INTER_NN - 最近邻插值(2)CV_INTER_LINEAR - 双线性

37、插值(默认时使用)(3)CV_INTER_AREA - 使用像素关系重采样。当图像缩小时,该方法可以避免波纹出现。当图像放大时,类似于 CV_INTER_NN 方法。(4)CV_INTER_CUBIC - 立方插值cvFlip 垂直,水平或既垂直又水平地翻转二维数组语法:void cvFlip( const CvArr* src, CvArr* dst=NULL, int flip_mode=0)参数:src 输入数组dst 输出数组,若 dst = NULL,则翻转是在内部替换。flip_mode 指定怎样翻转数组。若=0 ,则绕 x 轴翻转;若 0,则绕 y 轴翻转;若 0,则 dst(i

38、,j)=src(i,cols(src1)-j-1),绕 y 轴旋转if flip_mode 1 | high 1 | bottom1 | top1 | low=high)return -1;/输入参数值不符合函数要求,则返回失败值/将输入参数缩放到 8 比特图像的灰度级别0, 255上double low2 = low*255;double high2 = high*255;double bottom2 = bottom*255;double top2 = top*255;double k = (top2 - bottom2)/(high2 - low2);/计算直线斜率int x,y;dou

39、ble val;/对图像中的像素逐个进行灰度变换for( y = 0; y height; y+)/y 为像素的纵坐标for (x = 0; x width; x+)/x 为像素的横坐标val= (uchar) src-imageData src-widthStep*y + x; /得到源图像中像素点的灰度值val = (val - low2)* k + bottom2;/计算变换后的灰度值if(val255) val=255; if(valimageData dst-widthStep*y + x = val;/对目标图像的像素点重新赋灰度值return 0;int main( int ar

40、gc, char* argv ) IplImage *src = 0, *dst = 0;if( argc != 2 | (src=cvLoadImage(argv1, 0) = NULL)/参数 0 表示强制转换为单通道灰度图像return -1;/指定读取灰度图像,否则程序退出cvNamedWindow( “src“, 1 );cvNamedWindow( “result“, 1 );/以下为图像增强过程/先复制源图像dst = cvCloneImage(src);/输入参数 0,0.5 和 0.5,1进行灰度变换if( ImageAdjust( src, dst, 0, 0.5, 0.5

41、, 1)!=0) return -1;cvShowImage( “src“, src );cvShowImage( “result“, dst );cvWaitKey(0);cvDestroyWindow(“src“);cvDestroyWindow(“result“);cvReleaseImage( cvReleaseImage( return 0;9. OpenCV 函数解释cvCloneImage 复制图像函数语法:IplImage* cvCloneImage(const IplImage* image)输入参数为源图像 IplImage 指针,返回值为目的 IplImage 指针。数字

42、图像处理实验教程 V3.124实验 5 直方图均衡化(验证性,3.3 节)1. 实验目的(1)熟悉直方图均衡化处理的理论基础;(2)掌握直方图均衡化处理的实现方法;(3)学习 VC+6.0 和 OpenCV 的编程方法;(4)验证直方图均衡化处理理论;(5)观察直方图均衡化处理的结果。2. 实验内容(1) 使用 VC+6.0 编译 OpenCV 程序 histeq.c 的代码,使程序显示直方图均衡化后的图像。观察并记录实验结果。(2) OpenCV 已经封装了对图像进行均衡化的算法(cvEqualizeHist 函数) ,试修改 histeq.c 的代码,直接使用函数 cvEqualizeHi

43、st 对图像进行均衡化。(3) 选做实验:参考提供的代码 imhist.c,建立相应工程,实现图像直方图的显示。了解在 OpenCV 中画图形的方法。3. 实验回答问题简述图像直方图均衡化的计算步骤。4. 练习【基础练习】(1) 熟练使用快捷键及 C 程序调试方法:F9 加断点, F10 单步执行,F5 调试等。(2) 练习使用 printf 打印语句用来检测局部结果。5. 实验报告要求实验报告要求写明以下 7 方面内容:(1) 写明实验目的。(2) 写明实验内容和步骤。(3) 写出图像处理函数代码,并对算法程序部分加详细的注释。(4) 描绘并解释实验结果,并对实验结果进行分析。(5) 写明实

44、验中存在的不足,以及改进的方法。(6) 回答实验中涉及到的问题。(7) 写出本次实验的体会。6. 预习内容预习空域滤波器的分类;平滑、锐化滤波器的实现方法。7. 参考程序代码/* 程序名:histeq.c功 能:读入图像,实现直方图的均衡化并显示*/#include “cv.h“#include “highgui.h“#define HDIM 256 / bin of HIST, default = 256数字图像处理实验教程 V3.125int main( int argc, char* argv ) IplImage *src = 0, *dst = 0;CvHistogram *hist

45、 = 0;int n = HDIM; double nnHDIM;uchar THDIM;CvMat *T_mat;int x;int sum = 0; / sum of pixels of the source image 图像中像素点总数double val = 0;if( argc != 2 | (src=cvLoadImage(argv1, 0) = NULL) / force to gray imagereturn -1;cvNamedWindow( “source“, 1 );cvNamedWindow( “result“, 1 );/ 计算直方图hist = cvCreateHi

46、st( 1, cvCalcHist( / Create Accumulative Distribute Function of histgramval = 0;for ( x = 0; x bins, x);/计算累积直方图nnx = val;/ 归一化直方图sum = src-height * src-width;for( x = 0; x #include int main( int argc, char* argv )IplImage *src = 0;IplImage *histimg = 0;CvHistogram *hist = 0;int hdims = 50; / 划分 HIS

47、T 的个数,越高越精确float hranges_arr = 0,255;float* hranges = hranges_arr;int bin_w; float max_val;int i;if( argc != 2 | (src=cvLoadImage(argv1, 0) = NULL) / force to gray imagereturn -1;cvNamedWindow( “Histogram“, 0 );cvNamedWindow( “src“, 0);hist = cvCreateHist( 1, / 计算直数字图像处理实验教程 V3.127方图histimg = cvCrea

48、teImage( cvSize(320,200), 8, 3 );cvZero( histimg );cvCalcHist( / 计算直方图cvGetMinMaxHistValue( hist, 0, / 只找最大值cvConvertScale( hist-bins, hist-bins, max_val ? 255. / max_val : 0., 0 ); / 缩放 bin 到区间 0,255 cvZero( histimg );bin_w = histimg-width / hdims; / hdims: 条的个数,则 bin_w 为条的宽度/ 画直方图for( i = 0; i bins,i)*histimg-height/255 );CvScalar color = CV_RGB(255,255,0); /(hsv2rgb(i*180.f/hdims);cvRectangle( histimg, cvPoint(i*bin_w,histimg-height),cvPoint(i+1)*bin_w,(int)(histimg-height - val),color, 1, 8, 0 );cvShowImage( “src“, src);cvShowImage( “Histogram“, histimg );cvWaitKey(0);cvDestroyWindow(“src

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报