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 学习笔记(九)call和apply方法
Jan 11 Javascript
JSChart轻量级图形报表工具(内置函数中文参考)
Oct 11 Javascript
用jquery设置按钮的disabled属性的实现代码
Nov 28 Javascript
JQuery操作单选按钮以及复选按钮示例
Sep 23 Javascript
JS创建自定义表格具体实现
Feb 11 Javascript
javascript实现拖动元素交换位置
Nov 29 Javascript
浅析Javascript ES6中的原生Promise
Aug 25 Javascript
react项目实践之webpack-dev-serve
Sep 14 Javascript
vue项目添加多页面配置的步骤详解
May 22 Javascript
Cordova(ionic)项目实现双击返回键退出应用
Sep 17 Javascript
基于element-ui封装可搜索的懒加载tree组件的实现
May 22 Javascript
Javascript中window.name属性详解
Nov 19 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 session
2013/10/28 PHP
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
2014/12/18 PHP
PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析
2018/05/11 PHP
js bind 函数 使用闭包保存执行上下文
2011/12/26 Javascript
Javascript基础教程之关键字和保留字汇总
2015/01/18 Javascript
JS选项卡动态替换banner图片路径的方法
2015/05/11 Javascript
jquery选择器简述
2015/08/31 Javascript
jquery简单倒计时实现方法
2015/12/18 Javascript
省市区三级联动jquery实现代码
2020/04/15 Javascript
简单谈谈require模块化jquery和angular的问题
2017/06/23 jQuery
利用JS判断客户端类型你应该知道的四种方法
2017/12/22 Javascript
Angular 容器部署的方法
2018/04/17 Javascript
使用Vue-cli 3.0搭建Vue项目的方法
2018/06/07 Javascript
[45:52]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第二场 12.09
2020/12/12 DOTA
[01:02:38]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第二场 1月10日
2021/03/11 DOTA
状态机的概念和在Python下使用状态机的教程
2015/04/11 Python
如何处理Python3.4 使用pymssql 乱码问题
2016/01/08 Python
Mac中升级Python2.7到Python3.5步骤详解
2017/04/27 Python
对Python中range()函数和list的比较
2018/04/19 Python
查看Django和flask版本的方法
2018/05/14 Python
使用python将时间转换为指定的格式方法
2018/11/12 Python
对python中url参数编码与解码的实例详解
2019/07/25 Python
Python 3.6 中使用pdfminer解析pdf文件的实现
2019/09/25 Python
详解python中*号的用法
2019/10/21 Python
Python用access判断文件是否被占用的实例方法
2020/12/17 Python
详解使用python爬取抖音app视频(appium可以操控手机)
2021/01/26 Python
CSS3实现多背景展示效果通过CSS3定位多张背景
2014/08/10 HTML / CSS
Ralph Lauren拉夫·劳伦美国官网:带有浓郁美国气息的高品味时装品牌
2017/11/01 全球购物
Vertbaudet西班牙网上商店:婴儿服装、童装、母婴用品和儿童家具
2019/10/16 全球购物
技校生自我鉴定
2013/12/08 职场文书
总经理职责
2013/12/22 职场文书
2015年度村委会工作总结
2015/04/29 职场文书
保险公司岗前培训工作总结
2015/10/24 职场文书
基于PyTorch实现一个简单的CNN图像分类器
2021/05/29 Python
Apache Hudi 加速传统的批处理模式
2022/04/24 Servers
Win11右下角图标点了没反应怎么办?Win11点击右下角图标无反应解决方法汇总
2022/07/07 数码科技