搜档网
当前位置:搜档网 › 二维图形的几何变换

二维图形的几何变换

二维图形的几何变换
二维图形的几何变换

XX大学计算机科学与技术学院

计算机科学与技术系上机实验报告

课程名称:计算机图形学班级:实验日期:2012-04-05 姓名:学号:指导教师:

实验序号:3 实验成绩:

一、实验名称

二维图形的几何变换

二、实验目的及要求

目的:

掌握二维图形的基本几何变换:位置改变(平移、旋转)

要求:

1. 实现二维图形的集合变换。

2. 书写实验报告。

三、实验环境

1.Win 7

2.Visual Studio 2010

四、实验原理

1.平移变换

平移变换将一点P沿直线路径从一个坐标集团移动到另一个坐标位置的一个重定位过程。如果点p1(x1,y1.z1)是由点p(x,y,z)在x轴,y轴和z轴分别移动tx,ty,tz距离得到的,则这两点坐标间的关系为

X1=x+tx, y1=y+ty,z1=z+tz

该式的矢量形式为:p1=p+T

其中,p1,p,T分别定义为发下向量:

P1=[x1,y1,z1 ] p=[x,y,z] T=[tx,ty,tz]

2.二维图形变换主要是基于齐次坐标方程,通过一些简单的矩阵运算来实现:

二维齐次坐标变换的矩阵形式是:

i

h

g

f e d c b a

矩阵的每个元素都有特殊含义.基中

e

d

b a

可以对图形进行缩放,旋转,对称,错切等变

换;f

c

是对图形进行平移变换;

h

g 的对图形作投影变换;i

则是对图形整体进行缩放变

换.

例如:将一个图形在X 方向中平移tx 个单位,在Y 方向平移ty 个单位.其实现过程如下:

??

???

