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编程起步(第三课)
Feb 27 Javascript
基于JQuery的访问WebService的代码(可访问Java[Xfire])
Nov 19 Javascript
jQuery中实现动画效果的基本操作介绍
Apr 16 Javascript
JavaScript字符串对象的concat方法实例(用于连接两个或多个字符串)
Oct 16 Javascript
前端必备神器 Snap.svg 弹动效果
Nov 10 Javascript
JavaScript中的关联数组问题
Mar 04 Javascript
JavaScript程序设计之JS调试
Dec 09 Javascript
JavaScript模版引擎的基本实现方法浅析
Feb 15 Javascript
vue多级多选菜单组件开发
Sep 08 Javascript
手机移动端实现 jquery和HTML5 Canvas的幸运大奖盘特效
Dec 06 Javascript
茶余饭后聊聊Vue3.0响应式数据那些事儿
Oct 30 Javascript
解决vue打包报错Unexpected token: punc的问题
Oct 24 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
thinkPHP2.1自定义标签库的导入方法详解
2016/07/20 PHP
php微信分享到朋友圈、QQ、朋友、微博
2019/02/18 PHP
写了一个layout,拖动条连贯,内容区可为iframe
2007/08/19 Javascript
js鼠标滑轮滚动事件绑定的简单实例(兼容主流浏览器)
2014/01/14 Javascript
JS实现网页背景颜色与select框中颜色同时变化的方法
2015/02/27 Javascript
Node.js实现Excel转JSON
2015/04/24 Javascript
javascript通过元素id和name直接取得元素的方法
2015/04/28 Javascript
jQuery插件制作之全局函数用法实例
2015/06/01 Javascript
JavaScript定时器和优化的取消定时器方法
2015/07/03 Javascript
两种JS实现屏蔽鼠标右键的方法
2020/08/20 Javascript
ionic 上拉菜单(ActionSheet)实例代码
2016/06/06 Javascript
javascript设计模式Constructor(构造器)模式
2016/08/19 Javascript
浅析Javascript ES6新增值比较函数Object.is
2016/08/24 Javascript
微信小程序 选择器(时间,日期,地区)实例详解
2016/11/16 Javascript
JS实现的图片预览插件与用法示例【不上传图片】
2016/11/25 Javascript
jQuery实现发送验证码并60秒倒计时功能
2016/11/25 Javascript
EditPlus中的正则表达式 实战(2)
2016/12/15 Javascript
微信小程序 视图容器组件的详解及实例代码
2017/01/19 Javascript
JavaScript对象拷贝与Object.assign用法实例分析
2018/06/20 Javascript
angular 服务随记小结
2019/05/06 Javascript
Vue页面跳转传递参数及接收方式
2020/09/09 Javascript
Vue中用JSON实现刷新界面不影响倒计时
2020/10/26 Javascript
微信小程序实现音乐播放页面布局
2020/12/11 Javascript
Vue实现简易购物车页面
2020/12/30 Vue.js
python基础教程之分支、循环简单用法
2016/06/16 Python
python实现mysql的读写分离及负载均衡
2018/02/04 Python
python单线程文件传输的实例(C/S)
2019/02/13 Python
CSS3 RGBA色彩模式使用实例讲解
2016/04/26 HTML / CSS
Mistine官方海外旗舰店:泰国国民彩妆品牌
2016/12/28 全球购物
澳大利亚波西米亚风连衣裙在线商店:Fortunate One
2019/04/01 全球购物
骨干教师培训方案
2014/05/06 职场文书
民事上诉状范文
2015/05/22 职场文书
2016学习全国教书育人楷模先进事迹心得体会
2016/01/21 职场文书
800字作文之大雪
2019/12/04 职场文书
Python基础知识学习之类的继承
2021/05/31 Python
《勇者辞职不干了》上卷BD发售宣传CM公开
2022/04/08 日漫