Haar小波变换代码实现
代碼1:以圖像的形式顯示。
# include<opencv2/opencv.hpp>
# include<iostream>
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<float>(i, j) = (imgtmp.at<float>(i, 2 * j) + imgtmp.at<float>(i, 2 * j + 1)) / 2;
tmp.at<float>(i, j + Height / 2) = (imgtmp.at<float>(i, 2 * j) - imgtmp.at<float>(i, 2 * j + 1)) / 2;
}
}
for (int i = 0; i < Width / 2; i++){
for (int j = 0; j < Height; j++){
wavelet.at<float>(i, j) = (tmp.at<float>(2 * i, j) + tmp.at<float>(2 * i + 1, j)) / 2;
wavelet.at<float>(i + Width / 2, j) = (tmp.at<float>(2 * i, j) - tmp.at<float>(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;
} ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖1-1級小波變換
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖2-2級小波變換 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖3-3級小波變換
代碼2:以數據的形式顯示
#include <cv.h> ?
#include <highgui.h> ?
#include <iostream> ?
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小波变换代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win+d的作用(环境变量的作用)
- 下一篇: 年金险的功能与意义 年金保险有什么功能和