哈尔小波变换的原理及其实现(Haar)
来源:互联网 发布:网络调查赚钱 编辑:程序博客网 时间:2024/06/10 06:22
Haar小波在图像处理和数字水印等方面应用较多,这里简单的介绍一下哈尔小波的基本原理以及其实现情况。
一、Haar小波的基本原理
数学理论方面的东西我也不是很熟悉,这边主要用简单的例子来介绍下Haar小波的使用情况。
例如:有a=[8,7,6,9]四个数,并使用b[4]数组来保存结果.
则一级Haar小波变换的结果为:
b[0]=(a[0]+a[1])/2, b[2]=(a[0]-a[1])/2
b[1]=(a[2]+a[3])/2, b[3]=(a[2]-a[3])/2
即依次从数组中取两个数字,计算它们的和以及差,并将和一半和差的一半依次保存在数组的前半部分和后半部分。
例如:有a[8],要进行一维Haar小波变换,结果保存在b[8]中
则一级Haar小波变换的结果为:
b[0]=(a[0]+a[1])/2, b[4]=(a[0]-a[1])/2
b[1]=(a[2]+a[3])/2, b[5]=(a[2]-a[3])/2
b[2]=(a[4]+a[5])/2, b[6]=(a[4-a[5]])/2
b[3]=(a[6]+a[7])/2, b[7]=(a[6]-a[7])/2
如果需要进行二级Haar小波变换的时候,只需要对b[0]-b[3]进行Haar小波变换.
对于二维的矩阵来讲,每一级Haar小波变换需要先后进行水平方向和竖直方向上的两次一维小波变换,行和列的先后次序对结果不影响。
二、Haar小波的实现
使用opencv来读取图片及像素,对图像的第一个8*8的矩阵做了一级小波变换
- #include <cv.h>
- #include <highgui.h>
- #include <iostream>
- using namespace std;int main()
- {
- IplImage* srcImg;
- double imgData[8][8];
- int i,j;
- srcImg=cvLoadImage("lena.bmp",0);
- cout<<"原8*8数据"<<endl;
- for( i=0;i<8;i++)
- {
- for( j=0;j<8;j++)
- {
- imgData[i][j]=cvGetReal2D(srcImg,i+256,j+16);
- cout<<imgData[i][j]<<" ";
- }
- cout<<endl;
- } double tempData[8];
- //行小波分解
- for( i=0;i<8;i++)
- {
- for( j=0;j<4;j++)
- {
- double temp1=imgData[i][2*j];
- double temp2=imgData[i][2*j+1];
- tempData[j]=(temp1+temp2)/2;
- tempData[j+4]=(temp1-temp2)/2;
- } for( j=0;j<8;j++)
- {
- imgData[i][j]=tempData[j];
- }
- } //列小波分解
- for( i=0;i<8;i++)
- {
- for( j=0;j<4;j++)
- {
- double temp1=imgData[2*j][i];
- double temp2=imgData[2*j+1][i];
- tempData[j]=(temp1+temp2)/2;
- tempData[j+4]=(temp1-temp2)/2;
- }
- for( j=0;j<8;j++)
- {
- imgData[j][i]=tempData[j];
- }
- }
- cout<<"1级小波分解数据"<<endl;
- for( i=0;i<8;i++)
- {
- for( j=0;j<8;j++)
- {
- cout<<imgData[i][j]<<" ";
- }
- cout<<endl;
- }
- //列小波逆分解
- for( i=0;i<8;i++)
- {
- for( j=0;j<4;j++)
- {
- double temp1=imgData[j][i];
- double temp2=imgData[j+4][i];
- tempData[2*j]=temp1+temp2;
- tempData[2*j+1]=temp1-temp2;
- } for( j=0;j<8;j++)
- {
- imgData[j][i]=tempData[j];
- }
- } //行小波逆分解
- for( i=0;i<8;i++)
- {
- for( j=0;j<4;j++)
- {
- double temp1=imgData[i][j];
- double temp2=imgData[i][j+4];
- tempData[2*j]=temp1+temp2;
- tempData[2*j+1]=temp1-temp2;
- }
- for( j=0;j<2*4;j++)
- {
- imgData[i][j]=tempData[j];
- }
- } cout<<"1级小波逆分解数据"<<endl;
- for( i=0;i<8;i++)
- {
- for( j=0;j<8;j++)
- {
- cout<<imgData[i][j]<<" ";
- }
- cout<<endl;
- }
- return 0;
- }
- 哈尔小波变换的原理及其实现(Haar)
- 哈尔小波变换的原理及其实现(Haar)
- 哈尔小波变换的原理及其实现(Haar)
- Haar小波变换的快速实现
- HAAR特征+adaboost的实现原理
- Haar小波变换代码实现
- Hough变换 直线检测原理及其Matlab实现
- 图像的等距变换,相似变换,仿射变换,射影变换及其matlab实现
- 图像的等距变换,相似变换,仿射变换,射影变换及其matlab实现
- 一维的Haar小波变换
- 一维的Haar小波变换
- 一维的Haar小波变换
- 一维的Haar小波变换
- 一维的Haar小波变换
- Haar小波变换的推演说明
- Haar特征描述子及其代码实现
- Haar特征描述子及其代码实现
- HTTPS的实现及其原理
- unity xml加密解密源码
- 转载For语句讲解2
- jQuery源码分析17--回调函数
- 关于不再使用的Java对象手工指null是否有意义
- iOS移除所有的子View
- 哈尔小波变换的原理及其实现(Haar)
- shader学习笔记二
- 转载For语句讲解
- 文件上传 汇总
- Start your own JavaScript library using webpack and ES6
- shareSDK
- file not recognized: File truncated【yocto编译错误】
- 《Linux设备驱动程序开发详解》中的virtualBox下的ubuntu在vmware下使用
- 禁用其他应用程序, 代码块