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

合集下载

二维几何变换学习镜像平移和旋转等变换

二维几何变换学习镜像平移和旋转等变换

二维几何变换学习镜像平移和旋转等变换在几何学中,二维几何变换是一种将平面上的点或形状进行改变的操作。

镜像、平移和旋转是常见的二维几何变换,它们不仅有着广泛的应用,而且在计算机图形学和图像处理等领域中扮演着重要的角色。

本文将分别介绍镜像、平移和旋转等变换的基本概念、性质与应用。

一、镜像变换镜像变换,又称翻转变换,是将平面上的点或形状沿着一条直线进行对称的变换。

在镜像变换中,我们可以定义一条直线作为镜像轴,对于沿轴线的点,它们在镜像后仍保持在轴上,而对于不在轴上的点,则沿垂直于轴线的方向移动相同的距离。

镜像变换可以分为对称镜像和中心镜像两种类型。

对称镜像是将平面上的点或形状沿着一条直线进行对称的变换。

对于对称镜像,镜像轴上的点保持不变,其他点关于轴线对称。

例如,在一个直角三角形中,如果将三角形沿着斜边的中垂线进行对称,那么三角形的形状将完全相同,但位置改变了。

中心镜像是将平面上的点或形状沿着一个点进行对称的变换。

对于中心镜像,镜像中心点保持不变,其他点关于镜像中心对称。

例如,在一个正方形中,如果将正方形沿着中心进行中心镜像,那么正方形的形状将保持不变。

镜像变换在现实生活和工程应用中有着广泛的应用。

例如,在建筑设计中,通过对称镜像可以快速获得相对称的结构,从而减少设计和施工的难度。

在计算机图形学中,镜像变换被广泛应用于图像处理和计算机游戏中,能够快速生成镜像效果。

二、平移变换平移变换是将平面上的点或形状沿着一个方向进行移动的变换。

在平移变换中,每个点的平移距离和方向相同,所有的点都保持相对位置不变。

平移变换可以用坐标表示为(x, y) → (x+dx, y+dy),其中(dx, dy)表示平移的距离和方向。

平移变换的一个重要性质是保持平行性,即平移后的平行线与原先的平行线依然平行。

这个性质在工程设计和计算机图形学中有着重要的应用。

例如,在工程设计中,通过平移变换可以方便地复制和粘贴结构,缩短设计和施工的时间。

几何形的变换和构造平移旋转翻转和镜像的基本操作

几何形的变换和构造平移旋转翻转和镜像的基本操作

几何形的变换和构造平移旋转翻转和镜像的基本操作几何形的变换和构造:平移、旋转、翻转和镜像的基本操作几何形的变换和构造是数学中的重要概念,它们描述了几何形状在平面上或者空间中的移动、旋转、翻转和镜像等操作。

这些操作不仅在数学中有着广泛的应用,还在计算机图形学、工程设计等领域发挥着重要的作用。

本文将介绍几何形的平移、旋转、翻转和镜像的基本操作,并探讨它们的特点和应用。

一、平移平移是指在平面上或者空间中,将一个几何形状沿着指定的方向和距离移动的操作。

在平面上进行平移时,我们可以通过将几何形状的所有点沿着指定的方向移动相同的距离来实现。

在空间中进行平移时,同样可以将几何形状的所有点沿着指定的方向移动相同的距离。

平移的基本特点是保持几何形状的大小、形状和方向不变。

它是一种刚体变换,即在平移的过程中没有发生形状的扭曲或变形。

平移操作常被用于图形的移动、对称等应用中。

二、旋转旋转是指在平面上或者空间中,将一个几何形状绕着某个中心点旋转一定角度的操作。

在平面上进行旋转时,我们可以通过将几何形状的所有点绕着指定的中心点旋转相同的角度来实现。

在空间中进行旋转时,同样可以将几何形状的所有点绕着指定的中心点旋转相同的角度。

旋转的基本特点是保持几何形状的大小和形状不变,但会改变几何形状的朝向或方向。

在旋转的过程中,几何形状的各个点围绕着旋转中心点旋转,并按照一定的规律重新排列。

旋转操作常被应用于图形的变换、建筑物的设计、机械的运动等领域。

三、翻转翻转是指在平面上或者空间中,将一个几何形状沿着某条轴线镜像对称的操作。

在平面上进行翻转时,我们可以通过将几何形状的所有点沿着指定的轴线进行镜像对称来实现。

在空间中进行翻转时,同样可以将几何形状的所有点沿着指定的轴线进行镜像对称。

翻转的基本特点是保持几何形状的大小和形状不变,但会改变几何形状的朝向或方向。

翻转操作将几何形状的各个点关于轴线进行对称,使得原本位于轴线一侧的点反转到轴线的另一侧。

编程实现一幅图像的平移、镜像、旋转、缩小和放大

编程实现一幅图像的平移、镜像、旋转、缩小和放大

课程设计任务书学生姓名:专业班级:通信1003班指导教师:郭志强工作单位:信息工程学院题目: 通信工程应用技术初始条件:(1)使用matlab软件进行操作(2)选择一个图像进行处理要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)编程实现一幅图像的平移、镜像、旋转、缩小和放大。

(2)给出所用算法的理论依据和必要的推导过程,给出原始图像和处理后的图像。

时间安排:第15周:安排任务,布置题目;第15—18周:设计仿真,撰写报告第19周:完成设计,提交报告,答辩指导教师签名:年月日系主任(或责任教师)签名:年月日目录摘要 (I)Abstract ........................................................................................................................................................... I I 1 MA TLAB简介 .. (1)1.1 MA TLAB用途 (1)2图像选择及变换 (4)2.1 原始图像选择读取 (4)2.2 图像放大和缩小 (6)2.2.1 图像放大缩小的知识 (6)2.2.2 函数说明及参数选择 (8)2.2.3 源程序及运行结果 (8)2.3 图像任意角度的旋转 (10)2.3.1 函数说明及参数选择 (10)2.3.2 源程序及运行结果 (10)2.4 图像的平移 (12)2.4.1 函数说明及参数选择 (12)2.4.2 源程序及运行结果 (13)2.5 图像经过镜像 (13)3.5.1 函数说明及参数选择 (13)2.5.2 源程序及运行结果 (14)4 感悟体会小结 (17)5 参考文献 (18)附录 (19)全部源程序代码: (19)摘要MATLAB是—套高性能的数值计算和可视化软件,它集数值分析、矩阵运算、信号处理和图形显示于一体,构成—个方便的、界面友好的用户环境。

编程实现一幅图像的平移、镜像、旋转、缩小和放大。

编程实现一幅图像的平移、镜像、旋转、缩小和放大。

编程实现⼀幅图像的平移、镜像、旋转、缩⼩和放⼤。

课程设计任务书学⽣姓名: zhh 专业班级:通信1002班指导教师:徐⽂君⼯作单位:信息⼯程学院题⽬: 通信⼯程应⽤技术综合训练与实习初始条件:1.数字图像处理课程相关知识。

2.Matlab软件的软件编程应⽤与仿真。

要求完成的主要任务:任务:编程实现⼀幅图像的平移、镜像、旋转、缩⼩和放⼤。

