下载示例(因为你看到的有可能是导入后的文章,示例文件如果不能下载请登录www.lizhecome.com)
Transformation.7z (46.65 kb)

说明:

在.NET中,利用System.Drawing.Drawing2D命名空间下的Matrix类,可以使对二维图像坐标转换的处理大大简化,在这篇文章中,我将向读者分享如何利用Matrix类进行二维图像的坐标转换。

背景知识:

Matrix类中描述了3行2列的六个项,举个例子,对Matrix使用默认的构造方法进行构造时,默认构造方法的参数为( 1,0,0,1,0,0 ),矩阵描述如下

这是下面这个矩阵的简化

最后一列始终为

因此,一个X轴方向移动3,Y轴方向移动2的的平移变换可以被表示成如下形式:

 但实际上内部的表示为

需要说明一点,变换矩阵是对图像矢量做右乘.举一个例子,我们现在有这样一个图形,包含4个点:(1,1) ( 2,3) (5,0) (6 7),这个图形向量可以被表示成一个4行2列的矩阵:

 但实际上内部的表示为

当我们将变换矩阵应用到这个图像矩阵时,变换矩阵是对图像矩阵的右乘

结果矩阵的最后一列是被忽略的,因此变换结果为四个新点(4,3) (5,5) (8,2) (9,9)

一个复合变换由两个以上的矩阵组成,我们看一个例子,一个X轴分量为2,Y轴分量为3的缩放矩阵如下图所示:

 但实际上内部的表示为

当我们进行一个先平移再缩放的复合变换时,缩放矩阵应该右乘平移矩阵,

同样,如果我们进行一个先缩放再平移的坐标变换时平移矩阵应该右乘缩放矩阵.

右乘也叫做追加矩阵,左乘叫做前置矩阵,左边的矩阵总是先被应用的.

矩阵转换:

这篇文章中,只针对以下四种变换:

(1)旋转

(2)平移

(3)缩放

(4)翻转

如何实例化一个Matrix类:

//这会创建一个单位矩阵(1,0,0,1,0,0)Matrix m=new Matrix();

也可以在实例化时设置初始值
 //这会创建一个矩阵(1,2,3,4,5,6)Matrix m=new Matrix(1,2,3,4,5,6);

Matrix类实现了多种方法

Rotate

Translate

Scale

Multiply

要创建一个复合矩阵,先要创建一个单位矩阵,然后用以上的方法来追加或者前置(append/prepend)变换

Matrix m=new Matrix();//从初始点移动至200,200m.Translate(200,200);
//顺时针旋转90度m.Rotate(90,MatrixOrder.Prepend);
在上面的代码中,因为旋转矩阵是前置矩阵,所以旋转操作会首先被应用
在矩阵变换中,变换的先后顺序是非常重要的,先平移后旋转还是先旋转后平移,结果会有很大不同(旋转时根据原点的).如下图所示
 

应用Matrix对象
下面的三个GDI+对象应用了Matrix对象
Graphics
Pen
GraphicsPath
以上每个对象都包含了Transform属性,这个属性是Matrix类型的,默认的Transform属性是一个单位矩阵,所有的绘制操作都会遵循各自的Transform属性
因此举个简单的例子,如果将顺时针旋转45度的变换矩阵赋给了Graphics对象的Transform属性,然后画一条水平线,这条线会被呈现为倾斜45度.
矩阵变换应用在GraphicsPath对象上时特别有意思,当Transform属性属性被赋值时,GraphicsPath对象中的PathPoints会立即被更改以反映此次变换.
利用这一行为我们可以在GraphicsPath对象上进行变换,并用DrawImage方法来呈现这次变换
    Graphics g=Graphics.FromImage(pictureBox1.Image);//..GraphicsPath gp=new GraphicsPath();Image imgpic=(Image)pictureBoxBase.Image.Clone();//多边形的坐标必须为//point 1 = 左上角//point 2 = 右上角//point 3 = 右下角if(cbFlipY.CheckState ==CheckState.Checked)gp.AddPolygon(new Point[]{new Point(0,imgpic.Height), new Point(imgpic.Width,imgpic.Height), new Point(0,0)});elsegp.AddPolygon(new Point[]{new Point(0,0), new Point(imgpic.Width,0), new Point(0,imgpic.Height)});//apply the transformation matrix on the graphical pathgp.Transform(mm1);//get the resulting path pointsPointF[] pts=gp.PathPoints;//draw on the picturebox content of imgpic using the local transformation //using the resulting parralleogram described by ptsg.DrawImage(imgpic,pts);

翻转:
很遗憾,Matrix类型中没有关于翻转的方法,但是翻转矩阵大家都知道,对于沿X轴翻转,矩阵为(1,0,0,-1,0,0),沿Y轴旋转,矩阵为
(-1,0,0,1,0,0)
仿射变换:
矩阵变换不仅是简单的点到点的变换
举个例子,有一个矩形,顶点为(0,0) (0,1) (1,1) (1,0),如果单位是像素,那么组成这个矩阵的就是这四个点,如果我们对这个矩阵进行X轴Y轴分量都为2,相对于(0,0)进行缩放,那么结果矩形的四个顶点为(0,0) (0,2) (2,2) (2,0),它还包含四个顶点之间的其他点,为什么四个点的图形被转换成了多于四个点的图形呢?
答案就是,变换操作利用插值来产生哪些不能直接映射的点(未知像素的值使用已知像素的值来估计)

