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 相关文章推荐
简单漂亮的js弹窗可自由拖拽且兼容大部分浏览器
Oct 22 Javascript
JS对文本框值的判断示例
Mar 10 Javascript
JavaScript两种跨域技术全面介绍
Apr 16 Javascript
Javascript核心读书有感之语言核心
Feb 01 Javascript
jquery常用函数与方法汇总
Sep 01 Javascript
AngularJS 中使用Swiper制作滚动图不能滑动的解决方法
Nov 15 Javascript
javascript计算渐变颜色的实例
Sep 22 Javascript
React中常见的动画实现的几种方式
Jan 10 Javascript
Vue-Quill-Editor富文本编辑器的使用教程
Sep 21 Javascript
用jQuery将JavaScript对象转换为querystring查询字符串的方法
Nov 12 jQuery
vue商城中商品“筛选器”功能的实现代码
Jul 01 Javascript
JavaScript中MutationObServer监听DOM元素详情
Nov 27 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
2020最新CPU的性能排名
2020/04/02 数码科技
说说PHP的autoLoad自动加载机制
2012/09/27 PHP
解析PHP获取当前网址及域名的实现代码
2013/06/23 PHP
php封装json通信接口详解及实例
2017/03/07 PHP
关于JavaScript中string 的replace
2013/04/12 Javascript
一个js导致的jquery失效问题的解决方法
2013/11/27 Javascript
js形成页面的一种遮罩效果实例代码
2014/01/04 Javascript
javascript将数字转换整数金额大写的方法
2015/01/27 Javascript
深入学习JavaScript对象
2015/10/13 Javascript
JavaScript事件类型中焦点、鼠标和滚轮事件详解
2016/01/25 Javascript
JS中的forEach、$.each、map方法推荐
2016/04/05 Javascript
jquery实现购物车基本功能
2019/10/25 jQuery
vue props 一次传多个值实例
2020/07/22 Javascript
JS removeAttribute()方法实现删除元素的某个属性
2021/01/11 Javascript
理解生产者消费者模型及在Python编程中的运用实例
2016/06/26 Python
python xml.etree.ElementTree遍历xml所有节点实例详解
2016/12/04 Python
Python科学计算之Pandas详解
2017/01/15 Python
python数据分析数据标准化及离散化详解
2018/02/26 Python
influx+grafana自定义python采集数据和一些坑的总结
2018/09/17 Python
python求质数的3种方法
2018/09/28 Python
3分钟学会一个Python小技巧
2018/11/23 Python
Python cv2 图像自适应灰度直方图均衡化处理方法
2018/12/07 Python
Python-copy()与deepcopy()区别详解
2019/07/12 Python
使用darknet框架的imagenet数据分类预训练操作
2020/07/07 Python
Python自动发送和收取邮件的方法
2020/08/12 Python
python中pivot()函数基础知识点
2021/01/03 Python
LEGO玩具英国官方商店:LEGO Shop GB
2018/03/27 全球购物
集世界奢侈品和设计师品牌的意大利精品买手店:Tessabit
2019/08/17 全球购物
建筑工程技术应届生自荐信
2013/09/27 职场文书
远程教育心得体会
2014/01/03 职场文书
本科毕业生应聘自荐信范文
2014/06/26 职场文书
国庆节标语大全
2014/10/08 职场文书
群众路线查摆问题整改措施思想汇报
2014/10/10 职场文书
毕业生银行实习自我鉴定
2014/10/14 职场文书
CSS3 Tab动画实例之背景切换动态效果
2021/08/23 HTML / CSS
java如何实现获取客户端ip地址的示例代码
2022/04/07 Java/Android