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 相关文章推荐
JS/FLASH实现复制代码到剪贴板(兼容所有浏览器)
May 27 Javascript
node.js中的fs.rename方法使用说明
Dec 16 Javascript
JavaScript框架是什么?怎样才能叫做框架?
Jul 01 Javascript
深入浅析JavaScript中的3DES
Aug 24 Javascript
d3.js入门教程之数据绑定详解
Apr 28 Javascript
JS简单生成随机数(随机密码)的方法
May 11 Javascript
vue过渡和animate.css结合使用详解
Jun 14 Javascript
angularjs的单选框+ng-repeat的实现方法
Sep 12 Javascript
Vue中的作用域CSS和CSS模块的区别
Oct 09 Javascript
微信小程序实现蒙版弹窗效果
Nov 01 Javascript
Vuex的热更替如何实现
Jun 05 Javascript
antd-DatePicker组件获取时间值,及相关设置方式
Oct 27 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实现文本数据导入SQL SERVER
2015/05/17 PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
2016/09/11 PHP
PHP删除数组中指定下标的元素方法
2018/02/03 PHP
使用jQuery+HttpHandler+xml模拟一个三级联动的例子
2011/08/09 Javascript
jquery 实现密码框的显示与隐藏示例代码
2013/09/18 Javascript
JS增加行复制行删除行的实现代码
2013/11/09 Javascript
JavaScript记录光标在编辑器中位置的实现方法
2016/04/22 Javascript
vue增删改查的简单操作
2017/07/15 Javascript
详解Javascript中new()到底做了些什么?
2018/03/29 Javascript
微信小程序使用form表单获取输入框数据的实例代码
2018/05/17 Javascript
React.js绑定this的5种方法(小结)
2018/06/05 Javascript
详解VScode编辑器vue环境搭建所遇问题解决方案
2019/04/26 Javascript
详解ES6 Promise的生命周期和创建
2019/08/18 Javascript
[00:59]DOTA2背景故事第二期之四大基本法则
2020/07/07 DOTA
Python中实现结构相似的函数调用方法
2015/03/10 Python
python正常时间和unix时间戳相互转换的方法
2015/04/23 Python
八大排序算法的Python实现
2021/01/28 Python
python面向对象入门教程之从代码复用开始(一)
2018/12/11 Python
Python之列表实现栈的工作功能
2019/01/28 Python
python笔记_将循环内容在一行输出的方法
2019/08/08 Python
Django 项目通过加载不同env文件来区分不同环境
2020/02/17 Python
世界上最大的餐具公司:Oneida
2016/12/17 全球购物
美国婚礼礼品网站:MyWeddingFavors
2018/09/26 全球购物
大学生就业推荐信范文
2013/11/29 职场文书
区域销售经理岗位职责
2013/12/10 职场文书
大学生职业生涯设计书
2014/01/02 职场文书
《乞巧》教学反思
2014/02/27 职场文书
党的群众路线教育实践活动心得体会900字
2014/03/07 职场文书
老公给老婆的检讨书(精华篇)
2014/10/18 职场文书
小学语文教师研修日志
2015/11/13 职场文书
2016年中秋节寄语大全
2015/12/07 职场文书
党员公开承诺书(2016最新版)
2016/03/24 职场文书
导游词之丽江普济寺
2019/10/22 职场文书
解决SpringCloud Feign传对象参数调用失败的问题
2021/06/23 Java/Android
HTTP中的Content-type详解
2022/01/18 HTML / CSS
Python必备技巧之函数的使用详解
2022/04/04 Python