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 有趣而诡异的数组
Apr 06 Javascript
Node.js的包详细介绍
Jan 14 Javascript
js判断是否按下了Shift键的方法
Jan 27 Javascript
JavaScript中实现map功能代码分享
Jun 11 Javascript
js实现图片无缝滚动
Dec 23 Javascript
jQuery实现为LI列表前3行设置样式的方法【2种方法】
Sep 04 Javascript
JS时间控制实现动态效果的实例讲解
Jul 31 Javascript
bootstrap multiselect下拉列表功能
Aug 22 Javascript
Angularjs渲染的 using 指令的星级评分系统示例
Nov 09 Javascript
vue自定义filters过滤器
Apr 26 Javascript
Vue 让元素抖动/摆动起来的实现代码
May 31 Javascript
vue实现点击追加选中样式效果
Nov 01 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操作文件方法问答
2007/03/16 PHP
PHP超级全局变量数组小结
2012/10/04 PHP
php小经验:解析preg_match与preg_match_all 函数
2013/06/29 PHP
php float不四舍五入截取浮点型字符串方法总结
2013/10/28 PHP
异步加载技术实现当滚动条到最底部的瀑布流效果
2014/09/16 PHP
java模拟PHP的pack和unpack类
2016/04/13 PHP
javascript面向对象的方式实现的弹出层效果代码
2010/01/28 Javascript
JavaScript执行效率与性能提升方案
2012/12/21 Javascript
JavaScript动态操作表格实例(添加,删除行,列及单元格)
2013/11/25 Javascript
JS获取DropDownList的value值与text值的示例代码
2014/01/07 Javascript
js利用prototype调用Array的slice方法示例
2014/06/09 Javascript
TypeScript 中接口详解
2015/06/19 Javascript
JavaScript计算器网页版实现代码分享
2016/07/15 Javascript
JavaScript仿百度图片浏览效果
2016/11/23 Javascript
利用JavaScript实现拖拽改变元素大小
2016/12/14 Javascript
MUI 解决动态列表页图片懒加载再次加载不成功的bug问题
2017/04/13 Javascript
微信小程序 选项卡的简单实例
2017/05/24 Javascript
解决element ui select下拉框不回显数据问题的解决
2019/02/20 Javascript
Python实现简单http服务器
2018/04/12 Python
使用python对文件中的单词进行提取的方法示例
2018/12/21 Python
关于django 1.10 CSRF验证失败的解决方法
2019/08/31 Python
3种适用于Python的疯狂秘密武器及原因解析
2020/04/29 Python
详解Python设计模式之策略模式
2020/06/15 Python
Python改变对象的字符串显示的方法
2020/08/01 Python
python调用摄像头的示例代码
2020/09/28 Python
python 用pandas实现数据透视表功能
2020/12/21 Python
校长竞聘演讲稿
2014/05/16 职场文书
交通违章检讨书
2014/09/21 职场文书
合作协议书模板2014
2014/09/26 职场文书
入党积极分子党小组意见
2015/06/02 职场文书
未婚证明格式
2015/06/15 职场文书
2015年学校教科室工作总结
2015/07/20 职场文书
工作简报范文
2015/07/21 职场文书
运动会加油稿50字
2015/07/21 职场文书
css常用字体属性与背景属性介绍
2022/02/28 HTML / CSS
「海贼王」112.9万粉丝纪念图标公布
2022/03/21 日漫