小波变换Copencv实现_第1页
小波变换Copencv实现_第2页
小波变换Copencv实现_第3页
小波变换Copencv实现_第4页
小波变换Copencv实现_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、小波变换C+ opencv实现小波变换 C+ opencv实现 2014-10-29 09:323299 人阅读评论 (2)收藏举报分类: CV 相关( 275 )申明,本文非笔者原创,原文转载自:源码:/ 小波变换Mat WDT( const Mat &_src, const string _wname,const int _level )constint reValue = THID_ERR_NONE;Mat src = Mat_<float>(_src);Mat dst = Mat:zeros( src.rows, src.cols, src.type() );int

2、 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+ )

3、 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<float>(i,j) =oneRow.at<float>(0,j);#if 0/normalize( dst, dst, 0, 255, NORM_MINMAX ); IplImage dstImg1 = IplImage

4、(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 ) ).

5、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/ 更新row /= 2;col /=2;t+;src = dst;return dst;/ 小波逆变换Mat IWDT( const Mat &_src, con

6、st string _wname,const int _level )constint reValue = THID_ERR_NONE;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:p

7、ow( 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 = ( waveletRecons

8、truct( 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+ )/ 取出

9、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<flo

10、at>(0,j);#if 0/normalize( dst, dst, 0, 255, NORM_MINMAX ); IplImage dstImg1 = IplImage(dst); cvSaveImage( dst.jpg, &dstImg1 );#endifrow *= 2;col *= 2;src = dst;return dst;/ 调用函数/ 生成不同类型的小波,现在只有haar ,sym2void wavelet( const string _wname, Mat &_lowFilter,Mat &_highFilter )constif ( _wn

11、ame=haar | _wname=db1 )int N = 2;_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

12、);if ( _wname =sym2 )int N = 4;float h = -0.483, 0.836, -0.224, -0.129 ;float l = -0.129, 0.224,0.837, 0.483 ;_lowFilter = Mat:zeros( 1, N, CV_32F ); _highFilter = Mat:zeros( 1, N, CV_32F );for ( int i=0; i<N; i+ )_lowFilter.at<float>(0, i) = li;_highFilter.at<float>(0, i) = hi;/ 小波分解

13、Mat waveletDecompose( const Mat &_src, const Mat &_lowFilter, const Mat &_highFilter )const assert( _src.rows=1 && _lowFilter.rows=1 && _highFilter.rows=1 );assert( _src.cols>=_lowFilter.cols &&_src.cols>=_highFilter.cols );Mat &src = Mat_<float>(_

14、src);int D = src.cols;Mat &lowFilter = Mat_<float>(_lowFilter); Mat &highFilter = Mat_<float>(_highFilter);/ 频域滤波,或时域卷积;ifft( fft(x) * fft(filter) =cov(x,filter)Mat dst1 = Mat:zeros( 1, D, src.type() );Mat dst2 = Mat:zeros( 1, D, src.type();filter2D( src, dst1, -1, lowFilter );fi

15、lter2D( src, dst2, -1, highFilter );/ 下采样Mat downDst1 = Mat:zeros( 1, D/2, src.type() ); Mat downDst2 = Mat:zeros( 1, D/2, src.type() );resize( dst1, downDst1, downDst1.size() ); resize( dst2, downDst2, downDst2.size() );/ 数据拼接for ( int i=0; i<D/2; i+ )src.at<float>(0, i) =downDst1.at<fl

16、oat>( 0, i );src.at<float>(0, i+D/2) =downDst2.at<float>( 0, i );return src;/ 小波重建Mat waveletReconstruct( const Mat &_src, const Mat &_lowFilter, const Mat &_highFilter )const assert( _src.rows=1 && _lowFilter.rows=1 && _highFilter.rows=1 );assert( _src.col

17、s>=_lowFilter.cols && _src.cols>=_highFilter.cols );Mat &src = Mat_<float>(_src);int D = src.cols;Mat &lowFilter = Mat_<float>(_lowFilter); Mat &highFilter = Mat_<float>(_highFilter);/ 插值 ;Mat Up1 = Mat:zeros( 1, D, src.type() );Mat Up2 = Mat:zeros( 1, D,

18、src.type() );/ 插值为 0/for ( int i=0, cnt=1; i<D/2; i+,cnt+=2 )/ Up1.at<float>( 0, cnt ) =src.at<float>( 0, i );/<前一半/ Up2.at<float>( 0, cnt ) =src.at<float>( 0, i+D/2 ); /<后一半/ 线性插值Mat roi1( src, Rect(0, 0, D/2, 1) );Mat roi2( src, Rect(D/2, 0, D/2, 1) );resize( roi1, Up1, Up1.size(), 0, 0, INTER_CUBIC ); resize( roi2, Up2, Up2.size(), 0, 0, INTER_CUBIC );/ 前一半低通,后一半高通Mat dst1 = Mat:zeros( 1, D, src.type() ); Mat dst2= Mat:zeros( 1, D, src.type() ); filter2D( Up1, dst1, -1,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论