jsvascript图像处理—(计算机视觉应用)图像金字塔


Posted in Javascript onJanuary 15, 2013

前言
上一篇文章,我们讲解了边缘梯度计算函数,这篇文章我们来了解图像金字塔。

图像金字塔?
图像金字塔被广泛用于计算机视觉应用中。
图像金字塔是一个图像集合,集合中所有的图像都源于同一个原始图像,而且是通过对原始图像连续降采样获得的。

常见的图像金字塔有下面两种
•高斯金字塔(Gaussian pyramid): 用来向下采样
•拉普拉斯金字塔(Laplacian pyramid): 用来从金字塔低层图像重建上层未采样图像

高斯金字塔

jsvascript图像处理—(计算机视觉应用)图像金字塔


类似金字塔一样,高斯金字塔从底层原始图逐渐向下采样,越来越小。

那么如何获取下一层图像呢?

首先,和高斯内核卷积:
jsvascript图像处理—(计算机视觉应用)图像金字塔 
然后,将所有偶数行列删掉。
可见,这样下一级图像约为上一级的1/4。

那么向上变换如何变换呢?
首先先将图片行列扩大为原来的两倍,然后将添加的行列用0填充。
最后用刚刚的高斯内核乘以4后卷积。

高斯金字塔实现

var pyrDown = function(__src, __dst){ 
__src || error(arguments.callee, IS_UNDEFINED_OR_NULL/* {line} */); 
if(__src.type && __src.type == "CV_RGBA"){ 
var width = __src.col, 
height = __src.row, 
dWidth = ((width & 1) + width) / 2, 
dHeight = ((height & 1) + height) / 2, 
sData = __src.data, 
dst = __dst || new Mat(dHeight, dWidth, CV_RGBA), 
dstData = dst.data; 
var withBorderMat = copyMakeBorder(__src, 2, 2, 0, 0), 
mData = withBorderMat.data, 
mWidth = withBorderMat.col; 
var newValue, nowX, offsetY, offsetI, dOffsetI, i, j; 
var kernel = [1, 4, 6, 4, 1, 
, 16, 24, 16, 4, 
, 24, 36, 24, 6, 
, 16, 24, 16, 4, 
, 4, 6, 4, 1 
]; 
for(i = dHeight; i--;){ 
dOffsetI = i * dWidth; 
for(j = dWidth; j--;){ 
for(c = 3; c--;){ 
newValue = 0; 
for(y = 5; y--;){ 
offsetY = (y + i * 2) * mWidth * 4; 
for(x = 5; x--;){ 
nowX = (x + j * 2) * 4 + c; 
newValue += (mData[offsetY + nowX] * kernel[y * 5 + x]); 
} 
} 
dstData[(j + dOffsetI) * 4 + c] = newValue / 256; 
} 
dstData[(j + dOffsetI) * 4 + 3] = mData[offsetY + 2 * mWidth * 4 + (j * 2 + 2) * 4 + 3]; 
} 
} 
}else{ 
error(arguments.callee, UNSPPORT_DATA_TYPE/* {line} */); 
} 
return dst; 
};

dWidth = ((width & 1) + width) / 2,
dHeight = ((height & 1) + height) / 2
这里面a & 1等同于a % 2,即求除以2的余数。
我们实现时候没有按照上面的步骤,因为这样子效率就低了,而是直接创建一个原矩阵1/4的矩阵,然后卷积时候跳过那些要被删掉的行和列。

下面也一样,创建后卷积,由于一些地方一定是0,所以实际卷积过程中,内核有些元素是被忽略的。

var pyrUp = function(__src, __dst){ 
__src || error(arguments.callee, IS_UNDEFINED_OR_NULL/* {line} */); 
if(__src.type && __src.type == "CV_RGBA"){ 
var width = __src.col, 
height = __src.row, 
dWidth = width * 2, 
dHeight = height * 2, 
sData = __src.data, 
dst = __dst || new Mat(dHeight, dWidth, CV_RGBA), 
dstData = dst.data; 
var withBorderMat = copyMakeBorder(__src, 2, 2, 0, 0), 
mData = withBorderMat.data, 
mWidth = withBorderMat.col; 
var newValue, nowX, offsetY, offsetI, dOffsetI, i, j; 
var kernel = [1, 4, 6, 4, 1, 
, 16, 24, 16, 4, 
, 24, 36, 24, 6, 
, 16, 24, 16, 4, 
, 4, 6, 4, 1 
]; 
for(i = dHeight; i--;){ 
dOffsetI = i * dWidth; 
for(j = dWidth; j--;){ 
for(c = 3; c--;){ 
newValue = 0; 
for(y = 2 + (i & 1); y--;){ 
offsetY = (y + ((i + 1) >> 1)) * mWidth * 4; 
for(x = 2 + (j & 1); x--;){ 
nowX = (x + ((j + 1) >> 1)) * 4 + c; 
newValue += (mData[offsetY + nowX] * kernel[(y * 2 + (i & 1 ^ 1)) * 5 + (x * 2 + (j & 1 ^ 1))]); 
} 
} 
dstData[(j + dOffsetI) * 4 + c] = newValue / 64; 
} 
dstData[(j + dOffsetI) * 4 + 3] = mData[offsetY + 2 * mWidth * 4 + (((j + 1) >> 1) + 2) * 4 + 3]; 
} 
} 
}else{ 
error(arguments.callee, UNSPPORT_DATA_TYPE/* {line} */); 
} 
return dst; 
};

