javascript图像处理—仿射变换深度理解


Posted in Javascript onJanuary 16, 2013

前言

上一篇文章,我们讲解了图像金字塔,这篇文章我们来了解仿射变换。

仿射?

任何仿射变换都可以转换成,乘以一个矩阵(线性变化),再加上一个向量(平移变化)。

实际上仿射是两幅图片的变换关系。

例如我们可以通过仿射变换对图片进行:缩放、旋转、平移等操作。

一个数学问题

在解决仿射问题前,我们来做一个数学题。

javascript图像处理—仿射变换深度理解

如图,对于点(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α)。

我们可以从中推导出旋转变换公式

javascript图像处理—仿射变换深度理解

那么平移就相对简单很多了,就相当于加上一个向量(c, d)就行了。

获得变换矩阵函数实现

通常我们使用javascript图像处理—仿射变换深度理解矩阵来表示仿射变换。

javascript图像处理—仿射变换深度理解

其中A是旋转缩放变换,B是平移变换。则结果T满足:

javascript图像处理—仿射变换深度理解 或者 

javascript图像处理—仿射变换深度理解

即:javascript图像处理—仿射变换深度理解

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位形式,操作每个元素就等同于操作每一个像素。

然后遍历所有元素,对对应的点进行赋值。

效果

 javascript图像处理—仿射变换深度理解

Javascript 相关文章推荐
分页栏的web标准实现
Nov 01 Javascript
两个listbox实现选项的添加删除和搜索
Mar 01 Javascript
JS 跳转页面延迟2种方法
Mar 29 Javascript
使用typeof判断function是否存在于上下文
Aug 14 Javascript
JQuery的Ajax中Post方法传递中文出现乱码的解决方法
Oct 21 Javascript
javascript数组去重的六种方法汇总
Aug 16 Javascript
星期几的不同脚本写法(推荐)
Jun 01 Javascript
微信小程序 传值取值的几种方法总结
Jan 16 Javascript
对vue里函数的调用顺序介绍
Mar 17 Javascript
Vue实现一个无限加载列表功能
Nov 13 Javascript
跨域解决之JSONP和CORS的详细介绍
Nov 21 Javascript
JS常用排序方法实例代码解析
Mar 03 Javascript
用js获取电脑信息(是使用与IE浏览器)
Jan 15 #Javascript
使用jQuery fancybox插件打造一个实用的数据传输模态弹出窗体
Jan 15 #Javascript
尝试在让script的type属性等于text/html
Jan 15 #Javascript
Js-$.extend扩展方法使方法参数更灵活
Jan 15 #Javascript
js弹出框轻量级插件jquery.boxy使用介绍
Jan 15 #Javascript
jquery.boxy弹出框(后隔N秒后自动隐藏/自动跳转)
Jan 15 #Javascript
SOSO地图API使用(一)在地图上画圆实现思路与代码
Jan 15 #Javascript
You might like
PHP写入WRITE编码为UTF8的文件的实现代码
2008/07/07 PHP
php class中public,private,protected的区别以及实例分析
2013/06/18 PHP
php调用MySQL存储过程的方法集合(推荐)
2013/07/03 PHP
CodeIgniter错误mysql_connect(): No such file or directory解决方法
2014/09/06 PHP
让回调函数 showResponse 也带上参数的代码
2007/08/13 Javascript
使用Microsoft Ajax Minifier减小JavaScript文件大小的方法
2010/04/01 Javascript
js实现GridView单选效果自动设置交替行、选中行、鼠标移动行背景色
2010/05/27 Javascript
8个实用的jQuery技巧
2014/03/04 Javascript
javascript实现动态改变层大小的方法
2015/05/14 Javascript
一种Javascript解释ajax返回的json的好方法(推荐)
2016/06/02 Javascript
bootstrap日历插件datetimepicker使用方法
2016/12/14 Javascript
ionic cordova一次上传多张图片(类似input file提交表单)的实现方法
2016/12/16 Javascript
angular.js指令中transclude选项及ng-transclude指令详解
2017/05/24 Javascript
微信小程序搜索组件wxSearch实例详解
2017/06/08 Javascript
JavaScript实现单击网页任意位置打开新窗口与关闭窗口的方法
2017/09/21 Javascript
微信小程序的生命周期的详解
2017/10/19 Javascript
js简单的分页器插件代码实例
2019/09/11 Javascript
[02:55]2018DOTA2国际邀请赛勇士令状不朽珍藏Ⅲ饰品一览
2018/08/01 DOTA
Python中urllib+urllib2+cookielib模块编写爬虫实战
2016/01/20 Python
python编程测试电脑开启最大线程数实例代码
2018/02/09 Python
python计算两个数的百分比方法
2018/06/29 Python
python 解决动态的定义变量名,并给其赋值的方法(大数据处理)
2018/11/10 Python
Python设计模式之桥接模式原理与用法实例分析
2019/01/10 Python
python tkinter库实现气泡屏保和锁屏
2019/07/29 Python
python tkinter GUI绘制,以及点击更新显示图片代码
2020/03/14 Python
Python+pyftpdlib实现局域网文件互传
2020/08/24 Python
安全标准化实施方案
2014/02/20 职场文书
幼儿园毕业寄语
2014/04/03 职场文书
好习惯伴我成长演讲稿
2014/05/21 职场文书
2014年大学团支部工作总结
2014/12/02 职场文书
长城英文导游词
2015/01/30 职场文书
博士生专家推荐信
2015/03/25 职场文书
承诺书模板大全
2015/05/04 职场文书
老员工辞职信范文
2015/05/12 职场文书
家长意见和建议怎么写
2015/06/04 职场文书
工作服管理制度范本
2015/08/06 职场文书