日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Haar小波变换代码实现

發(fā)布時間:2023/12/15 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Haar小波变换代码实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

代碼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:以數(shù)據(jù)的形式顯示


#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數(shù)據(jù)" << 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級小波分解數(shù)據(jù)" << 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級小波逆分解數(shù)據(jù)" << endl;
for (i = 0; i<8; i++)
{
for (j = 0; j<8; j++)
{
cout << imgData[i][j] << " ";
}
cout << endl;
}

return 0;
}

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??


總結

以上是生活随笔為你收集整理的Haar小波变换代码实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。