效果图

jsvascript图像处理—(计算机视觉应用)图像金字塔

Javascript 相关文章推荐
javascript中substr,substring,slice.splice的区别说明
Nov 25 Javascript
javascript高级学习笔记整理
Aug 14 Javascript
jQuery选择器querySelector的使用指南
Jan 23 Javascript
jquery html动态添加的元素绑定事件详解
May 24 Javascript
Bootstrap的Refresh Icon也spin起来
Jul 13 Javascript
jQuery插件zTree实现删除树节点的方法示例
Mar 08 Javascript
jQuery鼠标悬停内容动画切换效果
Apr 27 jQuery
利用JavaScript如何查询某个值是否数组内
Jul 30 Javascript
JavaScript类数组对象转换为数组对象的方法实例分析
Jul 24 Javascript
vue+element-ui动态生成多级表头的方法
Aug 28 Javascript
JointJS JavaScript流程图绘制框架解析
Aug 15 Javascript
解决elementUI 切换tab后 el_table 固定列下方多了一条线问题
Jul 19 Javascript
使用Post提交时须将空格转换成加号的解释
Jan 14 #Javascript
javascript函数以及基础写法100多条实用整理
Jan 13 #Javascript
window.requestAnimationFrame是什么意思,怎么用
Jan 13 #Javascript
jquery获取div宽度的实现思路与代码
Jan 13 #Javascript
jQuery实现用方向键控制层的上下左右移动
Jan 13 #Javascript
js模仿html5 placeholder适应于不支持的浏览器
Jan 13 #Javascript
ie6下png图片背景不透明的解决办法使用js实现
Jan 11 #Javascript
You might like
快速配置PHPMyAdmin方法
2008/06/05 PHP
PHP 第二节 数据类型之转换
2012/04/28 PHP
discuz免激活同步登入代码修改方法(discuz同步登录)
2013/12/24 PHP
选择TreeView控件的树状数据节点的JS方法(jquery)
2010/02/06 Javascript
JavaScript高级程序设计 阅读笔记(十二) js内置对象Math
2012/08/14 Javascript
AngularJS入门教程(一):静态模板
2014/12/06 Javascript
jquery实现侧边弹出的垂直导航
2014/12/09 Javascript
分析了一下JQuery中的extend方法实现原理
2015/02/27 Javascript
基于AngularJS+HTML+Groovy实现登录功能
2016/02/17 Javascript
jQuery+Ajax实现限制查询间隔的方法
2016/06/07 Javascript
jQuery+CSS实现简单切换菜单示例
2016/07/27 Javascript
一次围绕setTimeout的前端面试经验分享
2017/06/15 Javascript
jQuery中.attr()和.data()的区别分析
2017/09/03 jQuery
VSCode配置react开发环境的步骤
2017/12/27 Javascript
浅析Node.js非对称加密方法
2018/01/29 Javascript
对vue中methods互相调用的方法详解
2018/08/30 Javascript
VeeValidate 的使用场景以及配置详解
2019/01/11 Javascript
微信小程序 wepy框架与iview-weapp的用法详解
2019/04/10 Javascript
laravel-admin 与 vue 结合使用实例代码详解
2019/06/04 Javascript
ES6模板字符串和标签模板的应用实例分析
2019/06/25 Javascript
Python中的深拷贝和浅拷贝详解
2015/06/03 Python
python统计字母、空格、数字等字符个数的实例
2018/06/29 Python
Python操作配置文件ini的三种方法讲解
2019/02/22 Python
一个可以套路别人的python小程序实例代码
2019/04/09 Python
使用django实现一个代码发布系统
2019/07/18 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
2019/08/12 Python
python Pillow图像处理方法汇总
2019/10/16 Python
Python如何实现定时器功能
2020/05/28 Python
解决Keras中CNN输入维度报错问题
2020/06/29 Python
Python 无限级分类树状结构生成算法的实现
2021/01/21 Python
css3 自定义字体font-face使用介绍
2014/05/14 HTML / CSS
Sneaker Studio罗马尼亚网站:购买运动鞋
2018/11/04 全球购物
营业员个人总结的自我评价
2013/10/25 职场文书
《少年闰土》教学反思
2016/02/18 职场文书
个人自我鉴定怎么写?
2019/07/01 职场文书
MySQL查询日期时间
2022/05/15 MySQL