?????=??????????++=????????????????????=??????????1),(1110

1001111y x ty tx T ty y tx x y x ty tx y x

其中:x1,y1是变换后的坐标,x,y 是变换前的坐标,通过上述变换,(x,y)被平移了

P(tx,ty).

在二维平面上任何复杂的变换都可以通过上述基本变换的组合来实现.级合方式在计算机上主要体现在矩阵的乘法运算,即将各个简单变换的矩阵逆序相乘,就可以得到一个总的变换矩阵.利用这个总的变换矩阵就可以对图形进行复合变换.

五、实验步骤及算法描述 题目:

1.设有一三角形ABC,其中三个顶点为A(5,10),B(1,2),C(8,5),如三角形的顶点A 不变,将AB 和AC 边缩小一倍后,求缩小后的三角形对于直线-2x+4y+3=0的对称变换后的结果图。

2.将一四边形以原点为中心,以15°为间隔旋转

实验步骤及算法描述:

1. 依据算法、步骤编写源程序;

2. 编辑源程序并进行调试;

3. 进行运行测试,并结合情况进行调整;

4. 对运行结果进行保存与分析;

5. 打印源程序或把源程序以文件的形式提交;

6. 按格式书写实验报告。

六、调试过程及实验结果程序运行截图:

画三角形

以A为顶点,各边缩小一半

关于X轴对称

七、总结

通过这次实验,我对于图形的二位变换过程有了更深刻的认识,同时对于各种图形的生成算法和思想也有了很好的理解,但是在程序的执行过程中遇到了很多的问题,但是最终都还是解决了,还有就是粗心大意,通过这次实验,我对图形学又有了更深的认识和了解。

八、附录

核心代码:

class CMyDlg : public CDialog

{

public:

double xy[4][2];

void Point();//图形顶点

void duichen();对称变换

}

BOOL CMyDlg::OnInitDialog()

{

// TODO: Add extra initialization here //顶点A

xy[0][0]=60;

xy[0][1]=100;

//顶点B

xy[1][0]=10;

xy[1][1]=20;

//顶点C

xy[2][0]=80;

xy[2][1]=50;

//顶点D

xy[3][0]=120;

xy[3][1]=100; }

void CMyDlg::OnPaint()

{

CWnd* pWnd=GetDlgItem(IDC_STATIC);

CDC* pDC=pWnd->GetDC();

pDC->SetViewportOrg(200,160);

pDC->MoveTo(0,-150);//控制纵向坐标

pDC->LineTo(0,200);

pDC->MoveTo(-200,0);//控制横向坐标

pDC->LineTo(180,0);

}

void CMyDlg::OnRadio1()

{

// TODO: Add your control notification handler code here step=1;

}

void CMyDlg::OnRadio2()

{

// TODO: Add your control notification handler code here step=2;

}

void CMyDlg::OnCreate()

{

// TODO: Add your control notification handler code here CMyDlg::Point();

}

void CMyDlg::OnPrint()

{

// TODO: Add your control notification handler code here xy[1][0]=xy[1][0]-(xy[1][0]-xy[0][0])/2.0;

xy[1][1]=xy[1][1]-(xy[1][1]-xy[0][1])/2.0;

xy[2][0]=xy[2][0]-(xy[2][0]-xy[0][0])/2.0;

xy[2][1]=xy[2][1]-(xy[2][1]-xy[0][1])/2.0;

CMyDlg::Point();

}

void CMyDlg::OnOK() //旋转函数

{

// TODO: Add extra validation here

double r;//旋转15度

r=15/180.0*3.1415926;

for(int i=0;i<4;i++){

xy[i][0]=xy[i][0]*cos(r)-xy[i][1]*sin(r);

xy[i][1]=xy[i][0]*sin(r)+xy[i][1]*cos(r);

}

CMyDlg::Point();

}

void CMyDlg::OnButton3()

{

// TODO: Add your control notification handler code here CMyDlg::duichen();

}

void CMyDlg::Point()

{

CWnd* pWnd=GetDlgItem(IDC_STATIC);

CDC* pDC=pWnd->GetDC();

//画图形边界

if(step==1){

for(int i=0;i<2;i++)

{

pDC->MoveTo(xy[i][0]+200,xy[i][1]+160);

pDC->LineTo(xy[i+1][0]+200,xy[i+1][1]+160);

}

pDC->MoveTo(xy[i][0]+200,xy[i][1]+160);

pDC->LineTo(xy[0][0]+200,xy[0][1]+160);

}

if(step==2){

for(int i=0;i<3;i++)

{

pDC->MoveTo(xy[i][0]+200,xy[i][1]+160);

pDC->LineTo(xy[i+1][0]+200,xy[i+1][1]+160);

}

pDC->MoveTo(xy[i][0]+200,xy[i][1]+160);

pDC->LineTo(xy[0][0]+200,xy[0][1]+160);

}

}

void CMyDlg::duichen()//对称变换函数

{

//求缩小后的三角形对于直线-2x+4y+3=0的对称变换后的结果图。

double xy1[2][2],x1,y1;

xy1[0][1]=-80;

xy1[1][0]=100;

//如果x=100时

xy1[1][1]=(-3+2*100)/4.0;

//如果y=-80时

xy1[0][0]=(3+(-80)*4)/2.0;

CWnd* pWnd=GetDlgItem(IDC_STATIC);

CDC* pDC=pWnd->GetDC();

pDC->MoveTo(xy1[0][0]+200,xy1[0][1]+160);//画对称轴

pDC->LineTo(xy1[1][0]+200,xy1[1][1]+160);

//对称变换,利用斜率特性,若两直线垂直,则k1=-1/k2 //只针对三角形

for(int i=0;i<3;i++){

x1=(xy[i][1]+2*xy[i][0]+0.75)/2.5;

y1=(xy[i][1]+2*xy[i][0]-3)/5.0;

xy[i][0]=x1+(x1-xy[i][0]);

xy[i][1]=y1-(xy[i][1]-y1);

}

CMyDlg::Point();

}

二维几何图形变换.

// 二维几何图形变换.cpp : 定义应用程序的类行为。 // #include "stdafx.h" #include "二维几何图形变换.h" #include "MainFrm.h" #include "二维几何图形变换Doc.h" #include "二维几何图形变换View.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CMyApp BEGIN_MESSAGE_MAP(CMyApp, CWinApp) ON_COMMAND(ID_APP_ABOUT, OnAppAbout) // 基于文件的标准文档命令 ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew) ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen) // 标准打印设置命令 ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup) END_MESSAGE_MAP() // CMyApp 构造 CMyApp::CMyApp() { // TODO: 在此处添加构造代码, // 将所有重要的初始化放置在InitInstance 中 } // 唯一的一个CMyApp 对象 CMyApp theApp; // CMyApp 初始化 BOOL CMyApp::InitInstance() {

// 如果一个运行在Windows XP 上的应用程序清单指定要 // 使用ComCtl32.dll 版本6 或更高版本来启用可视化方式, //则需要InitCommonControls()。否则,将无法创建窗口。 InitCommonControls(); CWinApp::InitInstance(); // 初始化OLE 库 if (!AfxOleInit()) { AfxMessageBox(IDP_OLE_INIT_FAILED); return FALSE; } AfxEnableControlContainer(); // 标准初始化 // 如果未使用这些功能并希望减小 // 最终可执行文件的大小,则应移除下列 // 不需要的特定初始化例程 // 更改用于存储设置的注册表项 // TODO: 应适当修改该字符串, // 例如修改为公司或组织名 SetRegistryKey(_T("应用程序向导生成的本地应用程序")); LoadStdProfileSettings(4); // 加载标准INI 文件选项(包括MRU) // 注册应用程序的文档模板。文档模板 // 将用作文档、框架窗口和视图之间的连接 CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CMyDoc), RUNTIME_CLASS(CMainFrame), // 主SDI 框架窗口 RUNTIME_CLASS(CMyView)); if (!pDocTemplate) return FALSE; AddDocTemplate(pDocTemplate); // 分析标准外壳命令、DDE、打开文件操作的命令行 CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); // 调度在命令行中指定的命令。如果 // 用/RegServer、/Register、/Unregserver 或/Unregister 启动应用程序,则返回FALSE。if (!ProcessShellCommand(cmdInfo)) return FALSE; // 唯一的一个窗口已初始化,因此显示它并对其进行更新 m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow();

图像的几何变换的两种实现(旋转、平移、放大、缩小)

面向对象程序设计 学号:2 学生所在学院:信息工程学院 学生姓名:邵丽群 任课教师:熊邦书 教师所在学院:信息工程学院

2013级 实现图像的几何变换 电子信息工程 信息工程学院 摘要:几何变换是最常见的图像处理手段,通过对变形的图像进行几何校正,可以得出准确的图像。常用的几何变换功能包括图像的平移、图像的镜像变换、图像的转置、图像的缩放、图像的旋转等等。目前数字图像处理的应用越来越广泛,已经渗透到工业、航空航天、军事等各个领域,在国民经济中发挥越来越大的作用。作为数字图像处理的一个重要部分,本文接受的工作是如何Visual C++编程工具设计一个完整的应用程序,实现经典的图像几何变换功能。程序大概分为两大部分:读写BMP图像,和数字图像的几何变换。即首先用Visual C++创建一个单文档应用程序框架,在实现任意BMP图像的读写,打印,以及剪贴板操作的基础上,完成经典的图像几何变换功能。图像几何变换的Visual C++编程实现,为校内课题的实现提供了一个实例。 关键字:图像处理;几何变换(图像的平移、缩放、转置、旋转和镜像变换);BMP图像;Visual C++

一、引言 图像几何变换是指用数学建模的方法来描述图像位置、大小、形状等变化的方法。在实际场景拍摄到的一幅图像,如果画面过大或过小,都需要进行缩小或放大。如果拍摄时景物与摄像头不成相互平行关系的时候,会发生一些几何畸变,例如会把一个正方形拍摄成一个梯形等。这就需要进行一定的畸变校正。在进行目标物的匹配时,需要对图像进行旋转、平移等处理。在进行三维景物显示时,需要进行三维到二维平面的投影建模。因此,图像几何变换是图像处理及分析的基础。 图像几何变换是计算机图像处理领域中的一个重要组成部分,也是值得深讨的一个重要课题。在图像几何变换中主要包括图像的放缩、图像的旋转、图像的移动、图像的镜像、图像的块操作等内容,几何变换不改变图像的像素值,只改变像素所在的几何位置。从广义上说,图像是自然界景物的客观反映,是人类认识世界和人类本身的重要源泉。图像对我们并不陌生。我们生活在一个信息时代,科学研究和统计表明,人类从外界获得的信息约有75%来自视觉系统,也就是从图像中获得的。所以对数字图像的处理便显得尤为重要了。 本文主要深讨了图像的几何变换(主要包括图像的平移、转置、缩放、旋转、镜像等)理论,并在此基础上用Visual C++实现的过程。 1.3.2研究方法 方法一: 利用Windows 本身就提供了一个API函数SetWorldTransForm来实现图片旋转、位移及其他变形,这个函数是对一个设备上下文DC进行操作,通过坐标转换来实现各种功能的。 方法二: 通过图像进行平移、旋转、转置、镜像、缩放后重新计算各点新像素完成几何变换。自定义一个图像处理的Cdibapi类,把一般处理图像时要用到的函数实现封装在这个类中,该类用于实现DIB对象的绘制,DIB对象调色板的创建,DIB对象的读取与存储,图像线性变换,图像灰度拉伸等。然后把在视类中实现图像平移,图像镜像,图像转置,图像缩放及图像旋转的函数调用和实现。

mfc空间几何变换之图像平移、镜像、旋转、缩放详解

MFC空间几何变换之图像平移、镜像、旋转、缩放详解 一. 图像平移 前一篇文章讲述了图像点运算(基于像素的图像变换),这篇文章讲述的是图像几何变换:在不改变图像容的情况下对图像像素进行空间几何变换的处理方式。 点运算对单幅图像做处理,不改变像素的空间位置;代数运算对多幅图像做处理,也不改变像素的空间位置;几何运算对单幅图像做处理,改变像素的空间位置,几何运算包括两个独立的算法:空间变换算法和灰度级插值算法。 空间变换操作包括简单空间变换、多项式卷绕和几何校正、控制栅格插值和图像卷绕,这里主要讲述简单的空间变换,如图像平移、镜像、缩放和旋转。主要是通过线性代数中的齐次坐标变换。 图像平移坐标变换如下: 运行效果如下图所示,其中BMP图片(0,0)像素点为左下角。

其代码核心算法: 1.在对话框中输入平移坐标(x,y) m_xPY=x,m_yPY=y 2.定义Place=dlg.m_yPY*m_nWidth*3 表示当前m_yPY行需要填充为黑色 3.新建一个像素矩阵ImageSize=new unsigned char[m_nImage] 4.循环整个像素矩阵处理 for(int i=0 ; i=Place && countWidth=Place && countWidth>=dlg.m_xPY*3) {//图像像素平移区域 ImageSize[i]=m_pImage[m_pImagePlace];//原(0,0)像素赋值过去 m_pImagePlace++;countWidth++; if(countWidth==m_nWidth*3) {//一行填满m_pImagePlace走到(0,1) number++;m_pImagePlace=number*m_nWidth*3; } } } 5.写文件绘图fwrite(ImageSize,m_nImage,1,fpw) 第一步:在ResourceView资源视图中,添加Menu子菜单如下:(注意ID号) 第二步:设置平移对话框。将试图切换到ResourceView界面--选中Dialog,右键鼠标新建一个Dialog,并新建一个名为IDD_DIALOG_PY。编辑框(X)IDC_EDIT_PYX 和(Y)IDC_EDIT_PYY,确定为默认按钮。设置成下图对话框:

二维几何变换代码-MATLAB

二、二维几何变换 %c6_Test.m文件,这是主文件 clearall; clc; %Main(); Menu(); %Menu.m文件,主界面函数 % function Menu() %程序主界面函数 %初始化图形数据矩阵为空 Figure=[]; setappdata(0,'FigureData',Figure); %主界面布局 leftbase=10; bottombase=-50; scrsz = get(0,'ScreenSize'); figure('Position',[scrsz(3)/3 scrsz(4)/6scrsz(3)/3 scrsz(4)*2/3]); %figure(); uicontrol('Style','pushbutton','string','查看原图','position',[150+leftba se 500+bottombase 100 50],... 'callback','show_callback'); uicontrol('Style','pushbutton','string','导入图形','Position',[150+leftbase 430+bottombase10050],... 'Callback','input_callback'); uicontrol('Style','pushbutton','string','平移变换','Position',[150+leftbase 360+bottombase10050],... 'Callback','translation_callback'); uicontrol('Style','pushbutton','string','比例变换','Position',[150+leftbase290+b ottombase100 50],... 'Callback','proportion_callback'); uicontrol('Style','pushbutton','string','旋转变换','Position',[150+leftbase 220+bottombase 10050],... 'Callback','rotation_callback'); uicontrol('Style','pushbutton','string','错切变换','Position',[150+leftb ase 150+bottombase100 50],... 'Callback','shear_callback'); uicontrol('Style','popup','string','关于x轴对称|关于y轴对称|关于原点对称|关于y=x对称|关于y=-x对称',... 'Position',[150+leftbase80+bottombase10050],'callback',@mirror _callback); %set(duichen,'Callback',{@mirror_callback,duichen});

二维图形基本变换规则及应用

二维图形基本变换规则及应用 (07级信息与计算科学傅强070350221) 摘要 利用计算机绘制的图形与我们日常见到的图片、照片是有相似之处。除图片、照片等图形外,自然界中还存在丰富多彩的有形物体。一般,根据图形所在空间的不同,可将图形分为:三维图形和二维图形。图片、照片属二维图形,自然界中形形色色的物体属于三维图形。在计算机绘图的过程中,二维图形的绘制是绘制三维图形的基础,研究计算机图形的生成必须从研究二维图形开始。计算机绘制图形时,无论图形多么复杂,都是利用一些相应图形基元经过图形变换组成的。在计算机绘图中,经常用到图形变换,图形变换是指图形信息经过几何变换后产生新的图形。基本的几何变换研究物体坐标在直角坐标系内的平移、旋转和变比等规则。本文主要介绍二维图形的一些基本变换规则及其应用 关键词:直角坐标系内;平移;旋转;应用 ABSTRACT Using the computer graphics and see our daily drawings, photographs are similarities. Besides the drawings, photographs and other graphic, nature also exist rich and colorful tangible objects. In general, according to the different space, the graphics can be divided into: 3d graphics and 2d graphics. The drawings, photographs of 2d graphics, all kinds of objects in the nature belongs to 3d graphics. In computer graphics, the process of 2d graphics rendering 3d graphics drawing is the basis, research of computer graphics generation must start from the 2d graphics. Computer graphics, no matter how complex, graphics are using some corresponding graphic element composed by graphical transformation. In computer graphics, often use graphics transformation, graphics transform refers to the graphical information through after new graphics geometry transform. The basic research object coordinate geometry transform in cartesian coordinate system in translation, rotation and change rules than etc. This paper mainly introduces some basic transformation of 2d graphics and its application in the rules. Keywords: a cartesian coordinate system, Translation, Rotating, application

图像几何变换

图像几何变换 一、实验目的 (1)学习几种常见的图像几何变换,并通过实验体会几何变换的效果; (2)掌握图像平移、剪切、缩放、旋转、镜像、错切等几何变换的算法原理及编 程实现 (3)掌握matlab编程环境中基本的图像处理函数 (4)掌握图像的复合变换 二、涉及知识点 (1)图像几何变换不改变图像像素的值,只改变像素所在的几何位置 (2)图像裁剪imcrop函数,语法格式为: B=imcrop(A);交互式用鼠标选取区域进行剪切 B=imcrop(A,[left top right bottom]);针对指定的区域[left top right bottom]进行剪切 (3)图像缩放imresize函数,语法格式为: B = imresize(A,m,method) 这里参数method用于指定插值的方法,可选用的值为'nearest'(最邻近法),'bilinear'(双线性插值),'bicubic'(双三次插值),默认为'nearest'。 B = imresize(A,m,method)返回原图A的m倍放大的图像(m小于1时效果是 缩小)。 (4)图像旋转imrotate函数,语法格式为: B = imrot ate(A,angle,’crop’),参数crop用于指定裁剪旋转后超出图像的部分。 三、实验内容 (1)将图像hehua.bmp裁剪成200X200大小,并保存 (2)制作动画,将一幅图像逐渐向左上角平移移出图像区域,空白的地方用白色 填充 (3)利用剪切图像函数制作动画 (4)将图像分别放大1.5倍和缩小0.8倍,插值方法使用最近邻域法和双线性插 值法,对比显示图像。 (5)将图像水平镜像,再顺时针旋转45度,显示旋转后的图像。 (6)将图像分别进行水平方向30度错切,垂直方向45度错切,分别显示结果 具体实现: 1.将图像hehua.bmp裁剪成200X200大小,并保存 I=imread('hehua.bmp'); n=size(I); figure; subplot(1,2,1); imshow(I); title('原图'); I=double(I);

计算机图形学图形的几何变换的实现算法

实验二 图形的几何变换的实现算法 班级 08信计 学号 59 姓名 分数 一、实验目的和要求: 1、掌握而为图形的基本几何变换,如平移,旋转,缩放,对称,错切变换;。 2、掌握OpenGL 中模型变换函数,实现简单的动画技术。 3、学习使用OpenGL 生成基本图形。 4、巩固所学理论知识,加深对二维变换的理解,加深理解利用变换矩阵可由简单图形得到复杂图形。加深对变换矩阵算法的理解。 编制利用旋转变换绘制齿轮的程序。编程实现变换矩阵算法,绘制给出形体的三视图。调试程序及分析运行结果。要求每位学生独立完成该实验,并上传实验报告。 二、实验原理和内容: . 原理: 图像的几何变换包括:图像的空间平移、比例缩放、旋转、仿射变换和图像插值。 图像几何变换的实质:改变像素的空间位置,估算新空间位置上的像素值。 图像几何变换的一般表达式:[,][(,),(,)]u v X x y Y x y = ,其中,[,]u v 为变换后图像像素的笛卡尔坐标, [,]x y 为原始图像中像素的笛卡尔坐标。这样就得到了原始图像与变换后图像的像素的对应关系。 平移变换:若图像像素点 (,)x y 平移到 00(,)x x y y ++,则变换函数为 0(,)u X x y x x ==+, 0(,)v Y x y y y ==+,写成矩阵表达式为: 00x u x y v y ??????=+???????????? 其中,x 0和y 0分别为x 和y 的坐标平移量。 比例缩放:若图像坐标 (,)x y 缩放到( ,x y s s )倍,则变换函数为: 00x y s u x s v y ??????=?????????? ?? 其中, ,x y s s 分别为x 和y 坐标的缩放因子,其大于1表示放大,小于1表示缩小。 旋转变换:将输入图像绕笛卡尔坐标系的原点逆时针旋转θ角度,则变换后图像坐标为: cos sin sin cos u x v y θ-θ??????=??????θθ?????? 内容: 1、对一个三角形分别实现平移,缩放旋转等变化。

实验二维图形基本变换

实验一二维图形的基本变换 一.实验目的 1、掌握CAD图形处理的原理和方法; 2、通过上机操作,熟悉多边形的平移、比例和旋转变换,掌握二维图形的基本变换。 3、理解CAD对图形进行复合变换(平移、比例和旋转变换)的过程。 二.实验要求 1、上机调试所编程序,实现图形的绘制、平移变换、比例变换和旋转变换。 2、二维图形各点的坐标、平移、比例、旋转角度可由用户任意输入,原图形和变换后的图形必须同时显示在显示器上。 三.实验设备 1、计算机系统; 2、安装Turbo C或其他C语言集成开发工具 四.实验原理 在计算机图形处理中,经常需要对已经生成的图形进行几何变换处理。例如,改变原始图形的大小、移动图形到某一指定位置或根据需要将图形旋转某一个角度,这就要求图形的处理软件能够实现缩放、平移、旋转等几何变换。由于点是构成一个几何形体的最基本的元素,而一幅二维图形可以看成是一个点集,如三角形有三个特征

点……,因此,我们就可以把对图形的几何变换归结对点的变换。通过对构成几何图形的特征点集的几何变换即可实现整个图形的几何变换。即如何实现一个旧点到变化后新点的计算求解是本次实验的重点。 我们给出平移、比例、旋转变换的矩阵分别为: 平 移: T t =???? ??????1010001n m (m,n 分别为x,y 方向上的平移量) 全比例: T s =???? ??????1000000b a (a,b 分别为x,y 方向上的比例因子) 旋 转: T r =???? ??????-1000cos sin 0sin cos θθθθ (θ为旋转角,逆时针为正) 假设一几何图形由A(x A,y A ) B(x B ,y B ) C(x C ,y C ) D(x D ,y D )四点组成,那么变换后四点坐标为A ’(x ’A,y ’A ) B ’(x ’B ,y ’B ) C ’(x ’C ,y ’C ) D ’(x ’D ,y ’D ) 平移:??????????????1111''''''''D D C C B B A A Y X Y X Y X Y X =???????? ??????1111D D C C B B A A Y X Y X Y X Y X T t =??????????????1111D D C C B B A A Y X Y X Y X Y X ??????????1010001n m =?????? ????????++++++++1111n Y m X n Y m X n Y m X n Y m X D D C C B B A A 比例:??????????????1111''''''''D D C C B B A A Y X Y X Y X Y X =??????????????1111D D C C B B A A Y X Y X Y X Y X T s =??????????????1111D D C C B B A A Y X Y X Y X Y X ??????????1000000b a =?????? ????????1111D D C C B B B A bY aX bY aX bY aX bY aX

图像的几何变换

1实验目的、要求 实验目的: (1)掌握图像在空间域进行基本变换的原理与相关方法。 (2)能使用VC++实现图像平移变换、镜像变换、旋转变换、缩放变换的功能。 实验要求: A部分: (1)使用VC++设计程序:实现图像平移变换,图像缩放、图像裁剪、图像对角线镜像。 (2)使用VC++设计程序:对一幅高度与宽度均相等的图像,实现逆时针90度旋转。B部分: (1)包括A部分全部要求。 (2)使用VC++设计程序:对任意一幅图像(高度与宽度可以不相等),实现任意角度的旋转。 (3)研究放大图像时使用的插值算法,使用VC++实现常见的三种图像插值算法:最近邻插值,双线性插值,立方卷积插值。通过实验验证其效果。 2实验原理 图像的平移:通过直角坐标系的平移变换公式: x ‘ = x +dx y’ = y + dy 注:(x,y)为源图像的坐标,(x’, y’)为新图像的坐标,dx对应x的偏移量,dy对应y的偏移量。即:平移之后新图像上坐标为(x’, y’)的像素点的颜色值,应该等于原图像上坐标为(x, y)的像素点的颜色值,以下类似。 图像的镜像:镜像分为水平镜像和垂直镜像 垂直镜像计算公式如下(图像大小为宽度为M,高度为N): x’ = x y’ = N – 1 – y 水平镜像计算公式为:

x’ = M – 1 – x y’ = y 对角线镜像(对角线为左上角至右下角)计算公式: x’ = M – 1 – x y’ = N – 1 – y 图像的旋转:图像的旋转计算公式如下: X’ = X *COS Q – Y *SIN Q Y’ = X *SIN Q + Y*COS Q 注:(x,y)为源图像的坐标,(x’, y’)为新图像的坐标。 图像缩放:设原图像大小为宽度M、高度N,调整后宽度为k1×M、高度为k2×N,则: Img.New(x,y) = Img.Old(x/k1, y/k2) 图像插值:当放大图像时,像素也相应地增加,增加的过程就是插值程序自动选择信息较好的像素作为增加的像素,而并非只使用临近的像素,所以在放大图像时,图像看上去会比较平滑、干净。常用插值算法包括: 最近邻插值:近邻取样插值的缩放算法,直接取Color0颜色作为缩放后点的颜色 双线性插值:需要考虑(Sx,Sy)坐标点周围4个颜色值Color0\Color1\Color2\Color3,把(Sx,Sy)到A\B\C\D坐标点的距离作为系数来把4个颜色混合出缩放后点的颜色立方卷积插值:考虑映射点周围16个点(4x4)的颜色来计算最终的混合颜色 3主要设备、器材 硬件环境:AMD A8-4500M 1.90G/4G RAM 软件环境:操作系统:WIN7 开发工具:Micrsoft Visual C++ 6.0 4实验步骤及原始数据记录 关键代码说明:

2二次函数图象的几何变换

一、二次函数图象的平移变换 (1)具体步骤: 先利用配方法把二次函数化成2 ()y a x h k =-+的形式,确定其顶点(,)h k ,然后做出二次函 数2y ax =的图像,将抛物线2 y ax =平移,使其顶点平移到(,)h k .具体平移方法如图所示: (2)平移规律:在原有函数的基础上“左加右减”. 二、二次函数图象的对称变换 二次函数图象的对称一般有五种情况,可以用一般式或顶点式表达 1. 关于x 轴对称 2 y a x b x c =++关于x 轴对称后,得到的解析式是2y ax bx c =---; ()2 y a x h k =-+关于x 轴对称后,得到的解析式是()2 y a x h k =---; 2. 关于y 轴对称 2 y a x b x c =++关于y 轴对称后,得到的解析式是2y ax bx c =-+; ()2 y a x h k =-+关于y 轴对称后,得到的解析式是()2 y a x h k =++; 3. 关于原点对称 2 y a x b x c =++关于原点对称后,得到的解析式是2y ax bx c =-+-; ()2 y a x h k =-+关于原点对称后,得到的解析式是 ()2 y a x h k =-+-; 4. 关于顶点对称 2 y a x b x c =++关于顶点对称后,得到的解析式是2 2 2b y ax bx c a =--+- ; ()2y a x h k =-+关于顶点对称后,得到的解析式是()2 y a x h k =--+. 5. 关于点()m n , 对称 ()2 y a x h k =-+关于点()m n ,对称后,得到的解析式是()2 22y a x h m n k =-+-+- 根据对称的性质,显然无论作何种对称变换,抛物线的形状一定不会发生变化,因此a 永远不变.求抛物线的对称抛物线的表达式时,可以依据题意或方便运算的原则,选择合适的形式,习惯上是先确定原抛物线(或表达式已知的抛物线)的顶点坐标及开口方向,再确定其对称抛物线的顶点坐标及开口方向,然后再写出其对称抛物线的表达式. 知识点拨 二次函数图象的几何变换

计算机图形学 二维变换 实验代码

#include "stdio.h" #include "conio.h" #include"graphics.h" #include "math.h" struct point { int x; int y; }triangle[3]; void ini() { triangle[0].x = 20; triangle[0].y = 70; triangle[1].x = 20; triangle[1].y = 100; triangle[2].x = 120; triangle[2].y = 70; setcolor(WHITE); line(triangle[0].x,triangle[0].y,triangle[1].x,triangle[1].y); line(triangle[0].x,triangle[0].y,triangle[2].x,triangle[2].y); line(triangle[1].x,triangle[1].y,triangle[2].x,triangle[2].y); } void move(int dx, int dy) { int i; for(i = 0; i < 3; i++) { line((triangle[i].x+dx),(triangle[i].y+dy),(triangle[(i+1)%3].x+dx),(triangle[(i+1)%3].y+dy)); } getch(); setcolor(0); for(i = 0; i < 3; i++) { line((triangle[i].x+dx),(triangle[i].y+dy),(triangle[(i+1)%3].x+dx),(triangle[(i+1)%3].y+dy)); } } void zoom(int sx,int sy) {

二维离散傅立叶变换

图像的二维离散傅立叶变换 一、实验目的 掌握图像的二维离散傅立叶变换以及性质 二、实验要求 1) 建立输入图像,在64?64的黑色图像矩阵的中心建立16?16的白色矩形图像点阵, 形成图像文件。对输入图像进行二维傅立叶变换,将原始图像及变换图像(三维、中心化)都显示于屏幕上。 2) 调整输入图像中白色矩形的位置,再进行变换,将原始图像及变换图像(三维、中 心化)都显示于屏幕上,比较变换结果。 3) 调整输入图像中白色矩形的尺寸(40?40,4?4),再进行变换,将原始图像及变 换图像(三维、中心化)都显示于屏幕上,比较变换结果。 三、实验仪器设备及软件 HP D538、MATLAB 四、实验原理 设),(y x f 是在空间域上等间隔采样得到的M ×N 的二维离散信号,x 和y 是离散实变量,u 和v 为离散频率变量,则二维离散傅里叶变换对一般地定义为 ∑∑-=-=+-=1010)],(2exp[),(1),(M x N y N yu M xu j y x f MN v u F π,1,0=u …,M-1;y=0,1,…N-1 ∑∑-=-=+=101 0)],( 2e x p [),(),(M x N y N uy M ux j v u F y x f π ,1,0=x …,M-1;y=0,1,…N-1 在图像处理中,有事为了讨论上的方便,取M=N ,这样二维离散傅里叶变换对就定义为,])(2exp[),(1),(1010∑∑-=-=+-=N x N y N yu xu j y x f N v u F π 1,0,=v u …,N-1 ,])(2exp[),(1),(1010∑∑-=-=+=N u N v N vy ux j v u F N y x f π 1,0,=y x ,…,N-1 其中,]/)(2exp[N yv xu j +-π是正变换核,]/)(2exp[N vy ux j +π是反变换核。 将二维离散傅里叶变换的频谱的平方定义为),(y x f 的功率谱,记为

matlab 图像几何变换+答案

实验四:图像几何变换(编程报告) 一、实验目的 (1)学习几种常见的图像几何变换,并通过实验体会几何变换的效果; (2)掌握图像平移、剪切、缩放、旋转、镜像、错切等几何变换的算法原理及编 程实现 (3)掌握matlab编程环境中基本的图像处理函数 (4)掌握图像的复合变换 二、涉及知识点 (1)图像几何变换不改变图像像素的值,只改变像素所在的几何位置 (2)图像裁剪imcrop函数,语法格式为: B=imcrop(A);交互式用鼠标选取区域进行剪切 B=imcrop(A,[left top right bottom]);针对指定的区域[left top right bottom]进行剪切 (3)图像缩放imresize函数,语法格式为: B = imresize(A,m,method) 这里参数method用于指定插值的方法,可选用的值为'nearest'(最邻近法),'bilinear'(双线性插值),'bicubic'(双三次插值),默认为'nearest'。 B = imresize(A,m,method)返回原图A的m倍放大的图像(m小于1时效果是 缩小)。 (4)图像旋转imrotate函数,语法格式为: B = imrotate(A,angle,’crop’),参数crop用于指定裁剪旋转后超出图像的部分。 三、实验内容 (1)将图像hehua.bmp裁剪成200X200大小 (2)制作动画,将一幅图像逐渐向左上角平移移出图像区域,空白的地方用白色 填充 (3)利用剪切图像函数制作动画 (4)将图像分别放大1.5倍和缩小0.8倍,插值方法使用双线性插值法,分别显 示图像。 (5)将图像水平镜像,再顺时针旋转45度,显示旋转后的图像。 (6)将图像分别进行水平方向30度错切,垂直方向45度错切,分别显示结果 四、实验环境 Windows下matlab编程环境 五、实验源代码及结果 1.f=imread('hehua.bmp'); figure; imshow(f); title('原图'); f2=imcrop(f,[50,50,250,250]); figure; imshow(uint8(f2)); title('裁剪后'); imwrite(f2,'d:/5/hehua1.bmp');

二维图形几何变换实验报告

计算机图形学实验报告

实验4二维图形几何变换 一实验目的 1)掌握3*3矩阵乘法运算的编程实现: 2)掌握平移、比例、旋转三种基本二维几何变换矩阵生成: 3)掌握相对于任意参考点的二维复合变换矩阵生成。 二实验要求 1)设计实现二维图形变换类,具有平移、比例、旋转二维几何变换功能,以及相对于任意参考点的二维复合变换功能; 2)将2.2节直线类所绘制的如图2-3所示的菱形线框,绕最上端A点匀速旋转,并要求相对于A点来回缩放。 3)使用双缓冲机制进行图形绘制,避免运动闪烁,所有图形先绘制到用户自定的DC,绘制完成后再统一拷贝到屏幕DC。三实验步骤 第1步:打开2.2节(实验2)工程文件 直接使用2.2节(实验2)的MFC项目工程,及其中的直线类CLine. 第2步:二维点类CP2添加齐次坐标 在“Line.h/cpp”文件中的二维点类CP2的相关代码中添加齐次坐标,修改后的CP2类代码如下(带底纹部分为添加的代码)。 “Line.h”中相关代码 class CP2 {

public: CP2(); virtual~CP2(); CP2(double,double); public: double x; double y; double w; }; class CLine { public: CLine(); virtual~CLine(); void SetLineColor(COLORREF); void MoveTo(CP2); void MoveTo(double,double); void LineTo(CP2, CDC*); void LineTo(double,double, CDC*); public: CP2 P0; CP2 P1; COLORREF clr; }; ===================================================================== Line.cpp #include "stdafx.h" #include "Line.h" #include "math.h" #define Round(d) int (floor(d+0.5)) CP2::CP2() { x=0.0; y=0.0; w=1.0; } CP2::~CP2() {} CP2::CP2( double x,double y) { this->x =x; this->y =y; this->w =1;