要求:1.给出所⽤算法的理论依据和必要的推导过程。

2.给出原始图像和处理后的图像。

时间安排:序号设计内容所⽤时间1根据设计任务确定实验⽅案2天2根据实验条件进⾏电路的测试,并对结果进⾏分析7天3撰写课程设计报告1天合计2周指导教师签名: 年⽉⽇系主任签名: 年⽉⽇⽬录摘要..................................................................................I Abstract ............................................................................. II 1 图像的⼏何变换.. (1)1.1图像⼏何变换内容 (1)1.2 Matlab仿真使⽤的主要函数 (1)2图像的平移变换 (3)2.1图像平移变换原理 (3)2.2图像平移变换的matlab实现 (3)3图像的镜像变换 (4)3.1 图像镜像变换原理 (5)3.2 图像镜像变换的matlab实现 (6)4图像的旋转变换 (6)4.1图像旋转变换原理 (7)4.2 图像旋转变换的matlab实现 (8)5图像的⽐例变换 ..................................................... 错误!未定义书签。

5.1 图像⽐例变换原理 (10)5.2 图像⽐例变换的matlab实现 (10)6 ⼼得体会 (14)参考⽂献 (15)附录 (16)摘要图像是对三维实际景物的平⾯投影,图形图像处理主要是通过计算机对图像进⾏处理,从⽽达到预期的效果的技术。

如何进行平移旋转翻转等几何变换

如何进行平移旋转翻转等几何变换

如何进行平移旋转翻转等几何变换如何进行平移、旋转、翻转等几何变换几何变换是几何学中重要的概念,广泛应用于计算机图形学、游戏开发、计算机辅助设计和工程制图等领域。

通过几何变换,我们可以改变图形的位置、方向和形状,从而达到我们想要的效果。

本文将介绍如何进行平移、旋转和翻转等几何变换,并提供示例说明。

一、平移变换平移变换是指在平面内将图形沿着某个方向移动一定的距离。

平移变换不改变图形的大小和形状,只改变其位置。

对于平面上的一个点(x, y),平移变换的公式为:新的坐标点 = (x + dx, y + dy)其中,dx和dy分别代表在x轴和y轴上的平移距离。

例如,如果要将一个点(2, 3)沿x轴正方向平移3个单位,沿y轴正方向平移2个单位,则变换后的新坐标为(5, 5)。

平移变换也可以用矩阵进行表示。

平移变换矩阵如下所示:[1 0 dx][0 1 dy][0 0 1]二、旋转变换旋转变换是指将图形绕某个点旋转一定的角度。

通过旋转变换,我们可以改变图形的方向和位置。

对于平面上的一个点(x, y),绕原点旋转θ度后的新坐标计算公式为:新的坐标点= (x * cosθ - y * sinθ, x * sinθ + y * cosθ)其中,θ为旋转角度。

例如,如果要将点(1, 1)绕原点逆时针旋转45度,则变换后的新坐标为(0, √2)。

旋转变换也可以用矩阵进行表示。

旋转变换矩阵如下所示:[cosθ -sinθ 0][sinθ cosθ 0][0 0 1]三、翻转变换翻转变换是指将图形关于某个轴或某个点进行对称翻转。

翻转变换有水平翻转和垂直翻转两种情况。

1. 水平翻转:对于平面上的一个点(x, y),关于x轴进行水平翻转后的新坐标计算公式为:新的坐标点 = (x, -y)例如,将点(2, 3)关于x轴进行水平翻转,则变换后的新坐标为(2, -3)。

2. 垂直翻转:对于平面上的一个点(x, y),关于y轴进行垂直翻转后的新坐标计算公式为:新的坐标点 = (-x, y)例如,将点(2, 3)关于y轴进行垂直翻转,则变换后的新坐标为(-2, 3)。

python-opencv图像几何变换--缩放、平移、旋转

python-opencv图像几何变换--缩放、平移、旋转

python-opencv图像⼏何变换--缩放、平移、旋转缩放缩放是调整图⽚的⼤⼩,可以指定输出图像尺⼨⼤⼩,也可以指定缩放⽐例。

opencv函数原型cv2.resize(InputArray src, OutputArray dst, Size, fx, fy, interpolation)InputArray src 输⼊图像OutputArrzy dst输出图像Size输出图像尺⼨fx, fy x轴,y轴的缩放系数interpolation插值⽅式interpolation插值⽅式:插值⽅式有INTER_NEAREST 最近邻插值、INTER_LINEAR 双线性插值、INTER_AREA 像素区域重采样、INTER_CUBIC 4*4像素邻域双三次插值、 INTER_LANCZOS4 8*8像素邻域Lanczos插值。

其中INTER_LINEAR为默认的插值⽅法,⾸选的插值⽅法是INTER_AREA。

我们可以使⽤以下⽅法调整图像⼤⼩:import cv2 as cvimg = cv.imread(r'Lena.png', 1)res1 = cv.resize(img, None, fx=0.5, fy=0.5, interpolation=cv.INTER_AREA)# Orheight, width = img.shape[ : 2]res2 = cv.resize(img, (int(0.5*width), int(0.5*height)), interpolation=cv.INTER_AREA)平移在对图像作平移操作时,需创建变换矩阵。

2⾏3列矩阵,决定了何种变换。

M矩阵则表⽰⽔平⽅向上平移为x⽽竖直⽅向上的平移距离为y。

import numpy as npimport cv2 as cvimg = cv.imread(r'Lena.png', 1)rows, cols, channels = img.shapeM = np.float32([[1,0,100],[0,1,50]])res = cv.warpAffine(img, M, (cols, rows))# cv.warpAffine()第三个参数为输出的图像⼤⼩,值得注意的是该参数形式为(width, height)。

图像的几何变换(平移、旋转、镜像)

图像的几何变换(平移、旋转、镜像)

一、图像平移strel %用来创建形态学结构元素translate(SE,[y x])%原结构元素SE上y和x方向平移imdilate%形态学膨胀代码:I=imread('Bluesky.jpg');se=translate(strel(1),[180 190]);B=imdilate(I,se);figure(1);subplot(1,2,1);subimage(I);title('原图像'); subplot(1,2,2);subimage(B);title('平移后图像');figure(2);subplot(1,2,1);imshow(I);title('原图像'); subplot(1,2,2);imshow(B);title('平移后图像');%显然subimage()命令可以显示图像轴而imshow()不可以结果:Figure1Figure2:二、图像镜像B=imtransform(A,TFORM,method);TFORM=makeform(transformtype,Matrix);%空间变换结构参数transformtype指定了变换的类型,常见的’affine’为二维或多维仿射变换,包括平移、旋转、比例、拉伸和错切等。

Matrix为相应的仿射变换矩阵。

