class WaveTransform
{
public:
Mat WDT(const Mat &_src, const string _wname, const int _level);//小波分解
Mat IWDT(const Mat &_src, const string _wname, const int _level);//小波重构
void wavelet_D(const string _wname, Mat &_lowFilter, Mat &_highFilter);//分解包
void wavelet_R(const string _wname, Mat &_lowFilter, Mat &_highFilter);//重构包
Mat waveletDecompose(const Mat &_src, const Mat &_lowFilter, const Mat &_highFilter);
Mat waveletReconstruct(const Mat &_src, const Mat &_lowFilter, const Mat &_highFilter);
};
Mat WaveTransform::WDT(const Mat &_src, const string _wname, const int _level)
{
Mat_<float> src = Mat_<float>(_src);
Mat dst = Mat::zeros(src.rows, src.cols, src.type());
int row = src.rows;
int col = src.cols;
//高通低通滤波器
Mat lowFilter;
Mat highFilter;
wavelet_D(_wname, lowFilter, highFilter);
//小波变换
int t = 1;
while (t <= _level)
{
//先进行 行小波变换
//#pragma omp parallel for
for (int i = 0; i < row; i++)
{
//取出src中要处理的数据的一行
Mat oneRow = Mat::zeros(1, col, src.type());
for (int j = 0; j < col; j++)
{
oneRow.at<float>(0, j) = src.at<float>(i, j);
}
oneRow = waveletDecompose(oneRow, lowFilter, highFilter);
for (int j = 0; j < col; j++)
{
dst.at<float>(i, j) = oneRow.at<float>(0, j);
}
}
//小波列变换
//#pragma omp parallel for
for (int j = 0; j < col; j++)
{
Mat oneCol = Mat::zeros(row, 1, src.type());
for (int i = 0; i < row; i++)
{
oneCol.at<float>(i, 0) = dst.at<float>(i, j);//dst,not src
}
oneCol = (waveletDecompose(oneCol.t(), lowFilter, highFilter)).t();
for (int i = 0; i < row; i++)
{
dst.at<float>(i, j) = oneCol.at<float>(i, 0);
}
}
//更新
row /= 2;
col /= 2;
t++;
src = dst;
}
return dst;
}
Mat WaveTransform::IWDT(const Mat &_src, const string _wname, const int _level)
{
Mat src = Mat_<float>(_src);
Mat dst;
src.copyTo(dst);
int N = src.rows;
int D = src.cols;
//高低通滤波器
Mat lowFilter;
Mat highFilter;
wavelet_R(_wname, lowFilter, highFilter);
//小波变换
int t = 1;
int row = N / std::pow(2., _level - 1);
int col = D / std::pow(2., _level - 1);
while (row <= N && col <= D)
//while(t<=_level)
{
//列逆变
Opencv两图像融合
最新推荐文章于 2024-06-21 15:30:20 发布