首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

哈尔小波变换的原理及其实现(Haar)

哈尔小波变换的原理及其实现(Haar)

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[j]=cvGetReal2D(srcImg,i+256,j+16);  
  •    cout<<imgData[j]<<" ";  
  •   }  
  •   cout<<endl;  
  • }    double tempData[8];  
  • //行小波分解
  • for( i=0;i<8;i++)  
  • {  
  •   for( j=0;j<4;j++)  
  •   {  
  •    double temp1=imgData[2*j];  
  •    double temp2=imgData[2*j+1];  
  •    tempData[j]=(temp1+temp2)/2;  
  •    tempData[j+4]=(temp1-temp2)/2;  
  •   }  for( j=0;j<8;j++)  
  •   {  
  •    imgData[j]=tempData[j];  
  •   }  
  • } //列小波分解
  • for( i=0;i<8;i++)  
  • {  
  •   for( j=0;j<4;j++)  
  •   {  
  •    double temp1=imgData[2*j];  
  •    double temp2=imgData[2*j+1];  
  •    tempData[j]=(temp1+temp2)/2;  
  •    tempData[j+4]=(temp1-temp2)/2;  
  •   }  
  •   for( j=0;j<8;j++)  
  •   {  
  •    imgData[j]=tempData[j];  
  •   }  
  • }  
  • cout<<"1级小波分解数据"<<endl;  
  • for( i=0;i<8;i++)  
  • {  
  •   for( j=0;j<8;j++)  
  •   {  
  •    cout<<imgData[j]<<" ";  
  •   }  
  •   cout<<endl;  
  • }  
  • //列小波逆分解
  • for( i=0;i<8;i++)  
  • {  
  •   for( j=0;j<4;j++)  
  •   {  
  •    double temp1=imgData[j];  
  •    double temp2=imgData[j+4];  
  •    tempData[2*j]=temp1+temp2;  
  •    tempData[2*j+1]=temp1-temp2;  
  •   }  for( j=0;j<8;j++)  
  •   {  
  •    imgData[j]=tempData[j];  
  •   }  
  • } //行小波逆分解
  • for( i=0;i<8;i++)  
  • {  
  •   for( j=0;j<4;j++)  
  •   {  
  •    double temp1=imgData[j];  
  •    double temp2=imgData[j+4];  
  •    tempData[2*j]=temp1+temp2;  
  •    tempData[2*j+1]=temp1-temp2;  
  •   }  
  •   for( j=0;j<2*4;j++)  
  •   {  
  •    imgData[j]=tempData[j];   
  •   }  
  • } cout<<"1级小波逆分解数据"<<endl;  
  • for( i=0;i<8;i++)  
  • {  
  •   for( j=0;j<8;j++)  
  •   {  
  •    cout<<imgData[j]<<" ";  
  •   }  
  •   cout<<endl;  
  • }  

  • return 0;  
  • }  
返回列表