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 相关文章推荐
HTML-CSS群中单选引发的“事件”
Mar 05 Javascript
div失去焦点事件实现思路
Apr 22 Javascript
JavaScript仿静态分页实现方法
Aug 04 Javascript
jQuery Easyui快速入门教程
Aug 21 Javascript
Bootstrap显示与隐藏简单实现代码
Mar 06 Javascript
JS模拟实现哈希表及应用详解
May 04 Javascript
Vue 页面状态保持页面间数据传输的一种方法(推荐)
Nov 01 Javascript
详解koa2学习中使用 async 、await、promise解决异步的问题
Nov 13 Javascript
JavaScript中工厂函数与构造函数示例详解
May 06 Javascript
在微信小程序中使用vant的方法
Jun 07 Javascript
Vue 设置axios请求格式为form-data的操作步骤
Oct 29 Javascript
Vue 解决多级动态面包屑导航的问题
Nov 04 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
PHP+Tidy-完美的XHTML纠错+过滤
2007/04/10 PHP
PHP变量内存分配问题记录整理
2013/11/27 PHP
PHP与MYSQL中UTF8编码的中文排序实例
2014/10/21 PHP
微信开发之网页授权获取用户信息(二)
2016/01/08 PHP
10个新的最有前途的JavaScript框架
2009/03/12 Javascript
js 屏蔽鼠标右键脚本附破解方法
2009/12/03 Javascript
Javascript 键盘keyCode键码值表
2009/12/24 Javascript
让js弹出窗口居前显示的实现方法
2013/07/10 Javascript
简介JavaScript中的push()方法的使用
2015/06/09 Javascript
JavaScript模板引擎用法实例
2015/07/10 Javascript
jQuery 选择符详细介绍及整理
2016/12/02 Javascript
如何快速上手Vuex
2017/02/14 Javascript
HTML的select控件美化
2017/03/27 Javascript
vue-cli常用设置总结
2018/02/24 Javascript
es6基础学习之解构赋值
2018/12/10 Javascript
[01:15:00]LGD vs Mineski Supermajor 胜者组 BO3 第一场 6.5
2018/06/06 DOTA
Python字符串处理函数简明总结
2015/04/13 Python
wxPython使用系统剪切板的方法
2015/06/16 Python
答题辅助python代码实现
2018/01/16 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
2019/06/18 Python
python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)
2019/08/06 Python
python实现PID算法及测试的例子
2019/08/08 Python
Python面向对象封装操作案例详解
2019/12/31 Python
python next()和iter()函数原理解析
2020/02/07 Python
python微信公众号开发简单流程实现
2020/03/09 Python
keras输出预测值和真实值方式
2020/06/27 Python
Nike台湾官方商店:Nike.com (TW)
2017/08/16 全球购物
servlet面试题
2012/08/20 面试题
优秀经理事迹材料
2014/02/01 职场文书
经济担保书范文
2014/04/02 职场文书
思想品德评语大全
2014/12/31 职场文书
销售内勤岗位职责范本
2015/04/13 职场文书
Golang 编译成DLL文件的操作
2021/05/06 Golang
深入理解python协程
2021/06/15 Python
Vue h函数的使用详解
2022/02/18 Vue.js
python疲劳驾驶困倦低头检测功能的实现
2022/04/04 Python