前言
上一篇文章,我们讲解了图像金字塔,这篇文章我们来了解仿射变换。
仿射?!
任何仿射变换都可以转换成,乘以一个矩阵(线性变化),再加上一个向量(平移变化)。
实际上仿射是两幅图片的变换关系。
例如我们可以通过仿射变换对图片进行:缩放、旋转、平移等操作。
一个数学问题
在解决仿射问题前,我们来做一个数学题。
如图,对于点(x1, y1),相对于原点旋转一个角度a,那么这个点到哪里了呢?
我们将坐标系变成极坐标系,则点(x1, y1)就变成了(r, β),而旋转后变成(r, α + β)。
转回直角坐标系,则旋转后的点变成了(cos(α + β) * r, sin(α + β) * r)。
然后利用公式:
cos(α+β)=cosαcosβ-sinαsinβ
sin(α+β)=sinαcosβ+cosαsinβ
以及原来点为(cosβ * r, sinβ * r),于是很容易得出新的点为(x1 * cosα - y1 * sinα, x1 * sinaα + y1 * cosα)。
我们可以从中推导出旋转变换公式:
那么平移就相对简单很多了,就相当于加上一个向量(c, d)就行了。
获得变换矩阵函数实现
通常我们使用矩阵来表示仿射变换。
其中A是旋转缩放变换,B是平移变换。则结果T满足:
或者
即:
var getRotationArray2D = function(__angle, __x, __y){ var sin = Math.sin(__angle) || 0, cos = Math.cos(__angle) || 1, x = __x || 0, y = __y || 0; return [cos, -sin, -x, sin, cos, -y ]; };
这样我们就得到了一个仿射变换矩阵。
当然这个实现本身是有一定问题的,因为这个原点被固定在左上角了。
仿射变换实现
var warpAffine = function(__src, __rotArray, __dst){ (__src && __rotArray) || error(arguments.callee, IS_UNDEFINED_OR_NULL/* {line} */); if(__src.type && __src.type === "CV_RGBA"){ var height = __src.row, width = __src.col, dst = __dst || new Mat(height, width, CV_RGBA), sData = new Uint32Array(__src.buffer), dData = new Uint32Array(dst.buffer); var i, j, xs, ys, x, y, nowPix; for(j = 0, nowPix = 0; j < height; j++){ xs = __rotArray[1] * j + __rotArray[2]; ys = __rotArray[4] * j + __rotArray[5]; for(i = 0; i < width; i++, nowPix++, xs += __rotArray[0], ys += __rotArray[3]){ if(xs > 0 && ys > 0 && xs < width && ys < height){ y = ys | 0; x = xs | 0; dData[nowPix] = sData[y * width + x]; }else{ dData[nowPix] = 4278190080; //Black } } } }else{ error(arguments.callee, UNSPPORT_DATA_TYPE/* {line} */); } return dst; };
这个函数先把矩阵数据变成32位形式,操作每个元素就等同于操作每一个像素。
然后遍历所有元素,对对应的点进行赋值。
效果
系列目录
相关推荐
OpenCV-Python图像处理:仿射变换详解及案例.rar
对图像块应用仿射变换,我们将其称为图像扭曲(或者仿射扭曲)。该操作不仅经常应用在计算机图形学中,而且经常出现在计算机视觉算法中。 一、仿射变换原理 仿射变换能够保持图像的“平直性”,包括旋转,缩放,平移...
【图像几何】图像空间变换(仿射变换)含Matlab源码.zip
C++与opencv实现常用图像处理与仿射变换 包括 旋转、平移、缩放、偏移、组合变换等
上一篇文章,我们讲解了图像金字塔,这篇文章我们来了解仿射变换。 仿射? 任何仿射变换都可以转换成,乘以一个矩阵(线性变化),再加上一个向量(平移变化)。 实际上仿射是两幅图片的变换关系。 例如我们可以通过...
摘要:讨论了仿射变换原理,阐述了仿射变换系统的方案设计,给出了系统的功能框图并详细介绍主要模块的功能以及实现方法} 最后给出该系统在医疗装备中的运用结果。结果表
基于归一化图像的抗仿射变换攻击的水印算法,希望对做水印的人能有帮助。 谢谢。
C# GDI+操作图像放大缩小,仿射变换等DEMO
简单的2D变换引擎 可以进行 图像的透视,仿射变换
采用opencv对图像进行仿射变换,修改代码的程序可以改变旋转的任意角度
仿射变换(Affine Transformation)matlab代码,
该算法对水印图像的预处理采用有限整数域上的拟仿射变换,拟仿射变换有较好的置乱效果及较大的置乱周期,从图像信息加密的安全性角度来看,它优于Arnold等常见的几何置乱变换,利用混沌序列提取原始图像的若干块组...
1.图像仿射变换 2.图像透视变换 3.基于图像透视变换的图像校正 4.图像几何变换总结
对图像进行仿射变换操作,可以打开图像,保存处理完毕后的图像。
实现了基于控制点的仿射变换图像配准,使用C++语言实现
数字图像处理,图像灰度变换,拉伸,仿射变换
opencv图像处理 opencv图像处理_opencv图像处理算法之仿射变换_包括旋转+平移+缩放+组合变换
基于OpenCV的图像仿射变换,包括图像的旋转等。