为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

图像旋转与缩放h

2017-10-08 9页 doc 36KB 19阅读

用户头像

is_215732

暂无简介

举报
图像旋转与缩放h图像旋转与缩放h 图像旋转与缩放 目 的:了解图像旋转和缩放的方法和步骤。掌握某些重要参数 的选择以及选择后产生的不同结果的分析和比较。 实验要求:在VC++ 6.0的环境下,利用OpenCV编程实现 1、 GetRectSubPix 功能: 从图像中提取像素矩形,使用亚像素精度 格式: void cvGetRectSubPix( const CvArr* src, CvArr* dst, CvPoint2D32f center ); 参数: src:输入图像. dst:提取的矩形. center:提取...
图像旋转与缩放h
图像旋转与缩放h 图像旋转与缩放 目 的:了解图像旋转和缩放的方法和步骤。掌握某些重要参数 的选择以及选择后产生的不同结果的分析和比较。 实验:在VC++ 6.0的环境下,利用OpenCV编程实现 1、 GetRectSubPix 功能: 从图像中提取像素矩形,使用亚像素精度 格式: void cvGetRectSubPix( const CvArr* src, CvArr* dst, CvPoint2D32f center ); 参数: src:输入图像. dst:提取的矩形. center:提取的像素矩形的中心,浮点数坐标。中心必须位于图像内部. 说明: 函数 cvGetRectSubPix 从图像src中提取矩形: dst(x, y) = src(x + center.x - (width(dst)-1)*0.5, y + center.y - (height(dst)-1)*0.5) 其中非整数像素点坐标采用双线性差值提取。对多通道图像,每个通道独立单独完成提取。尽管函数要求矩形的中心一定要在输入图像之中,但是有可能出现矩形的一部分超出图像边界的情况,这时,该函数复制边界的模识(即使用与矩形相交的图像边界线段的像素来代替矩形超越部分的像素)。 2、 GetQuadrangleSubPix 功能: 提取像素四边形,使用亚像素精度 格式: void cvGetQuadrangleSubPix( const CvArr* src, CvArr* dst, const CvMat* map_matrix, ); 参数: src:输入图像. dst:提取的四边形. map_matrix: 2 ×3变换矩阵 [A|b] (见说明). 说明: 函数 cvGetQuadrangleSubPix 以亚像素精度从图像 src 中提取四边形,使用亚像素精度,并且将结果存储于 dst ,计算公式是: dst(x+width(dst)/2, y+height(dst)/2)= src( Ax+Ay+b, Ax+Ay+b), 1112121222其中 A和 b 均来自映射矩阵(即:A, b为几何形变参数)。映射矩阵为: AAb11121map_matrix= AAb21222 T其中在非整数坐标 A•(x,y)+b 的像素点值通过双线性变换得到。多通道图像的每一个通道都单独计算. 例子:使用 cvGetQuadrangleSubPix 进行图像旋转 #include "cv.h" #include "highgui.h" #include "math.h" int main( int argc, char** argv ) { IplImage* src; /* the first command line parameter must be image file name */ if( argc==2 && (src = cvLoadImage(argv[1], -1))!=0) { IplImage* dst = cvCloneImage( src ); int delta = 1; int angle = 0; cvNamedWindow( "src", 1 ); cvShowImage( "src", src ); for(;;) { float m[6]; double factor = (cos(angle*CV_PI/180.) + 1.1)*3; CvMat M = cvMat( 2, 3, CV_32F, m ); int w = src->width; int h = src->height; m[0] = (float)(factor*cos(-angle*2*CV_PI/180.)); m[1] = (float)(factor*sin(-angle*2*CV_PI/180.)); m[2] = w*0.5f; m[3] = -m[1]; m[4] = m[0]; m[5] = h*0.5f; cvGetQuadrangleSubPix( src, dst, &M, 1, cvScalarAll(0)); cvNamedWindow( "dst", 1 ); cvShowImage( "dst", dst ); if( cvWaitKey(5) == 27 ) break; angle = (angle + delta) % 360; } } return 0; } 3、 Resize 功能: 图像大小变换 格式: void cvResize( const CvArr* src, CvArr* dst, int interpolation=CV_INTER_LINEAR ); 参数: src:输入图像. dst:输出图像. interpolation:差值方法: , CV_INTER_NN - 最近邻差值, , CV_INTER_LINEAR - 双线性差值 (缺省使用) , CV_INTER_AREA - 使用像素关系重采样。当图像缩小时候,该方法可以避免波纹出现。当图像放大时,类似于 CV_INTER_NN 方法.. , CV_INTER_CUBIC - 立方差值. 说明: 函数 cvResize 将图像 src 改变尺寸得到与 dst 同样大小。若设定 ROI,函数将按常规支持 ROI. 4、 WarpAffine 功能: 对图像做仿射变换 格式: void cvWarpAffine( const CvArr* src, CvArr* dst, const CvMat* map_matrix, int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS, CvScalar fillval=cvScalarAll(0) ); 参数: src:输入图像. dst:输出图像. map_matrix:2×3 变换矩阵 flags:插值方法和以下开关选项的组合: , CV_WARP_FILL_OUTLIERS - 填充所有缩小图像的像素。如果部分像素落在输入图像的边界外,那么它们的值设定为 fillval. , CV_WARP_INVERSE_MAP - 指定 matrix 是输出图像到输入图像的反变换,因此可以直接用来做像素差值。否则, 函数从 map_matrix 得到反变换。 fillval:用来填充边界外面的值 说明: 函数 cvWarpAffine 利用下面指定的矩阵变换输入图像: ''dstxysrcxy(,)(,), ',,,xx,, ,,,,,tyCVWARPIVERSEMAP'map_matrixy,___,未设置,,,,, ,,,,,,,11,,,,,, ,',,xx,,,,,,,,',,tyy,map_matrix,其它,,,,,,,,11,,,,,,,, 函数与 cvGetQuadrangleSubPix 类似,但是不完全相同。 cvWarpAffine 要求输入和输出图像具有同样的数据类型,有更大的资源开销(因此对小图像不太合适)而且输出图像的部分可以保留不变。而 cvGetQuadrangleSubPix 可以精确地从8位图像中提取四边形到浮点数缓存区中,具有比较小的系统开销,而且总是全部改变输出图像的内容。 要变换稀疏矩阵,使用 cxcore 中的函数 cvTransform 。 仿射变换的功能是从二维坐标到二维坐标之间的线性变换,且保持二维图像的“平直性”和“平行性”。仿射变换可以通过一系列子变换复合来实现,包括平移、旋转、缩放、剪切和翻转。 这类变换可以用一个3×3的矩阵来示,其最后以行为(0,0,1)。该变换矩阵将原坐标(x,y)变换为新坐标(x’,y’),这里,原坐标和新坐标皆视为最末一行为1的三维列向量,原列向量左乘变换矩阵得到新的列向量 ',,xmmmxmxmym,,,,,,,,000102000102,,,,,,,,',,ymmmymxmym,,,,101112101112,,,,,,,, ,,,,,,100111,,,,,,,,,, 下面给出一些典型的仿射变换: 1)平移变换 将每一点移动到(x+t,y+t),变换矩阵为 xy ,,10tx,, 01ty,, ,,001,, 2)缩放变换 将每一点的横坐标放大(缩小)至s倍,纵坐标放大(缩小)x至s倍,变换矩阵为 y ,,s00x,,00s y,, ,,001,, 3)剪切变换 变换矩阵为 ,,10shx,,sh10 y,, ,,001,, 相当于一个横向剪切一个纵向剪切的复合,即 10sh,,,,100x ,,,,010sh10 y,,,, ,,,,001,,001,,4)旋转变换原点 目标图形围绕原点顺时针旋转多少弧度,变换矩阵为 cossin0,,,, ,,,sincos0,, ,, ,,001,, 5)旋转变换 目标图形以(x,y)为轴心顺时针旋转多少弧度,变换矩阵为 cossincossin,,,,xxy,,,, ,,,,,sincossincosyxy,,,, ,, ,,001,, 相当于两次平移变换与一次原点旋转变换的复合,即 10cossin010,,xx,,,,,,,, ,,,,,,00sincos000,yy,, ,,,,,, ,,,,,,001001001,,,,,, 5、 2DRotationMatrix 功能: 计算二维旋转的仿射变换矩阵 格式: CvMat* cv2DRotationMatrix( CvPoint2D32f center, double angle, double scale, CvMat* map_matrix ); 参数: 输入图像的旋转中心坐标 center: angle:旋转角度(度)。正值表示逆时针旋转(坐标原点假设在左上角). scale:各项同性的尺度因子 map_matrix:输出 2×3 矩阵的指针 说明: 函数 cv2DRotationMatrix 计算矩阵: ,,,,()1..,,centerxcentery,, ,,,,,centerxcentery.(1).,,,,,, 其中,=scalecos(angle),=scalesin(angle),, 该变换映射旋转中心到坐标原点,如果不是此目的,则可以通过调整平移量改变其坐标(通过简单的推导可知,仿射变换的实现是首先将旋转中心置为坐标原点,再进行旋转和尺度变换,最后重新将坐标原点设定为输入图像的左上角,这里的平移量是center.x, center.y). 8、 WarpPerspective 功能: 对图像进行透视变换 格式: void cvWarpPerspective( const CvArr* src, CvArr* dst, const CvMat* map_matrix, int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS, CvScalar fillval=cvScalarAll(0) ); 参数: src:输入图像. dst:输出图像. map_matrix:3×3 变换矩阵 flags:插值方法和以下开关选项的组合: , CV_WARP_FILL_OUTLIERS - 填充所有缩小图像的像素。如果部分像素落在输入图像的边界外,那么它们的值设定为 fillval. , CV_WARP_INVERSE_MAP - 指定 matrix 是输出图像到输入图像的反变换,因此可以直接用来做像素差值。否则, 函数从 map_matrix 得到反变换。 fillval:用来填充边界外面的值 说明: 函数 cvWarpPerspective 利用下面指定矩阵变换输入图像: ''dstxysrcxy(,)(,), ',,,xx,,,,,,, tyCVWARPIVERSEMAP'map_matrixy,___,未设置,,,,,,,,,,,,11,,,,,,,',,xx,,,,,,,,',,tyy,map_matrix,其它,,,,,,,,11,,,,,,,,
/
本文档为【图像旋转与缩放h】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索