Haar小波变换代码实现

代码1:以图像的形式显示。


# include
# include


using namespace std;
using namespace cv;

int main(){
Mat img = imread("11.jpg", 0);
int Height = img.cols;
int Width = img.rows;
int depth = 1;    //定义分解深度
int depthcount = 1;
Mat tmp = Mat::ones(Width, Height, CV_32FC1);
Mat wavelet = Mat::ones(Width, Height, CV_32FC1);
Mat imgtmp = img.clone();
imgtmp.convertTo(imgtmp, CV_32FC1);
while (depthcount <= depth){
Width = img.rows / depthcount;
Height = img.cols / depthcount;

for (int i = 0; i < Width; i++){
for (int j = 0; j < Height / 2; j++){
tmp.at(i, j) = (imgtmp.at(i, 2 * j) + imgtmp.at(i, 2 * j + 1)) / 2;
tmp.at(i, j + Height / 2) = (imgtmp.at(i, 2 * j) - imgtmp.at(i, 2 * j + 1)) / 2;
}
}
for (int i = 0; i < Width / 2; i++){
for (int j = 0; j < Height; j++){
wavelet.at(i, j) = (tmp.at(2 * i, j) + tmp.at(2 * i + 1, j)) / 2;
wavelet.at(i + Width / 2, j) = (tmp.at(2 * i, j) - tmp.at(2 * i + 1, j)) / 2;
}
}
imgtmp = wavelet;
depthcount++;
}

namedWindow("jpg", 0);
wavelet.convertTo(wavelet, CV_8UC1);
wavelet += 50;            //图像暗度过低,所以这里我加了50
imshow("jpg", wavelet);
waitKey(0);
return 0;
}                                                                                                    Haar小波变换代码实现_第1张图片  

                                                                                                                                                 图1-1级小波变换

                                            Haar小波变换代码实现_第2张图片  Haar小波变换代码实现_第3张图片

                                                                         图2-2级小波变换                                                                     图3-3级小波变换




代码2:以数据的形式显示


#include  
#include  
#include  
using namespace std; 

int fn1()
{
system("pause");
return 0;
}

int main()
{
_onexit(fn1);
IplImage* srcImg;
double  imgData[8][8];
int i, j;

srcImg = cvLoadImage("11.jpg", 0);
cout << "原8*8数据" << endl;
for (i = 0; i<8; i++)
{
for (j = 0; j<8; j++)
{
imgData[i][j] = cvGetReal2D(srcImg, i + 120, j + 130);
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小波变换代码实现_第4张图片


你可能感兴趣的:(图像处理)