WFilter.cpp
上传用户:aqingfeng
上传日期:2014-03-25
资源大小:1839k
文件大小:6k
源码类别:

波变换

开发平台:

Visual C++

  1. // WFilter.cpp: implementation of the CWFilter class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "小波变换.h"
  6. #include "WFilter.h"
  7. #include "WvltTrans.h"
  8. #include <math.h>
  9. #ifdef _DEBUG
  10. #undef THIS_FILE
  11. static char THIS_FILE[]=__FILE__;
  12. #define new DEBUG_NEW
  13. #endif
  14. //////////////////////////////////////////////////////////////////////
  15. // Construction/Destruction
  16. //////////////////////////////////////////////////////////////////////
  17. CWFilter::CWFilter()
  18. {
  19. }
  20. CWFilter::~CWFilter()
  21. {
  22. }
  23. /**********************************************************************************
  24. *函数描述: LPass_Filter实现小波变换的低通滤波,减少图像的边缘信息,使图像更加平滑*
  25. *函数参数: unsigned char **pData:图像小波变换后的小波系数矩阵   *
  26. * int nHeight  :图像属性参数,数值为原始图像的高度值   *
  27. * int nWidth  :图像属性参数,数值为原始图像的宽度值   *
  28. * int nLayer  :低通滤波器的滤波阶数,数值为小波变换的层数   *
  29. *函数返回值:函数无返回值,小波系数参数是利用指针进行调用   *
  30. **********************************************************************************/
  31. void CWFilter::LPass_Filter(short **pData, int nHeight, int nWidth, int nLayer, int scale)
  32. {
  33. short **spOriginData, **spTransData0, **spTransData1;
  34. int iHeight = nHeight, iWidth = nWidth;
  35. spOriginData = pData;
  36. spTransData0 = new short *[nHeight];
  37. spTransData1 = new short *[nHeight];
  38. m_FilterData = new short * [nHeight];
  39. for(int i = 0; i < nHeight; i ++)
  40. {
  41. spTransData0[i] = new short [nWidth];
  42. spTransData1[i] = new short [nWidth];
  43. m_FilterData[i] = new short [nWidth];
  44. for(int j = 0; j < nWidth; j ++)
  45. {
  46. m_FilterData[i][j] = 0;
  47. }
  48. }
  49. CWvltTrans *Trans;
  50. Trans->DWT_TriLayers(spOriginData, spTransData0, spTransData1, nHeight, nHeight/2, nWidth, nWidth/2, nLayer, 1.414);
  51. for(i = 0; i < (int) nHeight / (4 * scale); i ++)
  52. {
  53. for(int j = 0; j < (int) nWidth / (4 * scale); j ++)
  54. {
  55. m_FilterData[i][j] = spTransData1[i][j];
  56. }
  57. }
  58. delete spTransData0;
  59. delete spTransData1;
  60. DWT_Inverse(iHeight, iWidth, 3);
  61. }
  62. /****************************************************************************
  63. *函数描述: HPass_Filter完成图像的高通滤波处理,得到图像的边缘信息 *
  64. *函数参数: short **pData :二维指针,存放正则化后的小波系数 *
  65. * int   nHeight :图像属性参数,数值为原始图像的高度值 *
  66. * int   nHeight_H :图像属性参数,数值为原始图像高度值的一半 *
  67. * int   nWidth :图像属性参数,数值为原始图像的宽度值 *
  68. * int   nLayer :小波变换的层数 *
  69. *函数返回值:函数无返回值,小波系数参数是利用指针进行调用 *
  70. *****************************************************************************/
  71. void CWFilter::HPass_Filter(short **pData, int nHeight, int nWidth, int nLayer)
  72. {
  73. short **spOriginData, **spTransData0, **spTransData1;
  74. int iHeight = nHeight, iWidth = nWidth;
  75. spOriginData = pData;
  76. spTransData0 = new short *[nHeight];
  77. spTransData1 = new short *[nHeight];
  78. m_FilterData = new short * [nHeight];
  79. for(int i = 0; i < nHeight; i ++)
  80. {
  81. spTransData0[i] = new short [nWidth];
  82. spTransData1[i] = new short [nWidth];
  83. m_FilterData[i] = new short [nWidth];
  84. for(int j = 0; j < nWidth; j ++)
  85. {
  86. m_FilterData[i][j] = 0;
  87. }
  88. }
  89. CWvltTrans *Trans;
  90. Trans->DWT_TriLayers(spOriginData, spTransData0, spTransData1, nHeight, nHeight/2, nWidth, nWidth/2, nLayer, 1.414);
  91. for(i = (int) nHeight / 8; i <  nHeight; i ++)
  92. {
  93. for(int j = (int) nWidth / 8; j <  nWidth ; j ++)
  94. {
  95. m_FilterData[i][j] = spTransData1[i][j];
  96. }
  97. }
  98. delete spTransData0;
  99. delete spTransData1;
  100. DWT_Inverse(iHeight, iWidth, 3);
  101. }
  102. /************************************************************************
  103. *函数描述: DWT_Inverse完成若干层小波变换的逆变换操作 *
  104. *函数参数: int   nHeight :图像属性参数,数值为原始图像的高度值 *
  105. * int   nWidth :图像属性参数,数值为原始图像的宽度值 *
  106. * int   nLayer :小波变换的层数 *
  107. *************************************************************************/
  108. void CWFilter::DWT_Inverse(int nHeight, int nWidth, int nLayer)
  109. {
  110. int iHeight = nHeight / 4, iWidth = nWidth / 4;
  111. int iHeight_H = iHeight / 2, iWidth_H = iWidth / 2;
  112. short **spTransData0, **spTransData1;
  113. spTransData0 = new short * [nHeight];
  114. spTransData1 = new short * [nHeight];
  115. for(int i = 0; i < nHeight; i++)
  116. {
  117. spTransData0[i] = new short [nWidth];
  118. spTransData1[i] = new short [nWidth];
  119. }
  120. CWvltTrans WTrans;
  121. for( i = nLayer; i >= 1; i--)
  122. {
  123. WTrans.DWTi_Once(spTransData0, spTransData1, m_FilterData, iHeight, iHeight_H, iWidth, iWidth_H, i, 1.414);
  124. iHeight <<= 1; iWidth <<= 1;
  125. iHeight_H = iHeight / 2; iWidth_H = iWidth / 2;
  126. }
  127. for(int y = 0; y < nHeight; y++)
  128. {
  129. for(int x = 0; x < nWidth; x++)
  130. {
  131. m_FilterData[y][x] = spTransData0[y][x];
  132. }
  133. }
  134. }
  135. /****************************************************************************
  136. *函数描述: HPass_Filter完成图像的高通滤波处理,得到图像的边缘信息 *
  137. *函数参数: short **pData :二维指针,存放正则化后的小波系数 *
  138. * int   nHeight :图像属性参数,数值为原始图像的高度值 *
  139. * int   nHeight_H :图像属性参数,数值为原始图像高度值的一半 *
  140. * int   nWidth :图像属性参数,数值为原始图像的宽度值 *
  141. * int   nLayer :小波变换的层数 *
  142. *函数返回值:函数无返回值,小波系数参数是利用指针进行调用 *
  143. *****************************************************************************/
  144. void CWFilter::HPass_Filter2(short **pData, int nHeight, int nWidth, int nLayer)
  145. {
  146. short **spOriginData, **spTransData0, **spTransData1;
  147. int iHeight = nHeight, iWidth = nWidth;
  148. spOriginData = pData;
  149. spTransData0 = new short *[nHeight];
  150. spTransData1 = new short *[nHeight];
  151. m_FilterData = new short * [nHeight];
  152. for(int i = 0; i < nHeight; i ++)
  153. {
  154. spTransData0[i] = new short [nWidth];
  155. spTransData1[i] = new short [nWidth];
  156. m_FilterData[i] = new short [nWidth];
  157. }
  158. CWvltTrans *Trans;
  159. Trans->DWT_TriLayers(spOriginData, spTransData0, spTransData1, nHeight, nHeight/2, nWidth, nWidth/2, nLayer, 1.414);
  160. for(i = 0; i <  nHeight; i ++)
  161. {
  162. for(int j = 0; j <  nWidth ; j ++)
  163. {
  164. m_FilterData[i][j] = spTransData1[i][j];
  165. if(i < nHeight / 8 && j < nWidth / 8)
  166. m_FilterData[i][j] /= 2;
  167. }
  168. }
  169. delete spTransData0;
  170. delete spTransData1;
  171. DWT_Inverse(iHeight, iWidth, 3);
  172. }