代码:A=imread('Bluesky.jpg');[height,width,dim]=size(A);%计算图像尺寸tform=maketform('affine',[-1 0 0;0 1 0;width 0 1]);%空间变换结构,其中[-1 0 0;0 1 0;width 0 1]为水平翻转矩阵B=imtransform(A,tform,'nearest');tform2=maketform('affine',[1 0 0;0 -1 0;0 height 1]);%空间变换结构,其中[1 0 0;0 -1 0;0 height 1]为垂直翻转矩阵C=imtransform(A,tform2,'nearest');figure;subplot(1,3,1);imshow(A);title('原图');subplot(1,3,2);imshow(B);title('水平镜像');imwrite(B,'水平镜像.jpg');subplot(1,3,3);imshow(C);title('垂直镜像');imwrite(B,'垂直镜像.jpg');结果:加上代码tightfig 后如下(白边框变小了):Tightfig 函数代码如下:function hfig = tightfig(hfig)% tightfig: Alters a figure so that it has the minimum size necessary to % enclose all axes in the figure without excess space around them. %% Note that tightfig will expand the figure to completely encompass all % axes if necessary. If any 3D axes are present which have been zoomed, % tightfig will produce an error, as these cannot easily be dealt with. %% hfig - handle to figure, if not supplied, the current figure will be used% instead.原图水平镜像垂直镜像if nargin == 0hfig = gcf;end% There can be an issue with tightfig when the user has been modifying % the contnts manually, the code below is an attempt to resolve this, % but it has not yet been satisfactorily fixed% origwindowstyle = get(hfig, 'WindowStyle');set(hfig, 'WindowStyle', 'normal');% 1 point is 0.3528 mm for future use% get all the axes handles note this will also fetch legends and % colorbars as wellhax = findall(hfig, 'type', 'axes');% get the original axes units, so we can change and reset these again % laterorigaxunits = get(hax, 'Units');% change the axes units to cmset(hax, 'Units', 'centimeters');% get various position parameters of the axesif numel(hax) > 1% fsize = cell2mat(get(hax, 'FontSize'));ti = cell2mat(get(hax,'TightInset'));pos = cell2mat(get(hax, 'Position'));else% fsize = get(hax, 'FontSize');ti = get(hax,'TightInset');pos = get(hax, 'Position');end% ensure very tiny border so outer box always appearsti(ti < 0.1) = 0.15;% we will check if any 3d axes are zoomed, to do this we will check if% they are not being viewed in any of the 2d directionsviews2d = [0,90; 0,0; 90,0];for i = 1:numel(hax)set(hax(i), 'LooseInset', ti(i,:));% set(hax(i), 'LooseInset', [0,0,0,0]);% get the current viewing angle of the axes[az,el] = view(hax(i));% determine if the axes are zoomediszoomed = strcmp(get(hax(i), 'CameraViewAngleMode'), 'manual');% test if we are viewing in 2d mode or a 3d viewis2d = all(bsxfun(@eq, [az,el], views2d), 2);if iszoomed && ~any(is2d)error('TIGHTFIG:haszoomed3d', 'Cannot make figures containing zoomed 3D axes tight.')endend% we will move all the axes down and to the left by the amount% necessary to just show the bottom and leftmost axes and labels etc. moveleft = min(pos(:,1) - ti(:,1));movedown = min(pos(:,2) - ti(:,2));% we will also alter the height and width of the figure to just% encompass the topmost and rightmost axes and lablesfigwidth = max(pos(:,1) + pos(:,3) + ti(:,3) - moveleft);figheight = max(pos(:,2) + pos(:,4) + ti(:,4) - movedown);% move all the axesfor i = 1:numel(hax)set(hax(i), 'Position', [pos(i,1:2) - [moveleft,movedown],pos(i,3:4)]);endorigfigunits = get(hfig, 'Units');set(hfig, 'Units', 'centimeters');% change the size of the figurefigpos = get(hfig, 'Position');set(hfig, 'Position', [figpos(1), figpos(2), figwidth, figheight]);% change the size of the paperset(hfig, 'PaperUnits','centimeters');set(hfig, 'PaperSize', [figwidth, figheight]);set(hfig, 'PaperPositionMode', 'manual');set(hfig, 'PaperPosition',[0 0 figwidth figheight]);% reset to original units for axes and figureif ~iscell(origaxunits)origaxunits = {origaxunits};endfor i = 1:numel(hax)set(hax(i), 'Units', origaxunits{i});endset(hfig, 'Units', origfigunits);% set(hfig, 'WindowStyle', origwindowstyle);end三、图像转置代码段:A=imread('Bluesky.jpg');tform=maketform('affine',[0 1 0;1 0 0;0 0 1]);B=imtransform(A,tform,'nearest');figure;subplot(1,2,1);imshow(A);title('原图');subplot(1,2,2);imshow(B);title('转置后');tightfig;imwrite(B,'转置后图像.jpg');结果:原图转置后四、图像的中心旋转B=imrotate(A,angle,method,’crop’);angle为旋转角度,正值为逆时针旋转。

旋转、平移和镜像变换

旋转、平移和镜像变换

旋转、平移和镜像变换旋转、平移和镜像变换是几种常见的图形变换方法,在计算机图形学、几何学以及艺术设计等领域都有广泛应用。

通过这些变换,我们可以改变图形的位置、形状和方向,从而达到我们想要的效果。

1. 旋转变换旋转变换是将一个图形按照某个点为中心点进行旋转,使得图形围绕这个中心点旋转一定角度。

旋转变换可以分为顺时针旋转和逆时针旋转两种。

旋转变换的公式为:x' = x*cosθ - y*sinθy' = x*sinθ + y*cosθ其中,(x, y)表示原始的点的坐标,(x', y')表示旋转后的点的坐标,θ表示旋转的角度。

2. 平移变换平移变换是将一个图形沿着平移向量的方向进行移动,使得图形整体平移一定距离。

平移变换是保持图形形状和方向不变的基本变换之一。

平移变换的公式为:x' = x + dxy' = y + dy其中,(x, y)表示原始的点的坐标,(x', y')表示平移后的点的坐标,(dx, dy)表示平移向量。

3. 镜像变换镜像变换是将一个图形按照某个镜像轴进行对称,使得图形在镜像轴两侧呈镜像关系。

镜像变换可以分为水平镜像和垂直镜像两种。

水平镜像变换的公式为:x' = xy' = y垂直镜像变换的公式为:x' = -xy' = y其中,(x, y)表示原始的点的坐标,(x', y')表示镜像后的点的坐标。

通过组合使用旋转、平移和镜像变换,我们可以实现更加复杂的变换效果。

例如,可以先将一个图形进行平移,然后再进行旋转和镜像变换,从而得到一个整体上更加生动和有趣的图形。

总结:旋转、平移和镜像变换是图形变换中常用的几种方法。

它们可以灵活地改变图形的位置、形状和方向,为计算机图形学、几何学和艺术设计等领域提供了丰富的工具和技术。

熟练掌握这些变换方法,对于创作和处理图形具有重要意义。

几何的平移旋转和镜像

几何的平移旋转和镜像

几何的平移旋转和镜像几何形状的变换是数学中的重要概念,包括平移、旋转和镜像等操作。

通过这些变换,我们可以改变几何图形的位置、角度和方向,从而达到不同的视觉效果和几何关系。

在这篇文章中,将介绍几何的平移、旋转和镜像的概念及其运用。

一、平移平移是指将几何图形在平面上沿着某个方向移动一定距离,而保持图形的形状和大小不变。