图像的几何变换|图像的几何变换包括

学号专业姓名 实验日期教师签字成绩 实验报告 【实验名称】实验七图像的几何变换 【实验目的】 理解和掌握图像的剪切、垂直镜像变换、水平镜像变换、缩放和旋转的原理和应用。 【实验内容】 【实验步骤】 1.对原图使用最近邻插值法进行放大2倍。 2.对原图使用双线性插值法进行旋转。

3.对原图同时进行垂直镜像变换和水平镜像变换。 对原图进行剪切,剪切的区域的位置和范围自己设定。 选做可自行选取多种方法完成以上操作。并进行比较和讨论。 附图像的镜像变换是以图像垂直中轴线或水平中轴线交换图像的变换,分为垂直镜像变换和水平镜像变换。 【程序清单】 图像放大缩小 >> I=imread("D:\Fig_lenna_RGB.tif"); >> figure,imshow(I) >> D=imresize(I,0.2,"nearest"); >> figure,imshow(D) >> E=imresize(D,4,"nearest");

>> figure,imshow(E) 【实验截图】 512*512*3 uint8 102*102*3 uint8 408*408*3 uint8512 图像旋转 >> I=imread("D:\Fig_lenna_RGB.tif"); >> J=imrotate(I,40,"bilinear"); >> figure,imshow(I) >> figure,imshow(J) 【实验截图】 图像水平镜像变换和垂直镜像变换

