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的ajax请求中删除X-Requested-With
Dec 11 Javascript
JavaScript自定义日期格式化函数详细解析
Jan 14 Javascript
jquery获取tr并更改tr内容示例代码
Feb 13 Javascript
jQuery中prevAll()方法用法实例
Jan 08 Javascript
JS实现具备延时功能的滑动门菜单效果
Sep 17 Javascript
JS将滑动门改为选项卡(需鼠标点击)的实现方法
Sep 27 Javascript
js实现网页收藏功能
Dec 17 Javascript
js注入 黑客之路必备!
Sep 14 Javascript
Vue-router路由判断页面未登录跳转到登录页面的实例
Oct 26 Javascript
详解如何使用koa实现socket.io官网的例子
Nov 04 Javascript
使用vue脚手架(vue-cli)搭建一个项目详解
May 09 Javascript
Vue+ElementUI 中级联选择器Bug问题的解决
Jul 31 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自动反斜杠的函数代码
2010/01/05 PHP
php中通过eval实现字符串格式的计算公式
2017/03/18 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
解放web程序员的输入验证
2006/10/06 Javascript
html中的input标签的checked属性jquery判断代码
2012/09/19 Javascript
jquery时间下拉框小例子
2013/04/15 Javascript
angularjs的一些优化小技巧
2014/12/06 Javascript
angularJS提交表单(form)
2015/02/09 Javascript
jQuery实现漂亮实用的商品图片tips提示框效果(无图片箭头+阴影)
2016/04/16 Javascript
BootStrap初学者对弹出框和进度条的使用感觉
2016/06/27 Javascript
jQuery插件FusionCharts绘制的3D双柱状图效果示例【附demo源码】
2017/04/20 jQuery
JS判断Android、iOS或浏览器的多种方法(四种方法)
2017/06/29 Javascript
微信小程序学习笔记之获取位置信息操作图文详解
2019/03/29 Javascript
深度了解vue.js中hooks的相关知识
2019/06/14 Javascript
微信小程序连续签到7天积分获得功能的示例代码
2020/08/20 Javascript
实例讲解python函数式编程
2014/06/09 Python
python多线程并发让两个LED同时亮的方法
2019/02/18 Python
Django-rest-framework中过滤器的定制实例
2020/04/01 Python
Java byte数组操纵方式代码实例解析
2020/07/22 Python
基于python的opencv图像处理实现对斑马线的检测示例
2020/11/29 Python
html5构建触屏网站之网站尺寸探讨
2013/01/07 HTML / CSS
Dr. Martens马汀博士法国官网:马丁靴鼻祖
2020/01/15 全球购物
经典c++面试题四
2015/05/14 面试题
介绍一下SQL Server的全文索引
2013/08/15 面试题
《雪地里的小画家》教学反思
2014/02/22 职场文书
工程项目经理任命书
2014/06/05 职场文书
人事任命书怎么写
2014/06/05 职场文书
关于环保的活动方案
2014/08/25 职场文书
教师四风问题对照检查材料
2014/09/26 职场文书
个人批评与自我批评材料
2014/10/17 职场文书
医生见习报告范文
2014/11/03 职场文书
教师群众路线心得体会
2014/11/04 职场文书
反腐倡廉观后感
2015/06/08 职场文书
2019大学毕业晚会主持词
2019/06/21 职场文书
SpringBoot工程下使用OpenFeign的坑及解决
2021/07/02 Java/Android
MySQL数据库超时设置配置的方法实例
2021/10/15 MySQL