平移操作可以用来描述物体的位置改变,例如我们可以通过平移来移动一张桌子或者一张地图。

在几何学中,平移可以通过向量的加法来表示。

具体地说,平移的过程中,每个点都按照相同的位移向量进行移动。

二、旋转旋转是指将几何图形绕某个中心点进行转动。

旋转可以使图形按照一定的角度和方向进行变换,我们常见的钟表的指针就是通过旋转来表示时间的变化。

在几何学中,旋转是围绕一个中心点进行的,中心点通常称为旋转中心或者旋转点。

旋转的角度可以是正数也可以是负数,如果角度为正数,则为顺时针旋转;如果角度为负数,则为逆时针旋转。

三、镜像镜像是指将几何图形沿着某条直线进行对称变换。

镜像可以使图形相对于镜面进行翻转,从而改变图形的方向和位置。

镜像是一种特殊的对称变换,它通过将原图形的每个点关于镜面对称得到新的图形。

在几何学中,镜像有两种类型:关于直线的镜像和关于点的镜像。

关于直线的镜像在平面上将图形的每个点关于镜面对称;而关于点的镜像将图形的每个点关于镜像中心对称。

四、应用举例平移、旋转和镜像在几何学中有着广泛的应用。

平移操作可以用于建筑设计中的地板铺设、家具布局、城市规划等方面;旋转操作可以用于计算机图形学中的3D模型设计、建筑立面的设计等方面;镜像操作可以用于对称图案的设计、镜子中的反射现象等方面。

总结:几何的平移旋转和镜像是数学中的重要概念,通过这些变换,可以改变几何图形的位置、角度和方向。

平移是指将图形沿着某个方向移动一定距离;旋转是指将图形绕某个中心点进行转动;镜像是指将图形沿着某条直线进行对称变换。

这些操作在建筑设计、计算机图形学等领域有着广泛的应用。

数学中的几何变换形的平移旋转缩放与镜像

数学中的几何变换形的平移旋转缩放与镜像

数学中的几何变换形的平移旋转缩放与镜像几何变换是数学中研究空间中图形移动、旋转、缩放和镜像的重要概念。

它们不仅在几何学中广泛应用,还在计算机图形学、物理学、工程学等领域中发挥着重要作用。

本文将探讨数学中的几种常见几何变换:平移、旋转、缩放和镜像,并阐述它们的定义、性质和应用。

一、平移变换平移变换是指通过沿着特定的方向和距离将图形移动至新的位置。

在平面几何中,对于平移变换,原图形和变换后的图形具有相同的形状和大小,只是位置不同。

平移变换可以表示为:T(x,y) = (x+a, y+b)其中,(x,y)为原图形上某点的坐标,(x+a, y+b)为平移后图形上对应点的坐标,a和b分别表示平移的水平和垂直方向的距离。

平移变换具有以下性质:1. 保持形状不变:平移变换后,图形的各边和角度保持不变。

2. 保持大小不变:平移变换后,图形的面积和周长保持不变。

3. 保持平行关系:平移变换后,图形上任意两点之间的距离、平行线之间的距离和夹角大小保持不变。

4. 可叠加性:对于多个平移变换依次进行,结果等价于进行一个平移变换。

平移变换的应用:1. 地图标注:在地理信息系统中,通过平移变换可以实现地图上标注物体的位置调整。

2. 图像处理:在计算机图像处理中,通过平移变换可以实现图像的平移和移动。

3. 动画制作:在动画制作中,通过平移变换可以使图像或物体在屏幕上产生移动效果。

二、旋转变换旋转变换是指将图形绕某一固定点旋转一定角度得到新的图形。

在平面几何中,旋转变换可以围绕坐标原点进行,也可以围绕其他点或轴进行。

旋转变换可以表示为:R(x,y) = (xcosθ - ysinθ, xsinθ + ycosθ)其中,(x,y)为原图形上某点的坐标,(xcosθ - ysinθ, xsinθ+ ycosθ)为旋转后图形上对应点的坐标,θ表示旋转的角度。

旋转变换具有以下性质:1. 保持形状不变:旋转变换后,图形的各边和角度保持不变。

空间镜像与旋转的几何变换

空间镜像与旋转的几何变换

空间镜像与旋转的几何变换几何变换是对空间中的图形进行改变的一种方式,在几何学中有许多种常见的几何变换,其中包括空间镜像和旋转。

空间镜像是指通过一条直线、一个面或者一个点将一个图形镜像对称地复制一遍,而旋转则是指以一个固定点为中心,将一个图形按照一定的角度进行旋转。

一、空间镜像的几何变换空间镜像是一种常见的几何变换,它可以通过一个镜面来实现。

当一个图形通过镜面进行镜像时,所有点关于镜面对称。

空间镜像可以分为三种类型:关于直线的镜像、关于平面的镜像和关于点的镜像。

1. 关于直线的镜像关于直线的镜像是指将一个图形沿着一条直线进行对称,使得对称后的图形和原来的图形完全一样。

在空间中,一条直线可以看作一种特殊的平面,所以关于直线的镜像也可以看作是关于平面的镜像。

镜面通常用虚线表示,通过镜面的每一个点,都可以找到一条与镜面垂直的直线,这条直线称为法线。

镜面通过将每一点与其对称点进行连线,形成一条对称轴,使得图形关于镜面对称。

2. 关于平面的镜像关于平面的镜像是指将一个图形沿着一个平面进行对称,使得对称后的图形和原来的图形完全一样。

平面通常用实线表示,平面的一侧被称为正面,而另一侧被称为背面。

通过平面镜像,图形会在正面和背面之间进行镜像对称,使得图形的形状得到保持。

3. 关于点的镜像关于点的镜像是指将一个图形关于一个点进行对称,使得对称后的图形和原来的图形完全一样。

在空间中,一个点可以看作是特殊的平面,所以关于点的镜像也可以看作是关于平面的镜像。

通过点镜像,图形在以该点为中心的球面上进行镜像对称。

二、旋转的几何变换旋转是另一种常见的几何变换,它是以一个固定点为中心,将一个图形按照一定的角度进行旋转。

旋转可以分为二维旋转和三维旋转。

1. 二维旋转二维旋转是指将一个图形绕着一个固定点在平面内按照一定的角度进行旋转。

旋转角度可以是正数也可以是负数,正数表示逆时针旋转,负数表示顺时针旋转。

旋转点和旋转角度的选择会影响到旋转后的图形形状和位置。

实现一幅图像的平移、镜像、旋转、缩小和放大

实现一幅图像的平移、镜像、旋转、缩小和放大

(1)编程实现一幅图像的平移、镜像、旋转、缩小和放大。