>> I=imread("D:\Fig_lenna_RGB.tif"); >> subplot(2,2,1),imshow(uint8(I)) >> title("(a)原始图像"); >> subplot(2,2,2),imshow(uint8(I)) >> title("(b)原始图像"); >> I=double(I); >> h=size(I); >> I_fliplr(1:h(1),1:h(2),1:h(3))=I(1:h(1),h(2):-1:1,1:h(3)); >> I1=uint8(I_fliplr); >> subplot(2,2,3),imshow(I1) >> title("(c)水平镜像变换");

几何变换

EX05:几何变换 本实验包含个任务。任务1要求对一个扫描产生的图像文件进行仿射变换,任务2是进行栅格数据的矢量化,栅格数据矢量化是一种重要的数据输入方式,任务3是对一幅卫星影像进行仿射变换。 任务1:地理参照和矫正一幅扫描地图 所需数据:hoytmtn.tif,用TIFF格式存储的扫描后的土壤图。 二值扫描图文件hoytmtn.tif的度量单位为英寸。在本任务中要将扫描图像转换为UTM 坐标。本转换过程包含2个基本步骤:首先,使用4个位于原始土壤图角点的控制点(Tics)对图像进行地理参照,其次,对地理参照后的结果进行校正。4个控制点以度-分-秒(DMS)制表示的经纬度值如下: Tic-id 经度纬度 1 - 116 00 00 47 15 00 2 - 115 52 30 47 15 00 3 - 115 52 30 47 07 30 4 - 116 00 00 47 07 30 当投影到NAD 1927 UTM Zone 11N坐标系统后,上面4点x,y坐标为: Tic-id x y 1 575672.2771 5233212.6163 2 585131.2232 5233341.4371 3 585331.3327 5219450.4360 4 575850.1480 5219321.5730 接下来对hoytmtn.tif进行地理参考。 1.运行ArcMap,将数据框架命名为Task1并将hoytmtn.tif添加到Task1。单击View菜单, 指向Toolbars,设置Georeferencing。ArcMap中会出现Georeferencing工具条,在Layer 下拉列表中存在hoytmtn.tif项(图5.1)。 图5.1 Georeferencing工具条 2.对hoytmtn.tif进行缩放,定位到4个控制点。这些控制点以框标表示,2个位于图像的 顶端,2个位于图像的底部。1号点位于左上角,而后按顺时针方向顺序排列。(图5.2) 图5.2 控制点 3.放大到第1个控制点,在Georeferencing工具条上单击Add Control Points工具,在框标 角点处单击,而后第2次单击。此时,在控制点上的 + 标志由绿色变为红色。使用同样的方法增加其他3个控制点(图5.3)。

