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 相关文章推荐
解析URI与URL之间的区别与联系
Nov 22 Javascript
JavaScript实现存储HTML字符串示例
Apr 21 Javascript
node.js中的console.time方法使用说明
Dec 09 Javascript
JavaScript获取并更改input标签name属性的方法
Jul 02 Javascript
JS实现合并两个数组并去除重复项只留一个的方法
Dec 17 Javascript
javascript实现的猜数小游戏完整实例代码
May 10 Javascript
AngularJS HTML DOM详解及示例代码
Aug 17 Javascript
JS简单实现tab切换效果的多窗口显示功能
Sep 07 Javascript
使用Bootstrap Tabs选项卡Ajax加载数据实现
Dec 23 Javascript
jquery实现tab键进行选择后enter键触发click行为
Mar 29 jQuery
Element Card 卡片的具体使用
Jul 26 Javascript
微信小程序轮播图swiper代码详解
Dec 01 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侧拉菜单 漂亮,可以向右或者向左展开,支持FF,IE
2009/10/15 PHP
PHP实现手机归属地查询API接口实现代码
2012/08/27 PHP
php访问数组最后一个元素的函数end()用法
2015/03/18 PHP
WordPress后台中实现图片上传功能的实例讲解
2016/01/11 PHP
PHP二维数组矩形转置实例
2016/07/20 PHP
PHP设计模式之状态模式定义与用法详解
2018/04/02 PHP
laravel-admin 管理平台获取当前登陆用户信息的例子
2019/10/08 PHP
jQuery 使用手册(五)
2009/09/23 Javascript
用jQuery打造TabPanel效果代码
2010/05/22 Javascript
jquery.validate使用攻略 第五步 正则验证
2010/07/01 Javascript
js为空或不是对象问题的快速解决方法
2013/12/11 Javascript
7个让JavaScript变得更好的注意事项
2015/01/28 Javascript
JavaScript常用基础知识强化学习
2015/12/09 Javascript
省市二级联动小案例讲解
2016/07/24 Javascript
Javascript使用SWFUpload进行多文件上传
2016/11/16 Javascript
nodejs学习笔记之路由
2017/03/27 NodeJs
学习使用Bootstrap栅格系统
2017/05/11 Javascript
Kindeditor单独调用多图上传实例
2017/07/31 Javascript
基于vue-ssr服务端渲染入门详解
2018/01/08 Javascript
jQuery实现点击图标div循环放大缩小功能
2018/09/30 jQuery
js利用拖放实现添加删除
2020/08/27 Javascript
[59:48]DOTA2-DPC中国联赛 正赛 VG vs Magma BO3 第一场 1月26日
2021/03/11 DOTA
Python用61行代码实现图片像素化的示例代码
2018/12/10 Python
Python的条件表达式和lambda表达式实例
2019/01/31 Python
Python 计算任意两向量之间的夹角方法
2019/07/05 Python
PyQt5中向单元格添加控件的方法示例
2020/03/24 Python
Keras loss函数剖析
2020/07/06 Python
matplotlib交互式数据光标实现(mplcursors)
2021/01/13 Python
使用phonegap克隆和删除联系人的实现方法
2017/03/31 HTML / CSS
BSTN意大利:德国街头和运动文化高品质商店
2020/12/22 全球购物
给同事的道歉信
2014/01/11 职场文书
聊城大学毕业生自荐书
2014/02/01 职场文书
《胡杨》教学反思
2014/02/16 职场文书
生产实习心得体会范文
2016/01/22 职场文书
CSS 还能这样玩?奇思妙想渐变的艺术
2021/04/27 HTML / CSS
教你使用RustDesk 搭建一个自己的远程桌面中继服务器
2022/08/14 Servers