读取原图%获取图像,并显示各种基本信息RGB=imread('G:/photo.jpg'); % RGB:原始图像,真彩色;Info=imfinfo('G:/photo.jpg')figure;imshow(RGB)title('原始图像')放大与缩小%图像放大和缩小X=imresize(RGB,0.5,'nearest');%采用最邻近插入法将图像缩小为原来的1/2figureimshow(X)title('最邻近插入法')Y=imresize(RGB,2,'bilinear');%采用双三次插入法将图像放大为原来的2倍figureimshow(Y)title('双三次插入法')图像的旋转%图像的旋转X1=imrotate(RGB,45,'nearest');%将原始灰度以最邻近插值的方式将图像逆时针旋转45°figureimshow(X1)title('最邻近插值法逆时针45°旋转')Y1=imrotate(RGB,135,'bilinear');%将原始灰度以双线性插值的方式将图像逆时针时针旋转135°Figureimshow(Y1)title('双线性插值法逆时针135°旋转')图像的平移%图像的平移p=translate(strel(1), [25 25]);%图像平移img=imdilate(RGB,p);figureimshow(img);title('图像的平移');图像的镜像height,width,dim]=size(RGB);tform=maketform('affine',[-1 0 0;0 1 0;width 0 1]); %定义水平镜像变换矩阵B=imtransform(RGB,tform,'nearest');tform2=maketform('affine',[1 0 0;0 -1 0;0 height 1]); %定义垂直镜像变换矩阵C=imtransform(RGB,tform2,'nearest');figuresubplot(1,2,1),imshow(RGB);title('原图像');subplot(1,2,2),imshow(B);title('水平镜像');figuresubplot(2,1,1),imshow(RGB);title('原图像');subplot(2,1,2),imshow(C);title('竖直镜像');。

10、图像的几何变换——平移、镜像、缩放、旋转、仿射变换

10、图像的几何变换——平移、镜像、缩放、旋转、仿射变换

10、图像的⼏何变换——平移、镜像、缩放、旋转、仿射变换1.⼏何变换的基本概念 图像⼏何变换⼜称为图像空间变换,它将⼀副图像中的坐标位置映射到另⼀幅图像中的新坐标位置。

我们学习⼏何变换就是确定这种空间映射关系,以及映射过程中的变化参数。

图像的⼏何变换改变了像素的空间位置,建⽴⼀种原图像像素与变换后图像像素之间的映射关系,通过这种映射关系能够实现下⾯两种计算:原图像任意像素计算该像素在变换后图像的坐标位置变换后图像的任意像素在原图像的坐标位置对于第⼀种计算,只要给出原图像上的任意像素坐标,都能通过对应的映射关系获得到该像素在变换后图像的坐标位置。

将这种输⼊图像坐标映射到输出的过程称为“向前映射”。

反过来,知道任意变换后图像上的像素坐标,计算其在原图像的像素坐标,将输出图像映射到输⼊的过程称为“向后映射”。

但是,在使⽤向前映射处理⼏何变换时却有⼀些不⾜,通常会产⽣两个问题:映射不完全,映射重叠映射不完全输⼊图像的像素总数⼩于输出图像,这样输出图像中的⼀些像素找不到在原图像中的映射。

上图只有(0,0),(0,2),(2,0),(2,2)四个坐标根据映射关系在原图像中找到了相对应的像素,其余的12个坐标没有有效值。

映射重叠根据映射关系,输⼊图像的多个像素映射到输出图像的同⼀个像素上。

上图左上⾓的四个像素(0,0),(0,1),(1,0),(1,1)都会映射到输出图像的(0,0)上,那么(0,0)究竟取那个像素值呢?要解决上述两个问题可以使⽤“向后映射”,使⽤输出图像的坐标反过来推算改坐标对应于原图像中的坐标位置。

这样,输出图像的每个像素都可以通过映射关系在原图像找到唯⼀对应的像素,⽽不会出现映射不完全和映射重叠。

所以,⼀般使⽤向后映射来处理图像的⼏何变换。

从上⾯也可以看出,向前映射之所以会出现问题,主要是由于图像像素的总数发⽣了变化,也就是图像的⼤⼩改变了。

在⼀些图像⼤⼩不会发⽣变化的变换中,向前映射还是很有效的。

MFC绘图中关于坐标映射的说明

MFC绘图中关于坐标映射的说明

窗口和视口原点的改变以及与设备坐标的关系关于SetWindowOrg使用说明示例:把设备坐标的原点(视口)映射到逻辑坐标的(X, Y)处。

绘图代码如下dc.SetWindowOrg(20,20);//将(20,20)作为设备环境的原点;dc.MoveTo(20,20);//这个点对应设备环境(对话框客户区的原点)原点dc.LineTo(200,200);由于GDI绘图使用的是逻辑坐标,故等同于将逻辑坐标(20,20)看成设备环境(对话框客户区)的原点:即设备环境的原点等同于逻辑坐标的(20,20)。

这条线与在未改变窗口的原点之前,与dc.MoveTO(0,0,);dc.LineTO(180,180);效果等同将代码改成如下CPaintDC dc(this); // device context for paintingCPen pen(PS_SOLID,2,RGB(255,0,0));CPen* pOldPen = dc.SelectObject(&pen);dc.MoveTo(0,0);dc.LineTo(160,160);dc.SelectObject(pOldPen);dc.SetWindowOrg(20,20);//将(20,20)作为设备环境的原点;dc.MoveTo(20,20);//这个点对应设备环境(对话框客户区的原点)原点dc.LineTo(200,200);可以很明显的看到在未改变窗口坐标原点之前与改变窗口坐标原点之后的对比,它们的起点相同,实例3CPaintDC dc(this); // device context for paintingCPen pen(PS_SOLID,2,RGB(255,0,0));CPen* pOldPen = dc.SelectObject(&pen);dc.SetWindowOrg(-20,-20);//将(-20,-20)作为设备环境的原点,当然坐标依然是X轴向右为正,Y轴向下为正dc.MoveTo(-10,-10);dc.LineTo(200,200);2. 关于SetViewportOrg :是把逻辑坐标的原点(窗口)映射到设备坐标的(X, Y)处CPaintDC dc(this); // device context for paintingCPen pen(PS_SOLID,2,RGB(255,0,0));CPen* pOldPen = dc.SelectObject(&pen);dc.SetViewportOrg(20,20);//逻辑原点点(0,0)映射成设备点(20,20)dc.MoveTo(-10,-10);dc.LineTo(200,200);代码改成如下dc.MoveTo(0,0);dc.LineTo(200,200);dc.SelectObject(pOldPen);dc.SetViewportOrg(20,20);//逻辑点(0,0)对应设备点(20,20)dc.MoveTo(0,0);dc.LineTo(200,200);需要明确指出的是任意一点进行平移旋转,1. 确定AB 线,作为向量AB ,把A 点作为参考点,平移至(0,0),然后A (Xa,Ya )------→A ’(0,0)B (Xb,Yb)--------→B ’(Xb-Xa,Yb-Ya)2. 将向量AB 旋转方向与Y 轴正半轴相同 Y 轴正半轴向量(0,1)求解旋转角Cos = (Yb-Ya)/(sqrt((Xb-Xa)* (Xb-Xa) +(Yb-Ya)*(Yb- Ya)))3. 得到角度后旋转向量AB 线旋转,就得到了与Y 轴平行AB ‘线,作为导航线旋转公式 设P (x ,y ),逆时针旋转 jiao 为P ‘(X ’,Y ’)X ’ = xcos - ysinY ’= xsin + ycos拖拉机空间坐标按照前面的步骤 先平移同样的单位,在进行旋转这样进行坐标转换之后的缺陷在于,A点作为原点,AB即为Y轴,通过A点垂直于AB的直线为X轴如图所示如果拖拉机的坐标出现在画阴影线区域,则及时转换后坐标也是不能显示到绘图区域,所以以通过AB点的两条互相垂直的直线为边界,地块只能位于非阴影区域,否则转化的到的坐标在绘制时是显示不出来的。

