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

波变换

开发平台:

Visual C++

  1. // WvltTrans.cpp: implementation of the CWvltTrans class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "小波变换.h"
  6. #include "WvltTrans.h"
  7. #include <math.h>
  8. #ifdef _DEBUG
  9. #undef THIS_FILE
  10. static char THIS_FILE[]=__FILE__;
  11. #define new DEBUG_NEW
  12. #endif
  13. //////////////////////////////////////////////////////////////////////
  14. // Construction/Destruction
  15. //////////////////////////////////////////////////////////////////////
  16. CWvltTrans::CWvltTrans()
  17. {
  18. }
  19. CWvltTrans::~CWvltTrans()
  20. {
  21. }
  22. /********************************************************************************
  23. *函数描述:Hori_Transform完成一次图像水平方向的小波变换 *
  24. *函数参数:short **spOriginData:二维指针,指向原始的图像数据 *
  25. *   short **spTransData0:小波变换系数,存放一次水平变换后的小波系数 *
  26. *   int   nHeight   :图像属性参数,数值为原始图像的高 *
  27. *   int nWidth_H   :图像属性参数,数值为原始图像宽度值的一半 *
  28. *   float fRadius   :小波变换因子,在调用时候已指定数值为1 *
  29. ********************************************************************************/
  30. void CWvltTrans::Hori_Transform(short** spOriginData, short** spTransData0, int nHeight, int nWidth_H, float fRadius)
  31. {
  32.     int Trans_W, //图像扫描线控制:横坐标
  33. Trans_H, //图像扫描线控制:纵坐标
  34. Trans_M, //图像矩阵的横坐标
  35. Trans_N; //图像矩阵的纵坐标
  36.   int iWidth = nWidth_H * 2; //原始图像的宽度值
  37. short Trans_Coeff0; //小波变换系数
  38.     signed short Trans_Coeff1;
  39. //本模块完成变换系数的赋值采样
  40.     for(Trans_H = 0; Trans_H < nHeight; Trans_H ++)            
  41. {
  42. for(Trans_N = 0; Trans_N < nWidth_H; Trans_N ++)           
  43. {
  44. Trans_W = Trans_N << 1;
  45.             if (fRadius == 2)
  46. {
  47. spTransData0[Trans_H][Trans_N] = (spOriginData[Trans_H][Trans_W]);
  48.                     spTransData0[Trans_H][nWidth_H+Trans_N] = (spOriginData[Trans_H][Trans_W+1]);
  49. }
  50.             else
  51. {
  52.                     spTransData0[Trans_H][Trans_N] = (spOriginData[Trans_H][Trans_W]-128); //even
  53.                     spTransData0[Trans_H][nWidth_H+Trans_N] = (spOriginData[Trans_H][Trans_W+1]-128); //odd
  54. }
  55.     }
  56. }
  57. //通过图像的差分,完成小波变换
  58. for(Trans_H=0; Trans_H<nHeight; Trans_H++)
  59. {
  60. for(Trans_N=0; Trans_N<nWidth_H-1; Trans_N++)
  61. {
  62. //奇偶数值和的一半
  63. Trans_Coeff1 = ((spTransData0[Trans_H][Trans_N]+spTransData0[Trans_H][Trans_N+1])>>1);
  64. //逻辑非操作后数值加1
  65. Trans_Coeff1=~Trans_Coeff1+1;
  66. //系数预测
  67. spTransData0[Trans_H][nWidth_H+Trans_N] = spTransData0[Trans_H][nWidth_H+Trans_N]+Trans_Coeff1;
  68. }
  69. //完成一个偶系数的边界处理
  70. Trans_Coeff1 = ((spTransData0[Trans_H][nWidth_H-1]+spTransData0[Trans_H][nWidth_H-2])>>1);
  71. Trans_Coeff1=~Trans_Coeff1+1;
  72. spTransData0[Trans_H][iWidth-1] = spTransData0[Trans_H][iWidth-1]+Trans_Coeff1;
  73. //完成一个奇系数的边界处理
  74. Trans_Coeff0 = ((spTransData0[Trans_H][nWidth_H]+spTransData0[Trans_H][nWidth_H+1])>>2);
  75. spTransData0[Trans_H][0] = spTransData0[Trans_H][0]+Trans_Coeff0;
  76. //提升,整数到整数的变换
  77. for(Trans_N=1; Trans_N<nWidth_H; Trans_N++)
  78. {
  79. Trans_Coeff0 = ((spTransData0[Trans_H][nWidth_H+Trans_N]+spTransData0[Trans_H][nWidth_H+Trans_N-1])>>2);
  80. spTransData0[Trans_H][Trans_N] = spTransData0[Trans_H][Trans_N]+Trans_Coeff0;
  81. }
  82. }
  83. }
  84. /********************************************************************************
  85. *函数描述: Vert_Transform完成一次图像竖直方向的小波变换 *
  86. *函数参数: short **spOriginData:二维指针,指向原始的图像数据 *
  87. * short **spTransData1:小波变换系数,存放一次竖直变换后的小波系数 *
  88. * int   nHeight_H :图像属性参数,数值为原始图像高度值的一半 *
  89. * int   nWidth :图像属性参数,数值为原始图像宽度 *
  90. * float fRadius :小波变换因子,在调用时候已指定数值为1 *
  91. ********************************************************************************/
  92. void CWvltTrans::Vert_Transform(short** spOriginData, short** spTransData1, int nHeight_H, int nWidth, float fRadius)
  93. {
  94. int Trans_W, //图像扫描线控制:横坐标
  95. Trans_H, //图像扫描线控制:纵坐标
  96. Trans_M, //图像矩阵的横坐标
  97. Trans_N; //图像矩阵的纵坐标
  98.   int iHeight = nHeight_H * 2;//原始图像的宽度值
  99. short Trans_Coeff0; //小波变换系数
  100.     signed short Trans_Coeff1;
  101. //本模块完成变换系数的赋值采样
  102. for(Trans_W = 0; Trans_W < nWidth; Trans_W ++)            
  103. {
  104. for(Trans_M = 0; Trans_M < nHeight_H; Trans_M ++)           
  105. {
  106. Trans_H = Trans_M << 1;
  107.             if (fRadius == 2)
  108. {
  109. spTransData1[Trans_M][Trans_W] = (spOriginData[Trans_H][Trans_W]);
  110.                     spTransData1[nHeight_H + Trans_M][Trans_W] = (spOriginData[Trans_H+1][Trans_W]);
  111. }
  112.             else
  113. {
  114.                     spTransData1[Trans_M][Trans_W] = (spOriginData[Trans_H][Trans_W]-128); //even
  115.                     spTransData1[nHeight_H + Trans_M][Trans_W] = (spOriginData[Trans_H+1][Trans_W]-128); //odd
  116. }
  117.     }
  118. }
  119. //通过图像的差分,完成小波变换
  120. for(Trans_W=0; Trans_W<nWidth; Trans_W++)
  121. {
  122. for(Trans_M=0; Trans_M<nHeight_H-1; Trans_M++)
  123. {
  124. //奇偶数值和的一半
  125. Trans_Coeff1 = ((spTransData1[Trans_M][Trans_W]+spTransData1[Trans_M+1][Trans_W])>>1);
  126. //逻辑非操作后数值加1
  127. Trans_Coeff1=~Trans_Coeff1+1;
  128. //系数预测
  129. spTransData1[nHeight_H + Trans_M][Trans_W] = spTransData1[nHeight_H + Trans_M][Trans_W]+Trans_Coeff1;
  130. }
  131. //完成一个偶系数的边界处理
  132. Trans_Coeff1 = ((spTransData1[nHeight_H-1][Trans_W]+spTransData1[nHeight_H-2][Trans_W])>>1);
  133. Trans_Coeff1=~Trans_Coeff1+1;
  134. spTransData1[iHeight-1][Trans_W] = spTransData1[iHeight-1][Trans_W]+Trans_Coeff1;
  135. //完成一个奇系数的边界处理
  136. Trans_Coeff0 = ((spTransData1[nHeight_H][Trans_W]+spTransData1[nHeight_H+1][Trans_W])>>2);
  137. spTransData1[0][Trans_W] = spTransData1[0][Trans_W]+Trans_Coeff0;
  138. //提升,整数到整数的变换
  139. for(Trans_M=1; Trans_M<nHeight_H; Trans_M++)
  140. {
  141. Trans_Coeff0 = ((spTransData1[nHeight_H + Trans_M][Trans_W]+spTransData1[nHeight_H + Trans_M -1][Trans_W])>>2);
  142. spTransData1[Trans_M][Trans_W] = spTransData1[Trans_M][Trans_W]+Trans_Coeff0;
  143. }
  144. }
  145. }
  146. /********************************************************************************
  147. *函数描述: DWT_Once完成一次图像的小波变换 *
  148. *函数参数: short **spOriginData:二维指针,指向原始的图像数据 *
  149. * short **spTransData0:小波变换系数,存放一次水平变换后的小波系数 *
  150. * short **spTransData1:小波变换系数,存放一次数值变换后的小波系数 *
  151. * int   nHeight :图像属性参数,数值为原始图像的高度值 *
  152. * int   nHeight_H :图像属性参数,数值为原始图像高度值的一半 *
  153. * int   nWidth :图像属性参数,数值为原始图像的宽度值 *
  154. * int   nWidth_H :图像属性参数,数值为原始图像宽度值的一半 *
  155. * int   layer :小波变换的层数,数值为1层 *
  156. * float fRadius :小波变换因子,在调用时候已指定数值为1.414 *
  157. ********************************************************************************/
  158. void CWvltTrans::DWT_Once(short** spOriginData, short** spTransData0, short** spTransData1, int nHeight, int nHeight_H, int nWidth, int nWidth_H, int layer, float fRadius)
  159. {
  160. int Trans_W, //图像扫描线控制:横坐标
  161. Trans_H, //图像扫描线控制:纵坐标
  162. Trans_M, //图像矩阵的横坐标
  163. Trans_N; //图像矩阵的纵坐标
  164. short Trans_Coeff0; //小波变换系数
  165.     signed short Trans_Coeff1;
  166. fRadius=1.414; //变换滤波系数
  167. //本模块完成变换系数的赋值采样
  168. //行变换,第一次(layer=1时)时nHeight即为原始图像的高度值
  169.     for(Trans_H=0; Trans_H<nHeight; Trans_H++)            
  170. {
  171. if(layer == 1)
  172.  //layer=1时,nWidth_H为原始图像宽度值的一半
  173. for(Trans_N=0; Trans_N<nWidth_H; Trans_N++)          
  174. {
  175. Trans_W=Trans_N<<1;
  176.             if (fRadius==2)
  177. {
  178. spTransData0[Trans_H][Trans_N] = (spOriginData[Trans_H][Trans_W]);
  179.                     spTransData0[Trans_H][nWidth_H+Trans_N] = (spOriginData[Trans_H][Trans_W+1]);
  180. }
  181.             else
  182. {
  183.                     spTransData0[Trans_H][Trans_N] = (spOriginData[Trans_H][Trans_W]-128);
  184.                     spTransData0[Trans_H][nWidth_H+Trans_N] = (spOriginData[Trans_H][Trans_W+1]-128);
  185. }
  186.     }
  187. //若变换层数大于1,则仅采样低频的小波系数
  188. if(layer > 1)
  189. for(Trans_N=0; Trans_N<nWidth_H; Trans_N++)
  190. {
  191. Trans_W=Trans_N<<1;
  192. spTransData0[Trans_H][Trans_N] = spTransData1[Trans_H][Trans_W];
  193.             spTransData0[Trans_H][nWidth_H+Trans_N] = spTransData1[Trans_H][Trans_W+1];
  194. }
  195. }
  196. for(Trans_H=0; Trans_H<nHeight; Trans_H++)
  197. {
  198. for(Trans_N=0; Trans_N<nWidth_H-1; Trans_N++)
  199. {
  200. //奇偶数值和的一半
  201. Trans_Coeff1 = ((spTransData0[Trans_H][Trans_N]+spTransData0[Trans_H][Trans_N+1])>>1);
  202. //逻辑非操作后数值加1
  203. Trans_Coeff1=~Trans_Coeff1+1;
  204. //系数预测
  205. spTransData0[Trans_H][nWidth_H+Trans_N] = spTransData0[Trans_H][nWidth_H+Trans_N]+Trans_Coeff1;
  206. }
  207. //完成一个偶系数的边界处理
  208. Trans_Coeff1 = ((spTransData0[Trans_H][nWidth_H-1]+spTransData0[Trans_H][nWidth_H-2])>>1);
  209. Trans_Coeff1=~Trans_Coeff1+1;
  210. spTransData0[Trans_H][nWidth-1] = spTransData0[Trans_H][nWidth-1]+Trans_Coeff1;
  211. //完成一个奇系数的边界处理
  212. Trans_Coeff0 = ((spTransData0[Trans_H][nWidth_H]+spTransData0[Trans_H][nWidth_H+1])>>2);
  213. spTransData0[Trans_H][0] = spTransData0[Trans_H][0]+Trans_Coeff0;
  214. //提升,整数到整数的变换
  215. for(Trans_N=1; Trans_N<nWidth_H; Trans_N++)
  216. {
  217. Trans_Coeff0 = ((spTransData0[Trans_H][nWidth_H+Trans_N]+spTransData0[Trans_H][nWidth_H+Trans_N-1])>>2);
  218. spTransData0[Trans_H][Trans_N] = spTransData0[Trans_H][Trans_N]+Trans_Coeff0;
  219. }
  220. }//水平方向的变换结束
  221. //竖直方向的变换开始,数据源未水平变换后的小波系数
  222. for(Trans_M=0; Trans_M<nHeight; Trans_M++)
  223. {
  224. for(Trans_N=0; Trans_N<nWidth_H; Trans_N++)
  225. {
  226. spTransData0[Trans_M][Trans_N]*=fRadius;
  227. spTransData0[Trans_M][Trans_N+nWidth_H]/=fRadius;
  228. }
  229. }
  230. //行提升后的数据在spTransData0中,spTransData0中的数据自然奇偶有序
  231. for(Trans_N=0; Trans_N<nWidth_H; Trans_N++)
  232. {
  233. //列变换
  234. for(Trans_M=0; Trans_M<nHeight_H; Trans_M++)
  235. {
  236. Trans_H =Trans_M<<1;
  237. //频带LL部分
  238. spTransData1[Trans_M][Trans_N] = spTransData0[Trans_H][Trans_N];
  239. //频带HL部分
  240. spTransData1[nHeight_H+Trans_M][Trans_N] = spTransData0[Trans_H+1][Trans_N];
  241. //频带LH部分
  242. spTransData1[Trans_M][nWidth_H+Trans_N] = spTransData0[Trans_H][nWidth_H+Trans_N];
  243. //频带HH部分
  244. spTransData1[nHeight_H+Trans_M][nWidth_H+Trans_N] = spTransData0[Trans_H+1][nWidth_H+Trans_N];
  245. }
  246. //第一次提升奇数坐标系数
  247. for(Trans_M=0; Trans_M<nHeight_H-1; Trans_M++)
  248. {
  249. //竖直方向的变换 
  250. Trans_Coeff1 = ((spTransData1[Trans_M][Trans_N]+spTransData1[Trans_M+1][Trans_N])>>1);
  251. Trans_Coeff1=~Trans_Coeff1+1;
  252. spTransData1[nHeight_H+Trans_M][Trans_N] = spTransData1[nHeight_H+Trans_M][Trans_N]+Trans_Coeff1;
  253. Trans_Coeff1 = ((spTransData1[Trans_M][nWidth_H+Trans_N]+spTransData1[Trans_M+1][nWidth_H+Trans_N])>>1);
  254. Trans_Coeff1=~Trans_Coeff1+1;
  255. spTransData1[nHeight_H+Trans_M][nWidth_H+Trans_N] = spTransData1[nHeight_H+Trans_M][nWidth_H+Trans_N]+Trans_Coeff1;
  256. }
  257. Trans_Coeff1 = ((spTransData1[nHeight_H-1][Trans_N]+spTransData1[nHeight_H-2][Trans_N])>>1);
  258. Trans_Coeff1=~Trans_Coeff1+1;
  259. spTransData1[nHeight-1][Trans_N] = spTransData1[nHeight-1][Trans_N]+Trans_Coeff1;
  260. Trans_Coeff1 = ((spTransData1[nHeight_H-1][nWidth_H+Trans_N]+spTransData1[nHeight_H-2][nWidth_H+Trans_N])>>1);
  261. Trans_Coeff1=~Trans_Coeff1+1;
  262. //边界处理
  263. spTransData1[nHeight-1][nWidth_H+Trans_N] = spTransData1[nHeight-1][nWidth_H+Trans_N]+Trans_Coeff1;
  264. Trans_Coeff0 = ((spTransData1[nHeight_H][Trans_N]+spTransData1[nHeight_H+1][Trans_N])>>2);
  265. spTransData1[0][Trans_N] = spTransData1[0][Trans_N]+Trans_Coeff0;
  266. Trans_Coeff0 = ((spTransData1[nHeight_H][nWidth_H+Trans_N]+spTransData1[nHeight_H+1][nWidth_H+Trans_N])>>2);
  267. //边界处理
  268. spTransData1[0][nWidth_H+Trans_N] = spTransData1[0][nWidth_H+Trans_N]+Trans_Coeff0;
  269. //第一次提升偶数坐标系数
  270. for(Trans_M=1; Trans_M<nHeight_H; Trans_M++)
  271. {
  272. Trans_Coeff0 = ((spTransData1[nHeight_H+Trans_M][Trans_N]+spTransData1[nHeight_H+Trans_M-1][Trans_N])>>2);
  273. spTransData1[Trans_M][Trans_N] = spTransData1[Trans_M][Trans_N]+Trans_Coeff0;
  274. Trans_Coeff0 = ((spTransData1[nHeight_H+Trans_M][nWidth_H+Trans_N]+spTransData1[nHeight_H+Trans_M-1][nWidth_H+Trans_N])>>2);
  275. spTransData1[Trans_M][nWidth_H+Trans_N] = spTransData1[Trans_M][nWidth_H+Trans_N]+Trans_Coeff0;
  276. }
  277. }
  278. //存放小波系数,LL频带的系数进行幅值增强处理,其它高频频带的系数则削弱其幅值
  279. for(Trans_N=0; Trans_N<nWidth; Trans_N++)
  280. {
  281. for(Trans_M=0; Trans_M<nHeight_H; Trans_M++)
  282. {
  283. spTransData1[Trans_M][Trans_N]*=fRadius;
  284. spTransData1[Trans_M+nHeight_H][Trans_N]/=fRadius;
  285. }
  286. }
  287. }
  288. /********************************************************************************
  289. *函数描述: DWT_TwoLayers完成两次图像的小波变换 *
  290. *函数参数: short **spOriginData:二维指针,指向原始的图像数据 *
  291. * short **spTransData0:小波变换系数,存放一次水平变换后的小波系数 *
  292. * short **spTransData1:小波变换系数,存放一次数值变换后的小波系数 *
  293. * int   nHeight :图像属性参数,数值为原始图像的高度值 *
  294. * int   nHeight_H :图像属性参数,数值为原始图像高度值的一半 *
  295. * int   nWidth :图像属性参数,数值为原始图像的宽度值 *
  296. * int   nWidth_H :图像属性参数,数值为原始图像宽度值的一半 *
  297. * int   layer :小波变换的层数,数值为2层 *
  298. * float fRadius :小波变换因子,在调用时候已指定数值为1.414 *
  299. ********************************************************************************/
  300. void CWvltTrans::DWT_TwoLayers(short** spOriginData, short** spTransData0, short** spTransData1, int nHeight, int nHeight_H, int nWidth, int nWidth_H, int layer, float fRadius)
  301. {
  302. int i;
  303. short **pData, **pTran0, **pTran1;
  304. //图像的属性参数
  305. int iWidth, iHeight, iWidth_H, iHeight_H;
  306. float fr = fRadius;
  307. //获得数据空间的指针
  308. pData = spOriginData;
  309. pTran0 = spTransData0;
  310. pTran1 = spTransData1;
  311. //图像属性参数赋值
  312. iWidth = nWidth; iWidth_H = nWidth_H;
  313. iHeight = nHeight; iHeight_H = nHeight_H;
  314. //利用循环完成两次小波变换
  315. for(i=1; i<=layer; i++)
  316. {
  317. DWT_Once(pData,pTran0,pTran1,iHeight,iHeight_H,iWidth,iWidth_H,i,fr);
  318. iHeight=iHeight>>1; iWidth=iWidth>>1;
  319. iHeight_H=iHeight/2; iWidth_H=iWidth/2;
  320. }
  321. }
  322. /********************************************************************************
  323. *函数描述: DWT_TriLayers完成三次图像的小波变换 *
  324. *函数参数: short **spOriginData:二维指针,指向原始的图像数据 *
  325. * short **spTransData0:小波变换系数,存放一次水平变换后的小波系数 *
  326. * short **spTransData1:小波变换系数,存放一次数值变换后的小波系数 *
  327. * int   nHeight :图像属性参数,数值为原始图像的高度值 *
  328. * int   nHeight_H :图像属性参数,数值为原始图像高度值的一半 *
  329. * int   nWidth :图像属性参数,数值为原始图像的宽度值 *
  330. * int   nWidth_H :图像属性参数,数值为原始图像宽度值的一半 *
  331. * int   layer :小波变换的层数,数值为3层 *
  332. * float fRadius :小波变换因子,在调用时候已指定数值为1.414 *
  333. ********************************************************************************/
  334. void CWvltTrans::DWT_TriLayers(short** spOriginData, short** spTransData0, short** spTransData1, int nHeight, int nHeight_H, int nWidth, int nWidth_H, int layer, float fRadius)
  335. {
  336. int i;
  337. short **pData, **pTran0, **pTran1;
  338. //图像的属性参数
  339. int iWidth, iHeight, iWidth_H, iHeight_H;
  340. float fr = fRadius;
  341. //获得数据空间的指针
  342. pData = spOriginData;
  343. pTran0 = spTransData0;
  344. pTran1 = spTransData1;
  345. //图像属性参数赋值
  346. iWidth = nWidth; iWidth_H = nWidth_H;
  347. iHeight = nHeight; iHeight_H = nHeight_H;
  348. //利用循环完成两次小波变换
  349. for(i=1; i<=layer; i++)
  350. {
  351. DWT_Once(pData,pTran0,pTran1,iHeight,iHeight_H,iWidth,iWidth_H,i,fr);
  352. iHeight=iHeight>>1; iWidth=iWidth>>1;
  353. iHeight_H=iHeight/2; iWidth_H=iWidth/2;
  354. }
  355. }
  356. /********************************************************************************
  357. *函数描述: DWTi_Once完成一次图像小波变换的逆变换 *
  358. *函数参数: short **spData :二维指针,其数据空间存放小波逆变换后的图像数据*
  359. * short **spTransData0:小波变换系数,存放一次水平变换后的小波系数 *
  360. * short **spTransData1:小波变换系数,存放一次数值变换后的小波系数 *
  361. * int   nHeight :图像属性参数,数值为原始图像的高度值 *
  362. * int   nHeight_H :图像属性参数,数值为原始图像高度值的一半 *
  363. * int   nWidth :图像属性参数,数值为原始图像的宽度值 *
  364. * int   nWidth_H :图像属性参数,数值为原始图像宽度值的一半 *
  365. * int   layer :小波变换的层数,数值为3层 *
  366. * float fRadius :小波变换因子,在调用时候已指定数值为1.414 *
  367. ********************************************************************************/
  368. void CWvltTrans::DWTi_Once(short **spData, short **spTransData0, short **spTransData1, int nHeight, int nHeight_H, int nWidth, int nWidth_H, int layer, float fRadius)
  369. {
  370. int Trans_W, //图像扫描线控制:横坐标
  371. Trans_H, //图像扫描线控制:纵坐标
  372. Trans_M, //图像矩阵的横坐标
  373. Trans_N; //图像矩阵的纵坐标
  374. short WvltCoeff0; //小波变换系数
  375.     signed short WvltCoeff1;
  376. for(Trans_N=0; Trans_N<nWidth; Trans_N++)
  377. {
  378. for(Trans_M=0; Trans_M<nHeight_H; Trans_M++)
  379. {
  380. spTransData1[Trans_M][Trans_N]/=fRadius;
  381. spTransData1[Trans_M+nHeight_H][Trans_N]*=fRadius;
  382. }
  383. }
  384. //逆变换是一个逆过程,所以现从竖直方向开始
  385. //竖直方向的逆变换(此时自然奇偶有序排列),Trans_N为图像矩阵的纵坐标
  386. for(Trans_N=0; Trans_N<nWidth_H; Trans_N++)
  387. {
  388. //偶数坐标的小波系数逆变换时的边界处理
  389. WvltCoeff0 = ((spTransData1[nHeight_H][Trans_N]+spTransData1[nHeight_H+1][Trans_N])>>2);
  390. spTransData1[0][Trans_N] = spTransData1[0][Trans_N]-WvltCoeff0;
  391. WvltCoeff0 = ((spTransData1[nHeight_H][nWidth_H+Trans_N]+spTransData1[nHeight_H+1][nWidth_H+Trans_N])>>2);
  392. spTransData1[0][nWidth_H+Trans_N] = spTransData1[0][nWidth_H+Trans_N]-WvltCoeff0;
  393. //竖直方向逆变换的第二次偶数坐标小波系数的逆变换
  394. for(Trans_M=1; Trans_M<nHeight_H; Trans_M++)
  395. {
  396. WvltCoeff0 = ((spTransData1[nHeight_H+Trans_M][Trans_N]+spTransData1[nHeight_H+Trans_M-1][Trans_N])>>2);
  397. spTransData1[Trans_M][Trans_N] = spTransData1[Trans_M][Trans_N]-WvltCoeff0;
  398. WvltCoeff0 = ((spTransData1[nHeight_H+Trans_M][nWidth_H+Trans_N]+spTransData1[nHeight_H+Trans_M-1][nWidth_H+Trans_N])>>2);
  399. spTransData1[Trans_M][nWidth_H+Trans_N] = spTransData1[Trans_M][nWidth_H+Trans_N]-WvltCoeff0;
  400. }
  401. //第二次奇数坐标小波系数的逆变换
  402. for(Trans_M=0; Trans_M<nHeight_H-1; Trans_M++)
  403. {
  404. WvltCoeff1 = ((spTransData1[Trans_M][Trans_N]+spTransData1[Trans_M+1][Trans_N])>>1);
  405. WvltCoeff1=~WvltCoeff1+1;
  406. spTransData1[nHeight_H+Trans_M][Trans_N] = spTransData1[nHeight_H+Trans_M][Trans_N]-WvltCoeff1;
  407. WvltCoeff1 = ((spTransData1[Trans_M][nWidth_H+Trans_N]+spTransData1[Trans_M+1][nWidth_H+Trans_N])>>1);
  408. WvltCoeff1=~WvltCoeff1+1;
  409. spTransData1[nHeight_H+Trans_M][nWidth_H+Trans_N] = spTransData1[nHeight_H+Trans_M][nWidth_H+Trans_N]-WvltCoeff1;
  410. }
  411. //奇数坐标小波系数逆变换时的边界处理
  412. WvltCoeff1 = ((spTransData1[nHeight_H-1][Trans_N]+spTransData1[nHeight_H-2][Trans_N])>>1);
  413. WvltCoeff1=~WvltCoeff1+1;
  414. spTransData1[nHeight-1][Trans_N] = spTransData1[nHeight-1][Trans_N]-WvltCoeff1;
  415. WvltCoeff1 = ((spTransData1[nHeight_H-1][nWidth_H+Trans_N]+spTransData1[nHeight_H-2][nWidth_H+Trans_N])>>1);
  416. WvltCoeff1=~WvltCoeff1+1;
  417. spTransData1[nHeight-1][nWidth_H+Trans_N] = spTransData1[nHeight-1][nWidth_H+Trans_N]-WvltCoeff1;
  418. //本模块完成变换系数的赋值采样的逆操作
  419. for(Trans_M=0; Trans_M<nHeight_H; Trans_M++)
  420. {
  421. Trans_H =Trans_M<<1;
  422. spTransData0[Trans_H][Trans_N] = spTransData1[Trans_M][Trans_N];
  423. spTransData0[Trans_H+1][Trans_N] = spTransData1[nHeight_H+Trans_M][Trans_N];
  424. spTransData0[Trans_H][nWidth_H+Trans_N] = spTransData1[Trans_M][nWidth_H+Trans_N];
  425. spTransData0[Trans_H+1][nWidth_H+Trans_N]= spTransData1[nHeight_H+Trans_M][nWidth_H+Trans_N];
  426. }
  427. }
  428. //去除小波变换中频带系数的滤波影像
  429. for(Trans_M=0; Trans_M<nHeight; Trans_M++)
  430. {
  431. for(Trans_N=0; Trans_N<nWidth_H; Trans_N++)
  432. {
  433. spTransData0[Trans_M][Trans_N]/=fRadius;
  434. spTransData0[Trans_M][Trans_N+nWidth_H]*=fRadius;
  435. }
  436. }
  437. //下面进行水平方向的逆变换
  438. //水平方向的逆变换
  439. for(Trans_H=0; Trans_H<nHeight; Trans_H++)
  440. {
  441. //偶数坐标小波系数逆变换时的边界处理
  442. WvltCoeff0 = ((spTransData0[Trans_H][nWidth_H]+spTransData0[Trans_H][nWidth_H+1])>>2);
  443. spTransData0[Trans_H][0] = spTransData0[Trans_H][0]-WvltCoeff0;
  444. //第二次偶数坐标小波系数的逆变换
  445. for(Trans_N=1; Trans_N<nWidth_H; Trans_N++)
  446. {
  447. WvltCoeff0 = ((spTransData0[Trans_H][nWidth_H+Trans_N]+spTransData0[Trans_H][nWidth_H+Trans_N-1])>>2);
  448. spTransData0[Trans_H][Trans_N] = spTransData0[Trans_H][Trans_N]-WvltCoeff0;
  449. }
  450. //第二次奇数坐标小波系数的逆变换
  451. for(Trans_N=0; Trans_N<nWidth_H-1; Trans_N++)
  452. {
  453. WvltCoeff1 = ((spTransData0[Trans_H][Trans_N]+spTransData0[Trans_H][Trans_N+1])>>1);
  454. WvltCoeff1=~WvltCoeff1+1;
  455. spTransData0[Trans_H][nWidth_H+Trans_N] = spTransData0[Trans_H][nWidth_H+Trans_N]-WvltCoeff1;
  456. }
  457. //奇数坐标小波系数逆变换时的边界处理
  458. WvltCoeff1 = ((spTransData0[Trans_H][nWidth_H-1]+spTransData0[Trans_H][nWidth_H-2])>>1);
  459. WvltCoeff1=~WvltCoeff1+1;
  460. spTransData0[Trans_H][nWidth-1] = spTransData0[Trans_H][nWidth-1]-WvltCoeff1;
  461. if(layer > 1)
  462. {
  463. for(Trans_N=0; Trans_N<nWidth_H; Trans_N++)
  464. {
  465. Trans_W =Trans_N<<1;
  466. spTransData1[Trans_H][Trans_W] = spTransData0[Trans_H][Trans_N];
  467. spTransData1[Trans_H][Trans_W+1] = spTransData0[Trans_H][nWidth_H+Trans_N];
  468. }
  469. }
  470. if(layer == 1)
  471. {
  472. for(Trans_N=0; Trans_N<nWidth_H; Trans_N++)
  473. {
  474. Trans_W =Trans_N<<1;
  475. if(fRadius!=2)
  476. {
  477. spTransData0[Trans_H][Trans_N]=spTransData0[Trans_H][Trans_N]+128;
  478. spTransData0[Trans_H][nWidth_H+Trans_N]=spTransData0[Trans_H][nWidth_H+Trans_N]+128;
  479. }
  480. if(spTransData0[Trans_H][Trans_N]>255) spTransData0[Trans_H][Trans_N]=255;
  481. if(spTransData0[Trans_H][Trans_N]<0)   spTransData0[Trans_H][Trans_N]=0;
  482. if(spTransData0[Trans_H][nWidth_H+Trans_N]>255) spTransData0[Trans_H][nWidth_H+Trans_N]=255;
  483. if(spTransData0[Trans_H][nWidth_H+Trans_N]<0)   spTransData0[Trans_H][nWidth_H+Trans_N]=0;
  484. //   spData[Trans_H][Trans_W] = (unsigned char)spTransData0[Trans_H][Trans_N];
  485. spData[Trans_H][Trans_W] = spTransData0[Trans_H][Trans_N];
  486. //    spData[Trans_H][Trans_W+1] = (unsigned char)spTransData0[Trans_H][nWidth_H+Trans_N];
  487. spData[Trans_H][Trans_W+1] =spTransData0[Trans_H][nWidth_H+Trans_N];
  488. }
  489. }
  490. }
  491. }