#include "WDT.h"
Mat WDT_HL( const Mat &_src, const string _wname, const int _level )
{
int reValue = 0;
Mat src = Mat_<float>(_src);
Mat dst = Mat::zeros( src.rows, src.cols,src.type());
std::cout << "src.type():"<<src.type()<<endl;
std::cout << "dst.type():"<<dst.type()<<endl;
int N = src.rows;
int D = src.cols;
/// 高通低通滤波器
Mat lowFilter;
Mat highFilter;
wavelet( _wname, lowFilter, highFilter );
/// 小波变换
int t=1;
int row = N;
int col = D;
while( t<=_level )
{
///先进行行小波变换
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_H( oneRow, highFilter );
/// 将src这一行置为oneRow中的数据
for ( int j=0; j<col; j++ )
{
dst.at<float>(i,j) = oneRow.at<float>(0,j);
}
}
#if 1
//normalize( dst, dst, 0, 255, NORM_MINMAX );
IplImage dstImg1 = IplImage(dst);
cvSaveImage( "dst.jpg", &dstImg1 );
#endif
/// 小波列变换
for ( int j=0; j<col; j++ )
{
/// 取出src数据的一行输入
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);
oneCol.at<float>(i,0) = dst.at<float>(i,j);
}
oneCol = ( waveletDecompose_L( oneCol.t(), lowFilter ) ).t();
for ( int i=0; i<row; i++ )
{
//std::cout<<oneCol.at<float>(i,0)<<endl;
dst.at<float>(i,j) = oneCol.at<float>(i,0);
}
}
#if 1
//normalize( dst, dst, 0, 255, NORM_MINMAX );
IplImage dstImg2 = IplImage(dst);
cvSaveImage( "dst1.jpg", &dstImg2 );
#endif
/// 更新
row /= 2;
col /=2;
t++;
src = dst;
}
return dst;
}
Mat waveletDecompose_H( const Mat &_src, const Mat &_highFilter )
{
assert( _src.rows==1 && _lowFilter.rows==1 && _highFilter.rows==1 );
assert( _src.cols>=_lowFilter.cols && _src.cols>=_highFilter.cols );
Mat &src = Mat_<float>(_src);
int D = src.cols;
Mat &highFilter = Mat_<float>(_highFilter);
filter2D( src, src, -1, highFilter );
return src;
}
Mat waveletDecompose_L( const Mat &_src, const Mat &_lowFilter )
{
assert( _src.rows==1 && _lowFilter.rows==1);
assert( _src.cols>=_lowFilter.cols);
Mat &src = Mat_<float>(_src);
int D = src.cols;
Mat &lowFilter = Mat_<float>(_lowFilter);
filter2D( src, src, -1, lowFilter );
return src;
}
/// 小波变换
Mat WDT( const Mat &_src, const string _wname, const int _level )
{
int reValue = 0;
Mat src = Mat_<float>(_src);
Mat dst = Mat::zeros( src.rows, src.cols, src.type());// );
std::cout << "src.type():"<<src.type()<<endl;
std::cout << "dst.type():"<<dst.type()<<endl;
int N = src.rows;
int D = src.cols;
/// 高通低通滤波器
Mat lowFilter;
Mat highFilter;
wavelet( _wname, lowFilter, highFilter );
/// 小波变换
int t=1;
int row = N;
int col = D;
while( t<=_level )
{
///先进行行小波变换
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<char>(0,j) = src.at<char>(i,j);
oneRow.at<float>(0,j) = src.at<float>(i,j);
}
oneRow = waveletDecompose( oneRow, lowFilter, highFilter );
/// 将src这一行置为oneRow中的数据
for ( int j=0; j<col; j++ )
{
//dst.at<char>(i,j) = oneRow.at<char>(0,j);
dst.at<float>(i,j) = oneRow.at<float>(0,j);
}
}
#if 1
//normalize( dst, dst, 0, 255, NORM_MINMAX );
IplImage dstImg1 = IplImage(dst);
cvSaveImage( "dst.jpg", &dstImg1 );
#endif
/// 小波列变换
for ( int j=0; j<col; j++ )
{
/// 取出src数据的一行输入
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);
}
oneCol = ( waveletDecompose( oneCol.t(), lowFilter, highFilter ) ).t();
for ( int i=0; i<row; i++ )
{
dst.at<float>(i,j) = oneCol.at<float>(i,0);
}
}
#if 1
//normalize( dst, dst, 0, 255, NORM_MINMAX );
IplImage dstImg2 = IplImage(dst);
cvSaveImage( "dst1.jpg", &dstImg2 );
#endif
/// 更新
row /= 2;
col /=2;
t++;
src = dst;
}
return dst;
}
/// 小波逆变换
Mat IWDT( const Mat &_src, const string _wname, const int _level )
{
int reValue = 0;
Mat src = Mat_<float>(_src);
Mat dst = Mat::zeros( src.rows, src.cols, src.type() );
int N = src.rows;
int D = src.cols;
/// 高通低通滤波器
Mat lowFilter;
Mat highFilter;
wavelet( _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 )
{
/// 小波列逆变换
for ( int j=0; j<col; j++ )
{
/// 取出src数据的一行输入
Mat oneCol = Mat::zeros( row, 1, src.type() );
for ( int i=0; i<row; i++ )
{
oneCol.at<float>(i,0) = src.at<float>(i,j);
}
oneCol = ( waveletReconstruct( oneCol.t(), lowFilter, highFilter ) ).t();
for ( int i=0; i<row; i++ )
{
dst.at<float>(i,j) = oneCol.at<float>(i,0);
}
}
#if 0
//normalize( dst, dst, 0, 255, NORM_MINMAX );
IplImage dstImg2 = IplImage(dst);
cvSaveImage( "dst.jpg", &dstImg2 );
#endif
///行小波逆变换
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) = dst.at<float>(i,j);
}
oneRow = waveletReconstruct( oneRow, lowFilter, highFilter );
/// 将src这一行置为oneRow中的数据
for ( int j=0; j<col; j++ )
{
dst.at<float>(i,j) = oneRow.at<float>(0,j);
}
}
#if 0
//normalize( dst, dst, 0, 255, NORM_MINMAX );
IplImage dstImg1 = IplImage(dst);
cvSaveImage( "dst.jpg", &dstImg1 );
#endif
row *= 2;
col *= 2;
src = dst;
}
return dst;
}
////////////////////////////////////////////////////////////////////////////////////////////
/// 调用函数
/// 生成不同类型的小波,现在只有haar,sym2
void wavelet( const string _wname, Mat &_lowFilter, Mat &_highFilter )
{
if ( _wname=="haar" || _wname=="db1" )
{
int N = 32;
_lowFilter = Mat::zeros( 1, N, CV_32F );
_highFilter = Mat::zeros( 1, N, CV_32F );
_lowFilter.at<float>(0, 0) = 1/sqrtf(N);
_lowFilter.at<float>(0, 1) = 1/sqrtf(N);
_highFilter.at<float>(0, 0) = -1/sqrtf(N);
_highFilter.at<float>(0, 1) = 1/sqrtf(N);
}