学习几何变换理解平移旋转和翻转

学习几何变换理解平移旋转和翻转

学习几何变换理解平移旋转和翻转学习几何变换理解平移、旋转和翻转几何变换是数学中一个重要的概念,用于描述平面或空间中图形的形状改变。

其中,平移、旋转和翻转是最基本且常见的几何变换方式。

通过学习几何变换,我们能够更好地理解和描述图形的运动和变化。

本文将详细介绍平移、旋转和翻转的概念、性质和应用。

一、平移平移是指保持图形形状不变,只改变其位置的变换方式。

平移可以用一个向量来表示,这个向量的大小和方向表示了图形在平移过程中的移动距离和方向。

平移的特点:1. 平移不改变图形的大小和形状,只改变了它们的位置。

2. 平移保持了图形的对称性和平行性质,相似三角形和相似多边形的比例关系也得以保持。

3. 平移是可逆的,即可以通过反方向平移将图形恢复到原来的位置。

平移的应用:1. 地图上的位置标记:在地图上标注城市、河流等位置时,通过平移操作可以方便地调整它们的位置。

2. 计算机图形学:平移是计算机图形学中常用的操作,用于实现图像的平移和移动。

二、旋转旋转是指围绕某一点或轴将图形旋转一定角度的变换方式。

在平面几何中,旋转可以绕一个点或绕一个线进行。

旋转可以通过一个旋转角度和旋转中心来描述。

旋转的特点:1. 旋转保持图形的大小和形状不变,只改变其方向。

2. 旋转是可逆的,即可以通过反方向旋转将图形恢复到原来的方向。

3. 旋转中心对旋转结果有很大的影响,不同的旋转中心会产生不同的旋转效果。

旋转的应用:1. 家具摆放:在家具摆放过程中,通过旋转操作可以调整家具的方向,以适应房间的布局。

2. 地球自转:地球绕自身的轴进行自转,形成昼夜交替的现象。

三、翻转翻转是指将图形按照某一轴进行对称翻转的变换方式。

在平面几何中,常见的翻转轴有垂直翻转轴和水平翻转轴。

在三维空间中,还可以进行其他方式的翻转。

翻转的特点:1. 翻转保持图形的大小和形状不变,同时改变其方向。

2. 翻转是可逆的,即可以通过反方向翻转将图形恢复到原来的方向。

3. 翻转轴对翻转结果有很大的影响,不同的翻转轴会产生不同的翻转效果。

相对任意方向的二维几何变换

相对任意方向的二维几何变换

相对任意方向的二维几何变换平面上的二维几何变换是指将平面上的一个点或一组点通过某种规则进行变换,得到新的点或点集的过程。

这些变换可以是平移、旋转、缩放、对称等。

在本文中,将分别介绍这些二维几何变换的定义、特点和应用。

一、平移变换平移变换是指将平面上的点沿着指定的方向进行移动,距离为指定的平移向量。

平移变换的特点是保持形状和大小不变,只改变位置。

平移变换可以用向量表示,即用平移向量将原始点的坐标进行平移,得到新点的坐标。

平移变换的应用非常广泛,比如在计算机图形学中,平移变换常用于图像的移动、平面的平移等。

此外,在几何学中,平移变换也可以用于解决平面图形的位置关系、求解线段的平移等问题。

二、旋转变换旋转变换是指将平面上的点绕着指定的旋转中心按照指定的角度进行旋转。

旋转变换的特点是保持形状和大小不变,只改变方向和位置。

旋转变换可以用旋转角度和旋转中心表示,即通过旋转矩阵将原始点的坐标进行旋转,得到新点的坐标。

旋转变换的应用也非常广泛,比如在航空航天中,旋转变换常用于描述飞机的姿态变化;在计算机图形学中,旋转变换常用于图像的旋转、三维模型的旋转等。

此外,在几何学中,旋转变换也可以用于解决线段的旋转、图形的对称等问题。

三、缩放变换缩放变换是指将平面上的点按照指定的比例进行放大或缩小。

缩放变换的特点是保持形状不变,只改变大小。

缩放变换可以用缩放因子表示,即通过缩放矩阵将原始点的坐标进行缩放,得到新点的坐标。

缩放变换的应用也非常广泛,比如在计算机图形学中,缩放变换常用于图像的放大、缩小、三维模型的缩放等。

此外,在几何学中,缩放变换也可以用于解决图形的相似性判断、线段的伸缩等问题。

四、对称变换对称变换是指将平面上的点按照指定的对称中心或对称轴进行镜像。

对称变换的特点是保持形状不变,只改变方向。

对称变换可以用对称中心或对称轴表示,即通过对称变换的公式将原始点的坐标进行镜像,得到新点的坐标。

对称变换的应用也非常广泛,比如在几何学中,对称变换常用于解决图形的对称性判断、线段的对称等问题。

MFC下实现图形学之立方体平移、比例、旋转、投影变换算法

MFC下实现图形学之立方体平移、比例、旋转、投影变换算法

