`
sogotobj
  • 浏览: 647684 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

实现完整的图像平面几何变换

阅读更多

有关图像的平面几何变换,现有的教程、计算机图书以及网上的资料上介绍理论的偏多,即使有些编程实例,也只是介绍图像几何变换的某些特例,如旋转、缩放、平移等。GDI+倒是有个Matrix类,可完整地实现图像的几何变换,可惜没法得到源码。

本文将完整的实现一个类似GDI+ Matrix的C++几何变换类TransformMatrix,关于几何变换的理论及原理请参考有关书籍或资料。

下面是C++几何变换类TransformMatrix的代码:

上面代码中定义了一个几何变换矩阵成员类型MatrixElements,便于实际编程时获取或设置几何变换矩阵成员,TransformMatrix只是简单的对其进行了封装,并通过计算实现有关的几何变换。

TransformMatrix的核心代码是Multiply函数(或ElementsMultiply函数)和Invert函数。

Multiply函数可完成各种复杂的几何变换计算,所有能够实现的具体几何变换都是可以通过其完成的(代码中的平移函数Translate也可以通过其完成的,当然多了一些不必要的计算)。虽说本文标题是《实现完整的图像平面几何变换》,但TransformMatrix中的几种基础的变换函数并不代表全部的几何变换,如对称几何变换(镜像),更不用说复杂的组合变换。这倒不是本人要做“标题党”,我所说的“实现完整的图像几何变换”,是指可以通过Multiply函数或者更直接的变换矩阵成员设置去实现“完整的”图像几何变换,除非其不能使用平面几何变换矩阵进行描述(如梯形变换我就没想到怎么实现,也许其超出了平面几何变换矩阵范畴?),或者不能进行实际的几何变换(不可逆);“实现完整的图像几何变换”的另一层含义是下面的图像变换执行函数可实现TransformMatrix所能表示的任意图像几何变换,而不必去写一个个具体的,如缩放、旋转变换函数等。

Invert函数实现了变换矩阵的逆矩阵,通过这个几何变换逆矩阵,可以很方便地实现图形图像几何变换的实际操作。为什么要靠几何变换矩阵的逆矩阵,而不是直接依据变换矩阵来实现图形图像几何变换的实际操作呢?因为几何变换矩阵表示的意思是,把源图像的任意座标点通过几何变换后投影到目标图像。因为源图像像素通过几何变换后与目标图像上的像素点有可能不能一一对应,如图像缩放变换后,不是多个源图像像素点对应同一个目标像素点(缩小),就是源图像像素点不足以填充全部的目标像素点(放大),这就有可能造成目标图像像素点被重复绘制或者被遗漏的现象发生;而几何变换逆矩阵所表示的意思是,对于目标图像任意一个像素点,如果在几何变换前有源图像像素点与其对应,则进行复制。遍历目标图像像素点就能保证目标图像像素点既不重复、也不遗漏的被复制。

下面是一个图像几何变换函数代码:

上面图像几何变换函数的几个特点:

1、可以实现任意的图像几何变换(只要TransformMatrix能正确表达的,即变换矩阵可逆);

2、采用了GDI+ 的BitmapData结构(转换为32位ARGB像素格式),而并非任何具体的图像格式,保证了其通用性;

3、函数使用浮点数运算,但在计算像素点位置时避免了通常的浮点数乘除运算,既提高了一定的运算速度,也为以后修改为定点数运算奠定了基础;

4、函数采用临近像素插值,且没有边界像素处理代码,像素复制质量较差。

可以看出,Transform函数的着重点在于特点(1),在实际的实现代码中,可以把它作为一个框架进行扩充和修改。

下面是一个利用Transform函数对GDI+位图进行旋转变换的例子(使用BCB2007):

下面是图像旋转变换例子运行界面截图:

旋转45度

由于图像几何变换是以源图原点(0,0)为变换原点,所以界面上只能看到原点右下边的图像。还有些几何变换,如旋转90度、180度等,可能会导致几何变换后的图像完全不可见,为了直观的看到各种几何变换后的完整图像,可以修改一下例子代码,将TransformMatrix::GetTransformRect函数返回矩形的左上边部分也包括进来:

运行界面截图如下:

使几何变换后图像完全可见

例子代码中,被注释掉的是一些图像常用几何变换,其运行界面就不一一贴图了。

上面的例子使用的是GDI+ 位图,而我们通常使用更多的是GDI位图,下面以BCB2007的VCL位图为例作为本文结束部分:

该例子实现了图像缩放与剪切组合变换,其运行界面截图如下:

图像缩放与剪切组合变换

尽管我十分努力,但水平有限,错误在所难免,欢迎指正和指导。邮箱地址:

maozefa@hotmail.com

分享到:
评论

相关推荐

    图像处理,几何图像的变换

    透视变换考虑了视线与图像平面的关系,使得图像呈现出真实的空间感;射线变换则基于光线传播原理,广泛应用于光学成像模型。 在实际应用中,几何图像变换有着广泛的应用场景: - 图像矫正:例如,使用透视变换可以...

    齐次坐标与几何变换齐次坐标与几何变换

    齐次坐标是计算机图形学中的一种重要概念,它在几何...总结起来,齐次坐标是几何变换的有力工具,它简化了二维和三维空间中的坐标转换,同时支持多种图形变换的组合,是计算机图形学和图像处理领域不可或缺的基础概念。

    MATLAB数字图像处理几何变换傅里叶变换.docx (2).docx

    几何变换保持像素值不变,仅调整像素在图像平面上的排列。 **一、图像平移** 图像平移是将图像整体沿水平或垂直方向移动。MATLAB中可以使用图像坐标平移的方法实现,例如,将图像向右平移50个像素,向下平移100个...

    利用C++实现数字图像的GeoTrans变换

    GeoTrans变换是一种在数字图像处理领域中常见的几何变换方法,主要用于改变图像的位置、大小、形状或方向。在C++中实现这种变换,涉及到的主要知识点包括图像处理基础、矩阵运算、坐标映射以及OpenCV等图像处理库的...

    数字图像处理图像的几何变换PPT学习教案.pptx

    在数字图像处理领域,图像的几何变换是一种重要的技术,它涉及到图像在空间位置和形状上的变化。本PPT学习教案详细介绍了这一主题,包括图像的形状变换和位置变换,以及图像的仿射变换。 首先,图像的形状变换是...

    12.图像几何变换之图像仿射变换、图像透视变换和图像校正.pdf

    ### 图像几何变换详解 #### 一、图像仿射变换 **定义与原理:** 图像仿射变换是一种基本的图像几何变换方式,它保持了图像中的平行性和直线性不变。在数学上,图像仿射变换可以理解为在一个二维平面内进行的一次...

    计算机图形学图象几何变换

    在计算机图形学中,图像几何变换是不可或缺的基础概念和技术,它涉及到图像在二维或三维空间中的位置、形状和大小的变化。这篇文档将深入探讨图像几何变换的原理、方法以及在三维图形中的应用。 首先,我们要理解...

    图像的几何变换,包括镜像,旋转,转职,平移等

    在图像处理领域,几何变换是不可或缺的一部分,它主要用于改变图像的位置、方向或形状。本教程主要探讨了如何使用OpenCV库和C++编程语言来实现几种基本的几何变换:镜像、旋转、转置和平移。这些操作对于图像分析、...

    图像的几何变换和曲线绘制

    在图像处理领域,几何变换和曲线绘制是两个重要的概念,它们在数字图像处理、计算机图形学、游戏开发以及视觉艺术中都有广泛的应用。本篇将深入探讨这些知识点,并结合"ImgViewer"这一可能的图像查看或编辑软件进行...

    EmguCV基础视频教程 (图像几何变换)_CSharpEmguCV_图像处理_

    在Lesson12中,你可能会学习到如何实现一个具体的几何变换项目,例如将一张倾斜的图片校正为水平,或者将图像进行旋转以适应特定角度。这通常涉及获取图像的边界框,计算变换矩阵,然后应用变换。过程中,你还会接触...

    二维/三维图形的几何变换(基于OpenGL)

    本资源提供了支持多种几何变换的代码实现,包括平移、旋转、对称、投影和错切等,这些都是构建复杂图形和场景的基础。 一、平移(Translation) 平移变换是将图形在空间中移动的操作,通常通过向图形的位置坐标添加...

    2二维基本几何变换算法.zip

    二维几何变换主要涉及将二维平面上的图形进行移动、旋转、缩放、倾斜等操作。这些变换可以表示为矩阵运算,通过矩阵与向量的乘法实现。常见的二维几何变换包括平移、旋转、缩放和剪切。 二、平移变换 平移变换是最...

    案例11-二维图形几何变换算法.rar_二维几何变换_二维图形几何变换_二维图形变换_几何变换_几何图形

    在计算机图形学中,二维几何变换是至关重要的一个领域,它涉及到如何在平面上改变图形的位置、大小和形状。这个主题通常与编程语言如C++相结合,用于创建复杂的图形应用程序。"案例11-二维图形几何变换算法.rar"很...

    tuxingdebianhuanpingyi.rar_二维 图形 几何变换_二维图形的几何变换_图形的几何变换

    二维图形的几何变换是计算机图形学中的一个基础概念,它主要涉及如何在平面上改变图形的位置、大小和方向。在给定的标题“tuxingdebianhuanpingyi.rar”中,提到了“二维图形的几何变换”,这通常指的是在二维坐标系...

    matlab数字图像处理之几何变换将图像贴在抛物面上

    将图片CololfulRose贴在半抛物面上,画出正视图和俯视图

    根据自定义的单应变换矩阵,对图像进行单应变换

    单应变换是计算机视觉领域中的一个重要概念,它用于描述二维图像在平面空间中的几何变换,如平移、旋转、缩放、仿射变换等。在实际应用中,单应变换矩阵(Homography Matrix,通常表示为 \( H \))是一个3x3的矩阵,...

    图像几何校正(含程序、源码)

    总结,这个压缩包提供了一个用C#实现的图像几何校正工具,包含了从图像读取、模型构建到坐标变换的完整流程,同时具备精度评估功能,对于学习和实践图像处理的C#开发者来说,是一个宝贵的资源。通过深入研究源码,...

    空间几何变换1

    总结来说,空间几何变换是研究几何对象在不同坐标系之间变化的理论,主要包括射影变换、仿射变换、比例变换和等距变换,它们在计算机图形学、图像处理、机器人学等领域有着广泛的应用。通过矩阵运算和齐次坐标,我们...

    根据两张图片中的特征点对,求解出其单应矩阵或者变换矩阵 多几何视图

    OpenCV库提供了强大的功能来处理特征检测、匹配和几何变换。在这个任务中,我们首先需要对图片进行特征检测,如SIFT、SURF或ORB等方法,找出具有显著性的关键点。然后,使用特征匹配算法,如BFMatcher或FLANN,找到...

    位图的几何变换(缩放、旋转、镜像等)

    位图的几何变换是图像处理领域中的重要概念,主要涉及位图(Bitmap,简称bmp)在二维空间中的形状改变,包括缩放、旋转和镜像等操作。这些变换可以用于图像编辑、游戏开发、视觉效果等多种场景。接下来,我们将详细...

Global site tag (gtag.js) - Google Analytics