`
emowuyi
  • 浏览: 1480961 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

有关图像的平面几何变换,现有的教程、计算机图书以及网上的资料上介绍理论的偏多,即使有些编程实例,也只是介绍图像几何变换的某些特例,如旋转、缩放、平移等。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数字图像处理之几何变换将图像贴在抛物面上

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

    图像采集中需要将3-D客观场景投影到2-D图像平面问题.pdf

    图像采集中需要将3-D客观场景投影到2-D图像平面。这个投影可用几何透视变换(也称为成像变换)描述。如图2.1所示为一个成像过程的几何模型示意图14]。这里摄像机坐标系统xyz中的图像平面与xy平面重合而光学轴(由...

    Matlab的图像分析和图像压缩

    (2)图像的几何变换:放大或缩小imresize、图像旋转imrotate、图像切割imcrop。 2.整幅图像的DCT压缩于解压缩: (1)彩色图像转灰度:rgb2gray; (2)DCT正逆变换:DCT/iDCT2。 3.分块图像的DCT压缩与解压缩 (1)...

    数字图像处理大作业合集-四次数字图像处理大作业.zip

    完成图像的基本操作:加、求反、几何变换 完成图像的直方图均衡化处理 大作业内容(2) FFT作业说明 实现图像的FFT变换和显示 实现FFT反变换 大作业内容(3) 对于图1中XY平面上的边界,对其进行傅里叶描述子的表示...

    数字图像处理大作业合集-四次数字图像处理大作业(95分以上项目).zip

    RAW格式文件的读取、显示,以及与BMP格式的转换,完成图像的基本操作:加、求反、几何变换,完成图像的直方图均衡化处理。 大作业内容(2)FFT作业说明,实现图像的FFT变换和显示,实现FFT反变换 大作业内容(3)...

    论文研究-NSCT变换和小波包变换相结合的图像隐藏方法.pdf

    提出了一种基于NSCT变换和小波包变换相结合的可见光图像隐藏方法,利用NSCT变换将载体图像分解为低频子带和一组高频子带,对低频子带进行二级小波包分解,通过奇异值变换将秘密图像重要位平面信息隐藏在小波包分解...

    论文研究-基于平面几何处理的贝氏体组织分割.pdf

    借鉴Contourlet变换和WBCT的思想,采用Contourlet和小波相结合的变换,并根据变换后系数的特殊结构,提出了一种新的空间方向树结构,实现了对变换后系数的类似SPIHT编码,达到了对图像压缩的目的。实验表明,该算法...

    基于空间平面分割和投影变换的光场图像拼接算法

    提出了一种基于空间平面分割和投影变换的光场图像拼接算法。依据光场深度信息对目标场景进行平面拟合和分割,并根据颜色信息利用马尔可夫模型对分割结果进行了优化。利用不同视点间的光流信息求解投影变换矩阵,将...

    鱼眼图像的校正与柱面全景拼接方法

    全景图像拼接是将多幅有重叠区域的图像拼接成全视角360o的平面图像。全景图像拼接技术是一种基于图像绘制技术、图像处理及计算机几何学等多领域的综合技术,由于对硬件要求低,真实感较好等优点,是目前虚拟现实、三...

    机器视觉学习之全景拼接

    然后将所有的图像扭曲到一个公共的图像平面上。 图像拼接的几何原理:全景融合的 3D 几何解释,图像被投影到共同的拼接平面上(同一坐标系), 在拼接平面上实现全景融合。在拼接的应用中,其实可以简化理解为 2D...

    遥感资料(一)+影像校正+辐射误差、几何误差+学习了解

    几何校正是指利用地面控制点或其他参考影像,建立影像与地图或其他影像之间的几何变换关系,通过空间插值和亮度插值,将影像上的像元映射到正确的平面坐标位置。几何校正的方法有从影像到地图的校正、从影像到影像的...

    对极几何_三角测量_双目视觉.zip

    环境:c++版本、OpenCV 4.5.3、...antipolar_geometry:库函数,功能包括:对极几何,计算两幅图像之间的位姿变换 triangulation:库函数,功能包括:三角测量,还原landmark标志点深度信息,得到landmark标志点3D坐标

    Python数字图像处理之霍夫线变换实现详解

    在图片处理中,霍夫变换主要是用来检测图片中的几何形状,包括直线、圆、椭圆等。 在skimage中,霍夫变换是放在tranform模块内,本篇主要讲解霍夫线变换。 对于平面中的一条直线,在笛卡尔坐标系中,可用y=mx+b来...

    gyrator变换域局域随机相位编码算法

    gyrator变换域局域随机相位编码算法,刘正君,,基于gyrator变换提出一种局域随机相位编码算法。在原图像及其频谱平面进行局域的随机相位编码加密数据。其中定义局域区域的几何参�

    傅里叶变换在人眼轮廓拟合和人眼几何参数计算中的应用

    该方法将在复平面内的人眼轮廓分别做实轴和虚轴上的投影,然后对所得到的两种信号做傅里叶变换。用经过傅里叶变换后得到的傅里叶系数既可以拟合出人眼的轮廓也可以计算人眼的几何参数。其他方法相比,这种方法可以很...

    计算机图形学基础-pdf.zip

    7.1.3平面几何投影 7.2三维几何变换 7.2.1三维基本几何变换 7.2.2三维复合变换 7.3三维投影变换 7.3.1正投影 7.3.2斜投影 7.4透视投影 7.4.1一点透视 7.4.2二点透视 7.4.3三点透视 7.5观察...

    论文研究-基于CGA理论的虹膜定位算法的研究.pdf

    该方法首先在对图像进行预处理的基础之上,运用共形几何代数理论的思想,将欧氏空间中的几何量变换到共形几何代数空间中去,这些几何量在共形几何代数空间中都是以统一的矢量形式表示,从而使这些几何量之间的计算...

    matlab霍夫变换函数代码-IPCVProjectGroup15:IPCVProjectGroup15

    matlab霍夫变换函数代码足球虚拟广告 ...通过该变换,确定了4个参考点,这些参考点被跟踪并为计算投影几何变换奠定了基础,该投影几何变换表示从世界坐标系到像平面的变换。 通过跟踪这些点,横幅将根据视频动态移动。

Global site tag (gtag.js) - Google Analytics