哈尔小波变换的原理及其实现(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[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;
}


 

      


版权声明:本文为victory06057231原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。