转载于:https://www.cnblogs.com/ATP/archive/2010/05/16/1736955.html

C#中的矩阵转换,应用.net GDI+相关推荐

  1. 计算机图形学中的矩阵转换

    文章目录 前言 数学背景 矩阵变换 2D/3D的平移与仿射变换 绕任意轴旋转的罗德里格旋转公式 坐标变换 附录 如何快速入门学习 虎书封面的由来 前言 刷的视频:GAMES101:现代计算机图形学入门 ...

  2. 无人机运动学控制中的坐标系,及惯性坐标系与机体坐标系之间的矩阵转换 欧拉角

    一.无人机控制中的坐标系 无人机运动学中,有三种需要了解的坐标系 1.1.地球中心坐标系(ECEF) 地球中心坐标系,即坐标系原点位于地心.X轴通过格林尼治线和赤道线的交点,正方向为原点指向交点方向. ...

  3. c语言中如何转换矩阵,2020-07-06(C语言)矩阵转换

    //C语言矩阵转换 include int main() { int a[10][10], b[10][10], r, c, i, j; printf("输入行和列:"); sca ...

  4. numpy中的矩阵与数学上的矩阵的关系

    ➤00 矢量.矩阵 在数学上,矢量和矩阵之间具有很强的联系.矢量可以看成行数.或者列数为1的矩阵.所以它可以被分成行矢量,或者列矢量. 下面分别表示了一个行矢量和一个列矢量. xˉ=[x1,x2,x3 ...

  5. android将矩阵转换成字节数组,android-使用OpenGL矩阵转换将纹理从“ 1D”映...

    (针对这个问题,我正在尝试研究解决this other one的想法) 如果我在内存中有一个标准的2D数组,其尺寸为width和height,则可以将其转换为一个长度为width * height的一 ...

  6. CNN卷积层图像和矩阵转换函数

    将图像维度转换为矩阵,和将矩阵转换为图像维度.深度学习框架都会有这样的功能. import numpy as npdef im2col(input_data, filter_h, filter_w, ...

  7. 机器学习(十一)——机器学习中的矩阵方法(1)LU分解、QR分解

    http://antkillerfarm.github.io/ 因子分析的EM估计(续) 去掉和各参数无关的部分后,可得: ∑i=1mE[logp(x(i)|z(i);μ,Λ,Ψ)]=∑i=1mE[1 ...

  8. MFC与OpenCv中的图片转换实例

    #include "AnalysisManager.h" IplImage* GetFontDiscerImage(char* sourcePath) {      //打开要识别 ...

  9. 字符串矩阵转换成长字符串_字符串矩阵

    字符串矩阵转换成长字符串 Description: 描述: In this article, we are going to see how backtracking can be used to s ...

最新文章

  1. [zz]用U盘装win7/XP系统的操作[图解]
  2. js html转图片 ie8,用js滤镜实现在IE8-的图片旋转效果实现不了
  3. Java 中引用类型
  4. mysql的代码需要保存吗_php向Mysql数据库保存数据的代码
  5. .NET存储过程入门
  6. 手动实现 NSTabViewController 的 Rect Transition 及 Propagate Title-b
  7. C#在线预览文档(word,excel,pdf,txt,png)
  8. PPT文件的密码如何破解掉
  9. 推荐给大家一个网络工程标书模版(仅供参考)
  10. 用html做自我介绍
  11. eclipse 编译Android,如何用eclipse编写android程序
  12. python模块:Sockets阻塞和非阻塞测试
  13. 加密聊天应用依然安全
  14. Hadoop-HDFS总结(五)
  15. RSA中的中国剩余定理(CRT)和多素数(multi-prime)
  16. div、span、label标签的区别
  17. 2021年中国多晶硅产量、进出口及重点企业营收情况:多晶硅产量为50.5万吨,产能约52万吨/年[图]
  18. 7005-艺赛旗RPA8.0产品介绍(2019.01)
  19. 【代码注释】浅谈对于代码注释的理解
  20. 从spaceX的火箭回收想到的一些事儿

热门文章

  1. opencv SIFT角检测
  2. Python 函数定义
  3. matlab elif,MATLAB与fftfilt相当于Python
  4. Redis学习总结(22)——Redis的主从复制是如何做的?复制过程中也会产生各种问题?
  5. Nginx学习总结(12)——Nginx各项配置总结
  6. Kubernetes学习总结(2)——Kubernetes设计架构
  7. html中只能上传文件word,HTML文件表单,接受Word文档(HTML file form, accept Word documents)...
  8. php可变函数代码,PHP可变函数
  9. php强大的函数,PHP最强大的随机字符串生成函数
  10. goldengate简单配置