使用CUDA计算Haar小波变换
在《Haar小波变换的快速实现》一文里我们提到了Haar小波变换的计算,在这里我们使用CUDA实现文中提到的计算方式。
01
|
__global__ void
|
02
|
_cuda_haar( float *A, float *B, int w, int h, int b_w, int b_h, int row_scan)
|
03
|
{
|
04
|
int i = blockIdx.x * blockDim.x + threadIdx.x;
|
05
|
int j = blockIdx.y * blockDim.y + threadIdx.y;
|
06
|
07
|
int extern_w = b_w * 2;
|
08
|
int extern_h = b_h * 2;
|
09
|
10
|
if (j > extern_w)
|
11
|
return ;
|
12
|
13
|
if (i > extern_h)
|
14
|
return ;
|
15
|
16
|
if (row_scan) //行变换,因为数据为HSL格式,所以只提取L分量,即i * 3 + 2位置的数据,生成的数据只是一个L分量,并*255量化
|
17
|
{
|
18
|
if (j % 2 != 0)
|
19
|
{
|
20
|
if (j > w)
|
21
|
{
|
22
|
B[i * extern_w + b_w + j/2] = A[(i * w + j - 1) * 3 + 2] * 255;
|
23
|
} else
|
24
|
{
|
25
|
B[i * extern_w + b_w + j/2] = (A[(i * w + j - 1) * 3 + 2] - A[(i * w + j) * 3 + 2]) * 255 * 0.5;
|
26
|
}
|
27
|
28
|
} else
|
29
|
{
|
30
|
if (j == w)
|
31
|
{
|
32
|
B[i * extern_w + j/2] = A[(i * w + j) * 3 + 2] * 255;
|
33
|
} else
|
34
|
{
|
35
|
B[i * extern_w + j/2] = (A[(i * w + j) * 3 + 2] + A[(i * w + j + 1) * 3 + 2]) * 255 * 0.5;
|
36
|
}
|
37
|
}
|
38
|
} else
|
39
|
{
|
40
|
if (i % 2 != 0)
|
41
|
{
|
42
|
if (i > h)
|
43
|
{
|
44
|
B[(i/2 + b_h) * extern_w + j] = A[(i - 1) * extern_w + j];
|
45
|
} else
|
46
|
{
|
47
|
B[(i/2 + b_h) * extern_w + j] = (A[(i - 1) * extern_w + j] - A[i * extern_w + j]) * 0.5;
|
48
|
}
|
49
|
} else
|
50
|
{
|
51
|
if (i == h)
|
52
|
{
|
53
|
B[i/2 * extern_w + j] = A[i * extern_w + j];
|
54
|
} else
|
55
|
{
|
56
|
B[i/2 * extern_w + j] = (A[i * extern_w + j] + A[(i + 1) * extern_w + j]) * 0.5;
|
57
|
}
|
58
|
}
|
59
|
}
|
60
|
}
|
代码有点乱,本来行变换和列变换是一次完成的,中间使用一个临时全局存储空间进行存储,但发现做列变换时从全局存储空间提出的数据有一部分是“脏”的,使用_threadfence做了同步处理。问题暂时没有找到,就使用这个替代方法了:先做行变换,然后将数据拷回内存,再拷回显存,第二次调用此内核函数,做列变换。
变换结果如下:
本站所有文章均是原创,版权归本站所有。欢迎转载,但未经同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
使用CUDA计算Haar小波变换相关推荐
- Haar小波变换的快速实现
Haar小波变换的快速实现 2014年3月12日renjihe发表评论阅读评论 先举个例子,有a=[100,12,43,39]四个数,并使用b[4]数组来保存结果. 一级Haar小波变换的结果为: b ...
- SSE2实现HAAR小波变换(dwt2与idwt2)
wiki链接:http://en.wikipedia.org/wiki/Haar_wavelet 可用SSE2实现HAAR小波变换,达到实时,关于HAAR小波的介绍可参考以上维基链接 参考MATLAB ...
- haar小波变换学习笔记
本篇很大一部分内容借鉴了篇末所引用的优质博客~~ 小波可以认为是一个带通滤波器,只允许频率和小波基函数频率相近的信号通过.小波变换的基本思想是用一组小波函数和基函数表示一个函数或者信号. haar小波 ...
- Haar小波变换基本原理
另外参见俄罗斯写的http://www.codeproject.com/Articles/22243/Real-Time-Object-Tracker-in-C Haar小波在图像处理和数字水印等方面 ...
- 图像Haar小波变换
说起小波变换就需要提起傅里叶变换.傅里叶变换就是把波进行分解,可以认为任意一个周期波都可以有足够多的正弦(余弦)波组成,这里足够多的正弦波对应的频率不同,把这些足够的正弦波放在频域中,就是傅里叶变换, ...
- 了解CUDA计算(一)
初识CUDA计算 矩阵计算基础:C=AB,A−R(K,M),B−R(M,P)C=AB, A-R(K,M), B-R(M,P)C=AB,A−R(K,M),B−R(M,P) 矩阵计算的内积视角 将A视为行 ...
- 异构计算实验——CUDA计算矩阵幂
CUDA计算矩阵幂 ** 一.实验内容 本次实验内容为基于CUDA的GPU实现矩阵的幂.要求分别用暴力算法和高效算法实现矩阵的幂. 对于一个 的方阵 ,计算的次幂.首先,生成一个的方阵,保证每行每列元 ...
- 基于tensorflow-gpu-2.6.0 + Intel CPU + GTX1660 SUPER 使用CUDA计算
tensorflow-gpu-2.6.0 + Intel CPU + GTX1660 SUPER 使用CUDA计算 前言: 本文为基于NVIDIA GPU 进行 tensorflow计算的配置说明,如 ...
- 二维图像haar小波变换的分解与重构
二维图像haar小波变换的分解与重构 二维离散小波的理论推导和一维小波类似,但是以其尺度函数生成的尺度函数集作为标准正交基的尺度空间Vi的正交补空间Wi不能直接得到,而是可以证明,正交补空间Wi是由三 ...
最新文章
- TVM在ARM GPU上优化移动深度学习
- Mysql8.0.16 only_full_group_by
- 公开课视频-《第03章 部署-IT基础架构》-大企业云桌面部署实战-在线培训-视频(奉献)...
- stm32L0工程建立(HAL+IAR,无cubemx)
- mysqlplus 批量插入_ibatis结合oracle批量插入三种方法的测评
- 作者:鲍玉斌(1968-),男,博士,东北大学计算机科学系教授
- 倒序查10条数据_餐饮业总营收增量七成由外卖拉动,天眼查数据显示今年我国新增相关企业超10万家...
- 序列化(串行化)- 使用BinaryFormatter进行序列化
- jfinal mysql存储过程_jfinal调用mysql存储过程
- 手把手教你完成unity3D跑酷游戏系列(二)
- 搜索技巧——奇偶剪纸
- [实用教程] 科普贴:SGLTE、SVLTE、CSFB、SRLTE
- PDF 预览和下载你是怎么实现的?
- c语言组播源码_CLAA Class C简单组播业务的实现
- 如何修改默认的FTP帐号或密码
- 全国计算机软件测试工程师,全国计算机等级考试软件测试工程师.doc
- (React-Native 学习之十 ) React-navigation 的使用:
- 二语句法复杂度分析器L2SCA的使用,下载,指标
- 简易计算器软件系统测试计划,Windows自带的计算器测试计划.doc
- 利用DncZeus框架开发UWB室内定位网关
热门文章
- html无序标签前面的标点后移,为啥在网页里,标点符号跑到行首了呢
- OVS vswitchd启动(三十六)
- java a =a-=aa_Java求s=a+aa+aaa+aaaa+aa...a的值
- python os.system 不打印_Python初体验之我爱你
- vs2005不能找到ASP.NET网站之郁闷
- vue2.0无限滚动加载数据插件
- 实验吧---隐写术之男神一般都是很低调的!
- javascript数据类型一览
- MySQL高可用之mysql-mmm环境搭建
- sql server Json表达式解析函数