MFC下实现图形学之⽴⽅体平移、⽐例、旋转、投影变换算法//*********************************//绘制坐标系以及初始⽴⽅体//*********************************void CTransGraphicsView::OnDraw(CDC* pDC){CTransGraphicsDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);HBRUSH hbrush;CPen pen;HPEN hPen;// TODO: add draw code for native data herepen.CreatePen(PS_SOLID,3,RGB(255,0,0));hPen=(HPEN)pDC->SelectObject(pen);pDC->SetViewportOrg(cxClient/2,cyClient/2);pDC->MoveTo(-cxClient/2,0);pDC->LineTo(cxClient/2,0);pDC->MoveTo(0,-cyClient/2);pDC->LineTo(0,cyClient/2);pen.DeleteObject();pDC->SelectObject(hPen);this->ShadowTrans(-45);for(int i=0;i<4;i++){pDC->MoveTo(cpoints[i]);pDC->LineTo(cpoints[i+4]);}hbrush = (HBRUSH)pDC->SelectObject(GetStockObject(NULL_BRUSH)) ;pDC->Polygon(cpoints,4);pDC->Polygon(cpoints+4,4);}//********************//矩阵的乘法//*********************void CTransGraphicsView::MutiTransMarix(double a[1][4],double b[4][4],double MutiResult[1][4]){for(int i=0;i<4;i++) MutiResult[0][i] = 0;for(i=0; i<1;i++)for(int j=0;j<4;j++)for(int k=0;k<4;k++)MutiResult[i][j] += a[i][k]*b[k][j];}//******************************//将坐标转化为矩阵形式(向量)//******************************void CTransGraphicsView::TransPointToMarix(ThPoint &tp,double a[1][4]){a[0][0] = tp.x;a[0][1] = tp.y;a[0][2] = tp.z;a[0][3] = 1;}//******************************//将矩阵(向量)转化为三维坐标形式//******************************void CTransGraphicsView::TransMarixToPoint(double a[1][4],ThPoint &tp) {tp.x = a[0][0];tp.y = a[0][1];tp.z = a[0][2];}//******************************//⽴⽅体的平移算法//******************************void CTransGraphicsView::MoveTrans(double x,double y,double z){double a[8][4],result[1][4];double moveMarix[4][4] ={{1,0,0,0},{0,1,0,0},{0,0,1,0},{x,y,z,1}};for(int i=0;i<8;i++){TransPointToMarix(points[i],a+i);MutiTransMarix(a+i,moveMarix,result);TransMarixToPoint(result,points[i]);}ShadowTrans(-45);}//****************************************************//⽴⽅体的斜交投影算法(将三维坐标转化为⼆维在屏幕显⽰)//****************************************************void CTransGraphicsView::ShadowTrans(int degree){double a[8][4],result[1][4];ThPoint pts[8];for(int i=0;i<8;i++){pts[i].x = points[i].x;pts[i].y = points[i].y;pts[i].z = points[i].z;}double shadowMarix[4][4] ={{1,0,0,0},{0,1,0,0},{cos(degree),sin(degree),0,0},{0,0,0,1}};for(i=0;i<8;i++){TransPointToMarix(pts[i],a+i);MutiTransMarix(a+i,shadowMarix,result);TransMarixToPoint(result,pts[i]);}for(i=0;i<8;i++){cpoints[i].x = (int)pts[i].x;cpoints[i].y = (int)pts[i].y;}}//***************************************//⽴⽅体旋转算法,旋转中⼼可以是x,y或z轴//degree旋转的度数, rc旋转中⼼//****************************************void CTransGraphicsView::RotateTrans(double degree,CString rc) {double a[8][4],result[1][4];int i = 0;if(rc == "z"){double xRotateMarix[4][4] ={{cos(degree*3.14/180),sin(degree*3.14/180),0,0},{-sin(degree*3.14/180),cos(degree*3.14/180),0,0},{0,0,1,0},{0,0,0,1},};for(i=0;i<8;i++){TransPointToMarix(points[i],a+i);MutiTransMarix(a+i,xRotateMarix,result);TransMarixToPoint(result,points[i]);}}else if(rc == "x"){double yRotateMarix[4][4]={{1,0,0,0},{0,cos(degree*3.14/180),sin(degree*3.14/180),0},{0,-sin(degree*3.14/180),cos(degree*3.14/180),0},{0,0,0,1}};for(i=0;i<8;i++){TransPointToMarix(points[i],a+i);MutiTransMarix(a+i,yRotateMarix,result);TransMarixToPoint(result,points[i]);}}else if(rc == "y"){double zRotateMarix[4][4]={{cos(degree*3.14/180),0,-sin(degree*3.14/180),0},{0,1,0,0},{sin(degree*3.14/180),0,cos(degree*3.14/180),0},{0,0,0,1}};for(i=0;i<8;i++){TransPointToMarix(points[i],a+i);MutiTransMarix(a+i,zRotateMarix,result);TransMarixToPoint(result,points[i]);}}ShadowTrans(-45);}//*********************************//⽴⽅体的⽐例变换算法//*********************************void CTransGraphicsView::BigerOrSmallerTrans(double timeX,double timeY,double timeZ) {double a[8][4],result[1][4];double bsMarix[4][4] ={{timeX,0,0,0},{0,timeY,0,0},{0,0,timeZ,0},{0,0,0,1}};for(int i=0;i<8;i++){TransPointToMarix(points[i],a+i);MutiTransMarix(a+i,bsMarix,result);TransMarixToPoint(result,points[i]);}ShadowTrans(-45);}#endif //_DEBUG/// CTransGraphicsView message handlers//********************************//获取屏幕的⼤⼩//********************************void CTransGraphicsView::OnSize(UINT nType, int cx, int cy){CView::OnSize(nType, cx, cy);// TODO: Add your message handler code herecxClient = cx;cyClient = cy;}//*****************************************//根据对话框输⼊的参数进⾏⽐例变换//*****************************************void CTransGraphicsView::OnBgsm(){// TODO: Add your command handler code hereBGSMDialog B_dlg;if(IDOK == B_dlg.DoModal()){BiggerOrSmallerTrans(B_dlg.m_sx,B_dlg.m_sy,B_dlg.m_sz);}Invalidate();UpdateWindow();UpdateWindow();}//********************************//根据对话框输⼊的参数进⾏平移变换//********************************void CTransGraphicsView::OnMove(){// TODO: Add your command handler code hereCMoveDialog M_dlg;if(IDOK == M_dlg.DoModal()){MoveTrans(M_dlg.m_dx,M_dlg.m_dy,M_dlg.m_dz);}Invalidate();UpdateWindow();}//********************************//根据对话框输⼊的参数进⾏旋转变换//********************************void CTransGraphicsView::OnRotate(){// TODO: Add your command handler code hereRoateDialog BT_dlg;if(IDOK == BT_dlg.DoModal()){RotateTrans(BT_dlg.m_degree,BT_dlg.m_rc);}Invalidate();UpdateWindow();}//**************************************************// 根据键盘调⽤相应的算法//其中down向下平移⼀个单位,up向上平移⼀个单位,//left向左平移⼀个单位,right向右平移⼀个单位//***************************************************void CTransGraphicsView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) {// TODO: Add your message handler code here and/or call defaultswitch(nChar){case VK_DOWN:MoveTrans(0,1,0);break;case VK_UP:MoveTrans(0,-1,0);break;case VK_LEFT:MoveTrans(-1,0,0);break;case VK_RIGHT:MoveTrans(1,0,0);break;}Invalidate();UpdateWindow();CView::OnKeyDown(nChar, nRepCnt, nFlags);CView::OnKeyDown(nChar, nRepCnt, nFlags);}//******************************************************// 根据键盘字符键调⽤相应的算法//其中x以x轴为旋转中⼼旋转⼀度,y以y轴为旋转中⼼旋转⼀度,//z以z轴为旋转中⼼旋转⼀度,b变⼤,s缩⼩//*******************************************************void CTransGraphicsView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) {// TODO: Add your message handler code here and/or call defaultswitch(nChar){case 'x':RotateTrans(1,"x");break;case 'y':RotateTrans(1,"y");break;case 'z':RotateTrans(1,"z");break;case 'b':BiggerOrSmallerTrans(1.1,1.1,1.1);break;case 's':BiggerOrSmallerTrans(0.9,0.9,0.9);break;}Invalidate();UpdateWindow();CView::OnChar(nChar, nRepCnt, nFlags);}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MFC空间几何变换之图像平移、镜像、旋转、缩放详解一. 图像平移前一篇文章讲述了图像点运算(基于像素的图像变换),这篇文章讲述的是图像几何变换:在不改变图像容的情况下对图像像素进行空间几何变换的处理方式。

点运算对单幅图像做处理,不改变像素的空间位置;代数运算对多幅图像做处理,也不改变像素的空间位置;几何运算对单幅图像做处理,改变像素的空间位置,几何运算包括两个独立的算法:空间变换算法和灰度级插值算法。

