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 相关文章推荐
jQuery右键菜单contextMenu使用实例
Sep 28 Javascript
flash调用js中的方法,让js传递变量给flash的办法及思路
Aug 07 Javascript
限制文本框只能输入数字||只能是数字和小数点||只能是整数和浮点数
May 27 Javascript
微信小程序 选择器(时间,日期,地区)实例详解
Nov 16 Javascript
值得分享的Bootstrap Table使用教程
Nov 23 Javascript
如何编写jquery插件
Mar 29 jQuery
JavaScript时间与时间戳的转换操作实例分析
Dec 07 Javascript
cocos2dx+lua实现橡皮擦功能
Dec 20 Javascript
详解React项目如何修改打包地址(编译输出文件地址)
Mar 21 Javascript
seajs和requirejs模块化简单案例分析
Aug 26 Javascript
js 解析 JSON 数据简单示例
Apr 21 Javascript
一行JavaScript代码如何实现瀑布流布局
Dec 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
在WINDOWS中设置计划任务执行PHP文件的方法
2011/12/19 PHP
Yii调试SQL的常用方法
2014/07/09 PHP
phpQuery让php处理html代码像jQuery一样方便
2015/01/06 PHP
PHP生成随机数的方法实例分析
2015/01/22 PHP
PHP二进制与字符串之间的相互转换教程
2016/10/14 PHP
PHP PDOStatement::getColumnMeta讲解
2019/02/01 PHP
jquery tools之tooltip
2009/07/25 Javascript
JavaScript与DOM组合动态创建表格实例
2012/12/23 Javascript
SuperSlide2实现图片滚动特效
2014/06/20 Javascript
jQuery中:first选择器用法实例
2014/12/30 Javascript
javascript实现的淘宝旅行通用日历组件用法实例
2015/08/03 Javascript
详解Vue 匿名、具名和作用域插槽的使用方法
2019/04/22 Javascript
Vue组件间通信 Vuex的用法解析
2019/08/05 Javascript
Python isinstance判断对象类型
2008/09/06 Python
在Python的web框架中配置app的教程
2015/04/30 Python
Python使用minidom读写xml的方法
2015/06/03 Python
详解Python中 sys.argv[]的用法简明解释
2017/12/20 Python
Python读取图片为16进制表示简单代码
2018/01/19 Python
python3 发送任意文件邮件的实例
2018/01/23 Python
Python实现快速傅里叶变换的方法(FFT)
2018/07/21 Python
Python实现的简单线性回归算法实例分析
2018/12/26 Python
python3+selenium实现qq邮箱登陆并发送邮件功能
2019/01/23 Python
python try 异常处理(史上最全)
2019/03/07 Python
python实现键盘输入的实操方法
2019/07/16 Python
Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)
2020/03/10 Python
python3 配置logging日志类的操作
2020/04/08 Python
CSS3对图片照片进行边缘模糊处理的实现
2018/08/08 HTML / CSS
全球知名提供各类营养保健品的零售商:Vitamin Shoppe
2016/10/09 全球购物
MIKI HOUSE美国官方网上商店:日本领先的婴儿和儿童高级时装品牌
2020/06/21 全球购物
党课学习思想汇报
2014/01/02 职场文书
社区优秀志愿者先进事迹
2014/05/09 职场文书
公司晚会策划方案
2014/05/17 职场文书
2014年小学语文工作总结
2014/12/20 职场文书
图书借阅制度范本
2015/08/06 职场文书
校园广播稿范文
2015/08/19 职场文书
Python编程中Python与GIL互斥锁关系作用分析
2021/09/15 Python