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 相关文章推荐
Javascript的各种节点操作实例演示代码
Jun 27 Javascript
如何让页面在打开时自动刷新一次让图片全部显示
Dec 17 Javascript
JS、CSS以及img对DOMContentLoaded事件的影响
Aug 12 Javascript
PHP使用方法重载实现动态创建属性的get和set方法
Nov 17 Javascript
Javascript编程之继承实例汇总
Nov 28 Javascript
JS常见问题之为什么点击弹出的i总是最后一个
Jan 05 Javascript
jquery分页插件jquery.pagination.js实现无刷新分页
Apr 01 Javascript
多功能jQuery树插件zTree实现权限列表简单实例
Jul 12 Javascript
node.js中实现kindEditor图片上传功能的方法教程
Apr 26 Javascript
socket.io与pm2(cluster)集群搭配的解决方案
Jun 02 Javascript
浅谈JavaScript 代码整洁之道
Oct 23 Javascript
vue基础之事件简写、事件对象、冒泡、默认行为、键盘事件实例分析
Mar 11 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
Notice: Undefined index: page in E:\PHP\test.php on line 14
2010/11/02 PHP
微信公众平台开发之天气预报功能
2015/08/31 PHP
php查询操作实现投票功能
2016/05/09 PHP
php 获取xml接口数据的处理方法
2018/05/31 PHP
Extjs中DisplayField的日期或者数字格式化扩展
2010/09/03 Javascript
prettify 代码高亮着色器google出品
2010/12/28 Javascript
基于jquery的使ListNav兼容中文首字拼音排序的实现代码
2011/07/10 Javascript
AngularJS中的模块详解
2015/01/29 Javascript
jQuery仿Flash上下翻动的中英文导航菜单实例
2015/03/10 Javascript
基于jquery实现三级下拉菜单
2016/05/10 Javascript
js中作用域的实例解析
2017/03/16 Javascript
JavaScript 值类型和引用类型的初次研究(推荐)
2017/07/19 Javascript
详解基于Angular4+ server render(服务端渲染)开发教程
2017/08/28 Javascript
JavaScript之创意时钟项目(实例讲解)
2017/10/23 Javascript
JavaScript数组,JSON对象实现动态添加、修改、删除功能示例
2018/05/26 Javascript
jQuery中常用动画效果函数知识点整理
2018/08/19 jQuery
创建echart多个联动的示例代码
2018/11/23 Javascript
微信小程序实现录音时的麦克风动画效果实例
2019/05/18 Javascript
[03:49]显微镜下的DOTA2第十五期—VG登基之路完美团
2014/06/24 DOTA
[45:10]NB vs Liquid Supermajor小组赛 A组胜者组决赛 BO3 第二场 6.2
2018/06/04 DOTA
[02:19]2018年度DOTA2最佳核心位选手-完美盛典
2018/12/17 DOTA
利用Hyperic调用Python实现进程守护
2018/01/02 Python
Python爬虫天气预报实例详解(小白入门)
2018/01/24 Python
python利用socketserver实现并发套接字功能
2018/01/26 Python
使用Python操作FTP实现上传和下载的方法
2019/04/01 Python
django 中使用DateTime常用的时间查询方式
2019/12/03 Python
python定义类self用法实例解析
2020/01/22 Python
Python使用GitPython操作Git版本库的方法
2020/02/29 Python
优秀研究生自我鉴定
2013/12/04 职场文书
经理管理专业自荐信范文
2013/12/31 职场文书
护士自我评价
2014/02/01 职场文书
餐饮营销方案
2014/02/23 职场文书
消防宣传口号
2014/06/16 职场文书
争先创优演讲稿
2014/09/15 职场文书
商标侵权律师函
2015/05/27 职场文书
什么是SOLID
2022/03/24 Javascript