数字图像处理实验教程 V3.1
(1) 空域图像增强的概念是什么?有哪些分类? (2) 给出几种常见的图像灰度映射函数。 8. 参考程序代码 /* 程序名:rotate.cpp
功 能:使用OpenCV函数实现图像的旋转(平移和缩放)。 */
#include
#include
void myRotate(IplImage* ,int); //声明自定义的图像旋转函数
int main() {
IplImage *src;
src=cvLoadImage(\ if(!src) { printf(\加载图片失败!\\n\ return -1; }
cvNamedWindow(\窗口固定大小
cvMoveWindow(\设定窗口左上角坐标位置 cvShowImage(\
int ang=45;
cvRotate(src, ang);//旋转图像
cvWaitKey(0);
cvReleaseImage(&src); cvDestroyWindow(\ return 0; }
void myRotate(IplImage* src,int angle)//自定义图像旋转函数 {
IplImage *dst=0;
dst = cvCloneImage (src);
float m[6];
int w = src->width;
21
数字图像处理实验教程 V3.1
int h = src->height;
m[0] = cos(angle * CV_PI/180); m[1] = sin(angle * CV_PI/180); m[2] = w*0.5f; m[3] = -m[1]; m[4] = m[0]; m[5] = h*0.5f;
CvMat M = cvMat( 2, 3, CV_32F, m );//初始化一个2行3列的矩阵M(矩阵元素的数据类型为32位float型)
cvGetQuadrangleSubPix( src, dst, &M);//以M矩阵变换src图像为dst图像
cvNamedWindow(\ cvMoveWindow(\ cvShowImage(\}
9. OpenCV数据结构与基本函数
CvMat结构定义多通道矩阵,如下(在cxcore/cxarray.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;
22
数字图像处理实验教程 V3.1
}; #else
int rows; //行数 int cols; //列数 #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_
cvGetQuadrangleSubPix 使用子像素精度提取像素四边形。该函数通过指定的变换矩阵对原图像进行相应的变换。
语法:void cvGetQuadrangleSubPix( const CvArr *src, CvArr *dst, const CvMat *map_matrix)
参数:src 输入图像 dst 提取的四边形
map_matrix 为2*3的变换矩阵[A | b]
说明:此函数以子像素精度从图像src中提取四边形,并将结果存储于dst,计算公式如下:
dst[x + width(dst)/2, y+height(dst)/2] = src(A11x?A12y?b1,A21x?A22y?b2) 其中,A和b为几何形变参数,均来自映射矩阵map_matrix。映射矩阵为:
?Amap_matrix=?11?A21A12A22b1? ?b2?此处,非整数坐标A?(x,y)T?b的像素点值通过双线性插值得到。多通道图像的每一个通道都单独计算。
这个函数旋转图像后,超出原图像部分,默认的是重复边界模式。
23
数字图像处理实验教程 V3.1
cvResize图像大小变换函数
功能:函数 cvResize 将图像 src 改变尺寸得到与 dst 同样大小。若设定 ROI,函数将按常规支持 ROI.
语法:void cvResize( const CvArr* src, CvArr* dst, int interpolation= CV_INTER_LINEAR ); 参数:src 输入图像
dst 输出图像
interpolation 插值方法,包括: (1) CV_INTER_NN - 最近邻插值
(2)CV_INTER_LINEAR - 双线性插值(默认时使用)
(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,则绕x轴和y轴翻转。 说明:函数cvFlip以下面三种方式之一翻转数组(行和列下标是以0为基点的): if flip_mode = 0,则dst(i,j)=src(rows(src)-i-1,j),绕x轴旋转 if flip_mode > 0,则dst(i,j)=src(i,cols(src1)-j-1),绕y轴旋转
if flip_mode < 0,则dst(i,j)=src(rows(src)-i-1,cols(src)-j-1),绕x轴和y轴旋转
24
数字图像处理实验教程 V3.1
实验4 图像灰度变换(综合性,3.1节)
1. 实验目的
(1) 了解空域图像增强的概念与分类。 (2) 掌握不同的灰度变换方法。 (3) 能设计相应代码实现灰度变换。 2. 实验内容
编写程序用OpenCV实现对图像的各种灰度变换。需要实现的功能有:对比度增强;图像求反;动态范围压缩;灰度切分。 3. 实验步骤(综合性实验)
(1) 创建控制台项目,添加源文件imadjust.cpp。
(2) 编写程序代码,使程序可以对图像进行对比度增强。 (3) 编译连接,运行该文件,做出实验结果一。
(4) 改写程序代码,使程序可以对图像求反,做出实验结果二。 (5) 改写程序代码,使程序可以对动态范围压缩,做出实验结果三。 (6) 改写程序代码,使程序可以对灰度切分,做出实验结果四。 4. 实验回答问题
(1) 如何获取一幅图像中某个像素点的灰度值?
val= (uchar) src->imageData [ src->widthStep*y + x]; //得到该像素点的灰度值 (2) 如何给目标图像中的像素点重新赋灰度值? dst->imageData[ dst->widthStep*y + x] = val;//对像素点重新赋灰度值
(3) 如何修改程序,使得图像能够对彩色图像(三通道)进行幅值的映射? 5. 练习
【基础练习】根据例程,自己编写实验步骤中所提到的四种灰度变换功能。 【扩展练习】
(1) 试着不用例程的指导,自己独立编写实验步骤中所提到的四种灰度变换功
能,要求程序清晰,无冗余代码。
(2) 给定一个灰度映射函数曲线,要求编程实现指定图像的灰度映射,并显示
原图像和目标图像。
(3) 对两幅尺寸均为M*N的图像,通过获取各对应像素的灰度值进行图像相
加,显示叠加后的图像。 【高层进阶】
(1) 修改程序,实现对彩色图像三通道幅值的变换。 (2) 实现尺寸相同的彩色图像相加功能。 6. 实验报告要求
实验报告要求写明以下7方面内容: (1) 写明实验目的。
(2) 写明实验内容和步骤。
(3) 写出每种灰度变换的图像处理函数,并加详细的注释。 (4) 描绘并解释实验结果,并对实验结果进行分析。 (5) 写明实验中存在的不足,以及改进的方法。 (6) 回答实验中涉及到的问题。 (7) 写出本次实验的体会。
25
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库数字图像处理实验教程-V3.1-zsj(5)在线全文阅读。
相关推荐: