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 相关文章推荐
语义化 H1 标签
Jan 14 Javascript
javascript 避免闭包引发的问题
Mar 17 Javascript
最简单的js图片切换效果实现代码
Sep 24 Javascript
javaScript如何处理从java后台返回的list
Apr 24 Javascript
js实现多选项切换导航菜单的方法
Feb 06 Javascript
JavaScript实现的简单烟花特效代码
Oct 20 Javascript
jQuery Validate插件实现表单强大的验证功能
Dec 18 Javascript
JS闭包可被利用的常见场景小结
Apr 09 Javascript
详解Angular2表单-模板驱动的表单(Template-Driven Forms)
Aug 04 Javascript
详解JS判断页面是在手机端还是在PC端打开的方法
Apr 26 Javascript
深入解析koa之中间件流程控制
Jun 17 Javascript
JS中的算法与数据结构之集合(Set)实例详解
Aug 20 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 XML备份Mysql数据库
2009/05/27 PHP
PHP 身份验证方面的函数
2009/10/11 PHP
简单PHP上传图片、删除图片实现代码
2010/05/12 PHP
CodeIgniter框架常见用法工作总结
2017/03/16 PHP
PHP实现负载均衡下的session共用功能
2018/04/17 PHP
JS 删除字符串最后一个字符的实现代码
2014/02/20 Javascript
jquery $(document).ready()和window.onload的区别浅析
2015/02/04 Javascript
jquery实现表格本地排序的方法
2015/03/11 Javascript
第七篇Bootstrap表单布局实例代码详解(三种表单布局)
2016/06/21 Javascript
vue渲染时闪烁{{}}的问题及解决方法
2018/03/28 Javascript
angular2模块和共享模块详解
2018/04/08 Javascript
jQuery实现的鼠标拖动浮层功能示例【拖动div等任何标签】
2018/12/29 jQuery
解决Vue打包上线之后部分CSS不生效的问题
2019/11/12 Javascript
微信小程序实现搜索功能
2020/03/10 Javascript
Element Steps步骤条的使用方法
2020/07/26 Javascript
python开发简易版在线音乐播放器
2017/03/03 Python
python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)
2017/03/12 Python
python查看模块安装位置的方法
2018/10/16 Python
python批量修改文件夹及其子文件夹下的文件内容
2019/03/15 Python
Python list与NumPy array 区分详解
2019/11/06 Python
pytorch实现用CNN和LSTM对文本进行分类方式
2020/01/08 Python
使用jupyter notebook将文件保存为Markdown,HTML等文件格式
2020/04/14 Python
Python变量及数据类型用法原理汇总
2020/08/06 Python
canvas实现漂亮的下雨效果的示例
2018/04/18 HTML / CSS
致标枪运动员加油稿
2014/02/15 职场文书
安全承诺书范文
2014/03/26 职场文书
四议两公开实施方案
2014/03/28 职场文书
元旦寄语大全
2014/04/10 职场文书
护理学院专科毕业生求职信
2014/06/28 职场文书
教师学习三严三实心得体会
2014/10/13 职场文书
教师政风行风评议心得体会
2014/10/21 职场文书
小学推普周活动总结
2015/05/07 职场文书
学校教学工作总结2015
2015/05/19 职场文书
2015年初中教务处工作总结
2015/07/21 职场文书
Pytorch实现图像识别之数字识别(附详细注释)
2021/05/11 Python
新手初学Java List 接口
2021/07/07 Java/Android