计算机图形学实验:二维图形变换

实验三二维图形变换 一、实验任务 1. 通过二维几何变换的数学模型,编写缩放、旋转、对称变换; 2. 实现图形变换的交互式操作:缩放、旋转、对称变换等; 二、实验内容 1. 放大缩小变换 放大缩小变换公式为:x ’=x..S x , y ’=y.S y ; 其中S x ,S y 分别为x,y 方向的放缩比例系数。 变换矩阵表达式为: [x ’ y ’ (1)S x =S y =1.5;等比例放大 (2)S x =S y =0.5;等比例缩小 2. 对称变换 包括以x 轴对称、y 轴对称和原点O 对称三种。由于屏幕坐标只有第一象限,我们可以将原点平移到(500,240)处。在第一象限画出一个三角形,然后分别求出三个对称图形。 3. 旋转变换 将图形上的点(x ,y )旋转θ角度,得到新的坐标(x ’,y ’ )为: x ’=xcos θ-ysin θ, y ’=xsin θ+ycos θ; [x ’ y ’ 4. 三、设计思路 1. 通过二维几何变换的数学模型,编写缩放、旋转、对称变换; 2. 以(500,240)为原点建立图形变换的参考坐标系; 3. 通过键盘按键控制图形的缩放、旋转、对称变换; 4. 变换图形设定为以Pt[0](540,220)、Pt[1](670,130)、Pt[2](560,120)为顶点的 三角形。 步骤:

1.建立Trans工程文件; 2.利用Resource View设计菜单,如图所示; 3.在CTransView视图类中添加消息映射函数; 4.添加自定义的成员变量: CPoint Pt[3];//三角形定点数组 float dAngle;//每一次旋转的角度 在视图类CPP文件的构造函数中初始化成员变量 Pt[0].x = 540; Pt[0].y = 220; Pt[1].x = 670; Pt[1].y = 130; Pt[2].x = 560; Pt[2].y = 120; dAngle = 0; 5.在视图类的OnDraw()函数中加入下列代码,实现视图绘图。

相关主题