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 相关文章推荐
StringTemplate遇见jQuery冲突的解决方法
Sep 22 Javascript
使用JavaScript 编写简单计算器
Nov 24 Javascript
Javascript字符串浏览器兼容问题分析
Dec 01 Javascript
JavaScript常用脚本汇总(三)
Mar 04 Javascript
javascript模拟评分控件实现方法
May 13 Javascript
jQuery+pjax简单示例汇总
Apr 21 jQuery
JS实现数组去重方法总结(六种方法)
Jul 14 Javascript
在Vuex使用dispatch和commit来调用mutations的区别详解
Sep 18 Javascript
jquery实现直播弹幕效果
Nov 28 jQuery
JavaScript如何利用Promise控制并发请求个数
May 14 Javascript
一文带你理解vue创建一个后台管理系统流程(Vue+Element)
May 18 Vue.js
详解JavaScript中Arguments对象用途
Aug 30 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
Thinkphp连表查询及数据导出方法示例
2016/10/15 PHP
php array_keys 返回数组的键名
2016/10/25 PHP
php原生数据库分页的代码实例
2019/02/18 PHP
JS定时刷新页面及跳转页面的方法
2013/07/04 Javascript
js获取客户端外网ip的简单实例
2013/11/21 Javascript
node.js中的querystring.unescape方法使用说明
2014/12/10 Javascript
非常漂亮的相册集 使用jquery制作相册集
2016/04/28 Javascript
JS实现兼容各种浏览器的高级拖动方法完整实例【测试可用】
2016/06/21 Javascript
jquery删除数组中重复元素
2016/12/05 Javascript
mui开发中获取单选按钮、复选框的值(实例讲解)
2017/07/24 Javascript
vue路由跳转时判断用户是否登录功能的实现
2017/10/26 Javascript
Vue.js单向绑定和双向绑定实例分析
2018/08/14 Javascript
微信小程序实现渐入渐出动画效果
2019/06/13 Javascript
js对象数组和对象的使用实例详解
2019/08/27 Javascript
javascript执行上下文、变量对象实例分析
2020/04/25 Javascript
解决vue bus.$emit触发第一次$on监听不到问题
2020/07/28 Javascript
Python中的闭包实例详解
2014/08/29 Python
Python错误提示:[Errno 24] Too many open files的分析与解决
2017/02/16 Python
Python在图片中添加文字的两种方法
2017/04/29 Python
使用Python从零开始撸一个区块链
2018/03/14 Python
python实现飞机大战游戏(pygame版)
2020/10/26 Python
浅谈Django前端后端值传递问题
2020/07/15 Python
HTML5不支持frameset的两种解决方法
2016/11/14 HTML / CSS
瑞士领先的网上超市:LeShop.ch
2018/11/14 全球购物
计算机应用与科学个人的自我评价
2013/11/15 职场文书
大学生职业生涯规划书模板
2014/01/03 职场文书
入党自荐书范文
2014/03/09 职场文书
经济信息系毕业生自荐信
2014/06/02 职场文书
新闻学专业职业生涯规划范文:我的人生我做主
2014/09/12 职场文书
信用卡工作证明模板
2014/09/14 职场文书
国防教育标语
2014/10/08 职场文书
2014个人年终工作总结范文
2014/12/15 职场文书
干货:企业内部人才推荐奖励方案!
2019/07/09 职场文书
python操作xlsx格式文件并读取
2021/06/02 Python
使用RedisTemplat实现简单的分布式锁
2021/11/20 Redis
mysql 排序失效
2022/05/20 MySQL