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

波变换

开发平台:

Visual C++

  1. // Diproc.cpp: implementation of the CDiproc class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "小波变换.h"
  6. #include "Diproc.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. CDiproc::CDiproc()
  18. {
  19. }
  20. CDiproc::~CDiproc()
  21. {
  22. }
  23. /********************************************************************************
  24. *函数描述: DIP_WvltRevers完成图像小波系数的复原,恢复出原始的图像数据 *
  25. *函数参数: short **spData :二维指针,指向原始的图像数据 *
  26. * short **spTransData0:小波变换系数,存放一次水平变换后的小波系数 *
  27. * short **spTransData1:小波变换系数,存放一次数值变换后的小波系数 *
  28. * int   nHeight :图像属性参数,数值为原始图像的高度值 *
  29. * int   nHeight_H :图像属性参数,数值为原始图像高度值的一半 *
  30. * int   nWidth :图像属性参数,数值为原始图像的宽度值 *
  31. * int   nWidth_H :图像属性参数,数值为原始图像宽度值的一半 *
  32. * int   layer :小波变换的层数,数值为3层 *
  33. * float fRadius :小波变换因子,在调用时候已指定数值为1.414 *
  34. ********************************************************************************/
  35. void CDiproc::DIP_WvltRevers(short **spData, short **spTransData0, short **spTransData1, int nHeight, int nHeight_H, int nWidth, int nWidth_H, int layer, float fRadius)
  36. {
  37. short **spOriginData, **spTransData, **spWvltData;
  38. int iHeight = (int)nHeight /pow(2,layer-1), iWidth =(int)nWidth / pow(2,layer-1);
  39. int iHeight_H =(int) nHeight_H / pow(2,layer-1), iWidth_H = (int)nWidth_H/ pow(2,layer-1);
  40. //分配图像复原所需的内存空间
  41. spOriginData = spData;
  42. spTransData = spTransData0;
  43. spWvltData = spTransData1;
  44. //完成图像小波变换的逆变换
  45. CWvltTrans *WTrans;
  46. for(int i = layer; i >= 1; i--)
  47. {
  48. WTrans->DWTi_Once(spOriginData, spTransData, spWvltData, iHeight, iHeight_H, iWidth, iWidth_H, i, 1.414);
  49. iHeight <<= 1; iWidth <<= 1;
  50. iHeight_H <<= 1; iWidth_H <<= 1;
  51. }
  52. }
  53. /********************************************************************************
  54. *函数描述: DIP_ImageFusion完成两幅图像的融合,恢复出原始的图像 *
  55. *函数参数: short **spImgData0 :二维指针,存放其中一幅原始图像的数据 *
  56. * short **spImgData1 :二维指针,存放其中另外一幅原始图像的数据 *
  57. * int   nHeight :图像属性参数,数值为原始图像的高度值 *
  58. * int   nWidth :图像属性参数,数值为原始图像的宽度值 *
  59. ********************************************************************************/
  60. void CDiproc::DIP_ImageFusion(short **spImgData0, short **spImgData1, int nHeight, int nWidth)
  61. {
  62. //获取图像的属性参数
  63. int iHeight = nHeight, iWidth = nWidth;
  64. //图像融合所用到的数据空间及数据指针
  65. short **spOriginData, **spTransData, **spWvltData0, **spWvltData1;
  66. //分配数据空间
  67. spTransData = new short *[iHeight];
  68. spWvltData0 = new short *[iHeight];
  69. spWvltData1 = new short *[iHeight];
  70. for(int i = 0; i < iWidth; i ++)
  71. {
  72. spTransData[i] = new short [iWidth];
  73. spWvltData0[i] = new short [iWidth];
  74. spWvltData1[i] = new short [iWidth];
  75. }
  76. //创建小波变换类,完成图像的小波变换
  77. CWvltTrans *pTrans;
  78. //获得图像数据空间的指针,完成小波变换
  79. spOriginData = spImgData0;
  80. //三层小波变换
  81. pTrans->DWT_TriLayers(spOriginData, spTransData, spWvltData0, iHeight, iHeight / 2, iWidth, iWidth / 2, 1, 1.414);
  82. //获得图像数据空间的指针,完成另一幅图像的小波变换
  83. spOriginData = spImgData1;
  84. //三层小波变换
  85. pTrans->DWT_TriLayers(spOriginData, spTransData, spWvltData1, iHeight,iHeight / 2, iWidth, iWidth / 2, 1, 1.414);
  86. //小波系数的融合处理:频带有LL3,LH3,HL3,HH3,LH2,HL2,HH2,LH1,HL1,HH1
  87. //融合处理将分频带进行,处理方法采用的是3*3的窗口
  88. //LL3频带小波系数的融合
  89. Window_WvltFusion(spWvltData0, spWvltData1, 0, 0, iHeight / 8, iWidth / 8);
  90. //HL3频带小波系数的融合
  91. Window_WvltFusion(spWvltData0, spWvltData1, 0, iWidth / 8, iHeight / 8, iWidth / 4);
  92. //LH3频带小波系数的融合
  93. Window_WvltFusion(spWvltData0, spWvltData1, iHeight / 8, 0, iHeight / 4, iWidth / 8);
  94. //HH3频带小波系数的融合
  95. Window_WvltFusion(spWvltData0, spWvltData1, iHeight / 8, iWidth / 8, iHeight / 4, iWidth / 4);
  96. //HL2频带小波系数的融合
  97. Window_WvltFusion(spWvltData0, spWvltData1, 0, iWidth / 4, iHeight / 4, iWidth / 2);
  98. //LH2频带小波系数的融合
  99. Window_WvltFusion(spWvltData0, spWvltData1, iHeight / 4, 0, iHeight / 2, iWidth / 4);
  100. //HH2频带小波系数的融合
  101. Window_WvltFusion(spWvltData0, spWvltData1, iHeight / 4, iWidth / 4, iHeight / 2, iWidth / 2);
  102. //HL1频带小波系数的融合
  103. Window_WvltFusion(spWvltData0, spWvltData1, 0, iWidth / 2, iHeight / 2, iWidth);
  104. //LH1频带小波系数的融合
  105. Window_WvltFusion(spWvltData0, spWvltData1, iHeight / 2, 0, iHeight, iWidth / 2);
  106. //HH1频带小波系数的融合
  107. Window_WvltFusion(spWvltData0, spWvltData1, iHeight / 2, iWidth / 2, iHeight, iWidth);
  108. //将融合后的小波系数复原,完成图像的融合
  109. DIP_WvltRevers(spOriginData, spTransData, spWvltData0, iHeight, iHeight / 2, iWidth, iWidth / 2, 1, 1.414);
  110. //释放临时的数据空间
  111. delete spTransData;
  112. delete spWvltData0;
  113. delete spWvltData1;
  114. }
  115. /********************************************************************************
  116. *函数描述: Wvlt_Normalize完成图像小波数据与逆变换数据的正则化处理 *
  117. *函数参数: short **spWvltNormData:二维指针,存放正则化后的小波系数 *
  118. * int   nHeight :图像属性参数,数值为原始图像的高度值 *
  119. * int   nHeight_H :图像属性参数,数值为原始图像高度值的一半 *
  120. * int   nWidth :图像属性参数,数值为原始图像的宽度值 *
  121. * float *NormWvltRng :存放图像小波的正则化参数以及逆变换的正则化参数*
  122. ********************************************************************************/
  123. void CDiproc::Wvlt_Normalize(short **spWvltNormData, int nHeight, int nWidth, float *nWvltRng)
  124. {
  125. int MaxPixVal, MinPixVal, Diff;
  126. int x, y;
  127. float NormCoeff;
  128. MaxPixVal=spWvltNormData[0][0];
  129. MinPixVal=spWvltNormData[0][0];
  130. for( y=0; y < nHeight; y++)
  131. {
  132. for( x=0; x < nWidth; x++)
  133. {
  134. if(MaxPixVal<spWvltNormData[y][x])
  135. MaxPixVal=spWvltNormData[y][x];
  136. if(MinPixVal>spWvltNormData[y][x])
  137. MinPixVal=spWvltNormData[y][x];
  138. //spWvltData[y][x] = spWvltNormData[y][x];
  139. }
  140. }
  141. Diff=MaxPixVal-MinPixVal;
  142. nWvltRng[1] = MaxPixVal;
  143. nWvltRng[0] = MinPixVal;
  144. for(y=0; y < nHeight; y++)
  145. {
  146. for(x=0; x < nWidth; x++)
  147. {
  148. //因为小波变换后的小波系数有可能超过255甚至更多,那么就将
  149. //小波系数的范围映射到0~255区间内,以后出现类似的处理,目的都是一样的
  150. NormCoeff = spWvltNormData[y][x];
  151. NormCoeff -= MinPixVal;
  152. NormCoeff *= 255;
  153. NormCoeff /= (float) Diff;
  154. spWvltNormData[y][x] = NormCoeff;
  155. }
  156. }
  157. }
  158. /*********************************************************************************
  159. *函数描述: Window_WvltFusion完成图像小波系数的融合操作,得到各频带的小波融合数据*
  160. *函数参数: short **spWvltData0 :二维指针,存放其中一幅图像的原始小波系数  *
  161. * short **spWvltData1 :二维指针,存放其中另外一幅图像的原始小波系数  *
  162. * int   Scan_y :扫描线起始横坐标  *
  163. * int   Scan_x :扫描线起始纵坐标  *
  164. * int   End_y :扫描线终止横坐标  *
  165. * int   End_x :扫描线终止纵坐标  *
  166. *********************************************************************************/
  167. void CDiproc::Window_WvltFusion(short **spWvltData0, short **spWvltData1, int Scan_y, int Scan_x, int End_y, int End_x)
  168. {
  169. int y,x;
  170. short WndSum0, WndSum1;
  171. for(y = Scan_y; y < End_y; y ++)
  172. {
  173. for(x = Scan_x; x < End_x; x ++)
  174. {
  175. //初始化窗口中小波系数的和
  176. WndSum0 = 0; WndSum1 = 0;
  177. //计算窗口中小波系数的和
  178. for(int i = -1; i <= 1; i++)
  179. {
  180. for(int j = -1; j <= 1; j++)
  181. {
  182. if( (y+i) < Scan_y || (x+j) < Scan_x || (y+i) >= End_y || (x+j) >= End_x)
  183. {
  184. WndSum0 += 0;
  185. WndSum1 += 0;
  186. }
  187. else
  188. {
  189. WndSum0 += abs((int)spWvltData0[y + i][x + j]);
  190. WndSum1 += abs((int)spWvltData1[y + i][x + j]);
  191. }
  192. }
  193. }
  194. if(WndSum0 < WndSum1)
  195. spWvltData0[y][x] = spWvltData1[y][x];
  196. }
  197. }
  198. }
  199. float CDiproc::Search_BandMax(short **spWvltData, int Scan_y, int Scan_x, int End_y, int End_x)
  200. {
  201. int x, y;
  202. float Band_max;
  203. Band_max = 0;
  204. for(y = Scan_y; y < End_y; y ++)
  205. {
  206. for(x = Scan_x; x < End_x; x ++)
  207. {
  208. if(Band_max < spWvltData[y][x])
  209. Band_max = spWvltData[y][x];
  210. }
  211. }
  212. return Band_max;
  213. }
  214. void CDiproc::Band_Enhance(float **fpNormGradient, float FilterCoeff, int Scan_y, int Scan_x, int End_y, int End_x)
  215. {
  216. for(int y = Scan_y; y < End_y; y ++)
  217. for(int x = Scan_x; x < End_x; x ++)
  218. fpNormGradient[y][x] *= (float)(255.0 * FilterCoeff);
  219. }