空间变换操作包括简单空间变换、多项式卷绕和几何校正、控制栅格插值和图像卷绕,这里主要讲述简单的空间变换,如图像平移、镜像、缩放和旋转。

主要是通过线性代数中的齐次坐标变换。

图像平移坐标变换如下:运行效果如下图所示,其中BMP图片(0,0)像素点为左下角。

其代码核心算法:1.在对话框中输入平移坐标(x,y) m_xPY=x,m_yPY=y2.定义Place=dlg.m_yPY*m_nWidth*3 表示当前m_yPY行需要填充为黑色3.新建一个像素矩阵ImageSize=new unsigned char[m_nImage]4.循环整个像素矩阵处理for(int i=0 ; i<m_nImage ; i++ ){if(i<Place) {ImageSize[i]=black;continue;}//黑色填充底部从小往上绘图else if(i>=Place && countWidth<dlg.m_xPY*3) {//黑色填充左部分ImageSize[i]=black;countWidth++; continue;}else if(i>=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,确定为默认按钮。

设置成下图对话框:第三步:在对话框资源模板空白区域双击鼠标—Create a new class创建一个新类--命名为CImagePYDlg。

会自动生成它的.h和.cpp文件。

打开类向导(Ctrl W),选择类名:CImagePYDlg添加成员变量如下图所示,同时在Message Maps中生成ID_JHBH_PY实现函数。

第四步:在CImageProcessingView.cpp中添加头文件#include "ImagePYDlg.h",并实现平移。

[cpp]view plain copy1./********************************************************/2./*图像空间几何变换:图像平移ID_JHBH_PY(几何变换-平移)3./*使用平移对话框:CImagePYDlg dlg4./*算法:f(x,y)=f(x+x0,y+y0)图像所有点平移,空的补黑'0'5./*注意该图像平移方法只是从左上角(0,0)处开始平移6./*其他方向原理相同自己去实现7./********************************************************/8.9.void CImageProcessingView::OnJhbhPy()10.{11.if(numPicture==0){12.AfxMessageBox("载入图片后才能空间平移!",MB_OK,0);13.return;14.}15.//定义采样对话框也是用来空间变换平移的坐标16.CImagePYDlg dlg;17.if(dlg.DoModal()==IDOK)//显示对话框18.{19.//采样坐标最初为图片的自身像素20.if(dlg.m_xPY>m_nWidth||dlg.m_yPY>m_nHeight){21.AfxMessageBox("图片平移不能为超过原图长宽!",MB_OK,0);22.return;23.}24.AfxMessageBox("图片空间变换-平移!",MB_OK,0);25.26.//打开临时的图片读写文件27.FILE*fpo=fopen(BmpName,"rb");28.FILE*fpw=fopen(BmpNameLin,"wb+");29.fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);30.fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);31.fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);32.fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);33.fread(m_pImage,m_nImage,1,fpo);34.35./************************************************************/36./*图片空间变换-平移37./*坐标(dlg.m_xPY,dlg.m_yPY)表示图像平移的坐标38./*先用Plave计算出平移后的起始坐标,其他的坐标赋值为'0'黑色39./*然后依次平移坐标,空的赋为黑色,否则填充40./************************************************************/41.42./******************************************************************/43./*严重错误1:数组变量赋值相等44./*在View.h中定义变量BYTE*m_pImage读入图片数据后的指针45./*建立临时变量数组,让它平移变换unsigned char*ImageSize46./*ImageSize=m_pImage(错误)47./*会导致ImageSize赋值变换时m_pImage也产生了变换,所以输出全为黑色48./*因为它俩指向了相同的数组地址49./*解决方法:使用下面C++的new方法动态分配或for循环i=m_nImage赋值50./******************************************************************/51.52./*临时变量存储的像素与m_pImage相同,便于处理图像*/53.unsigned char*ImageSize;54.ImageSize=new unsigned char[m_nImage];//new和delete有效的进行动态存的分配和释放55.56.int Place;//建立临时坐标记录起始坐标(0,0)平移过来的位置57.int m_pImagePlace;//原始图像平移为(0,0)图像把它平移到Place位置58.unsigned char black;//填充黑色='0'59.60./************************************************************/61./*for(int i=0;i<m_nHeight;i++)62./*for(int j=0;j<m_nWidth;j++)63./*不能使用的上面的因为可能图像的最后一行没有完整的一行像素64./*这样会出现exe报错,使用m_nImage读写所有像素比较正确65./************************************************************/66.67.Place=dlg.m_yPY*m_nWidth*3;//前m_yPY行都要填充为黑色68.black=0;//颜色为黑色69.m_pImagePlace=0;//图像处事位置为(0,0),把该点像素平移过去70.int countWidth=0;//记录每行的像素个数,满行时变回071.int number=0;//数字记录使用的像素行数,平移时使用72.73.for(int i=0;i<m_nImage;i++)74.{75./*如果每行的像素填满时清为0*/76.if(countWidth==m_nWidth*3){77.countWidth=0;78.}79.80./*第一部分:到平移后像素位置前面的所有像素点赋值为黑色*/81.if(i<Place){82.ImageSize[i]=black;//赋值为黑色83.continue;84.}85.86./*第二部分:平移区域的左边部分赋值为黑色*/87.else if(i>=Place&&countWidth<dlg.m_xPY*3){//RGB乘388.ImageSize[i]=black;//赋值为黑色89.countWidth++;90.continue;91.}92.93./****************************/94./*各部分如图所示:95./*00000000000000000000000096./*00000000000000000000000097./*0000000.................98./*0000000.................99./*0000000.................100./*0000000.................101./*点表示像素部分,0为黑色102./****************************/103.104./*重点错误提示:由于bmp图像显示是从左下角开始存储(0,0)点所以输出图像为*/ 105./*bmp图像是从左下角到右上角排列的*/106.107./****************************/108./*各部分如图所示:109./*0000000.................110./*0000000.................111./*0000000.................112./*0000000.................113./*000000000000000000000000114./*000000000000000000000000115./*点表示像素部分,0为黑色116./****************************/117.118./*第三部分:图像像素平移区域*/119.else if(i>=Place&&countWidth>=dlg.m_xPY*3)120.{121.ImageSize[i]=m_pImage[m_pImagePlace];122.m_pImagePlace++;123.countWidth++;124.if(countWidth==m_nWidth*3)125.{126.number++;127.m_pImagePlace=number*m_nWidth*3;128.}129.}130.}131.132.fwrite(ImageSize,m_nImage,1,fpw);133.fclose(fpo);134.fclose(fpw);135.numPicture=2;136.level=200;//200表示几何变换137.Invalidate();138.}139.}同时在ShowBitmap中添加level标记重新绘制图片,代码如下:[cpp]view plain copy1.else//图像几何变换2.if(level=200)3.{4.m_hBitmapChange=(HBITMAP)LoadImage(NULL,BmpNameLin,IMAGE_BITMAP,0,0,5.LR_LOADFROMFILE|LR_DEFAULTSIZE|LR_CREATEDIBSECTION);6.}运行时需要注意一点:BMP图像在处理过程中可能会出现一些斜线,而平移(40,60)位移量时可能出现如下。

相关文档
最新文档