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

波变换

开发平台:

Visual C++

  1. // WaveTranform.cpp: implementation of the CWaveTranform class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "小波变换.h"
  6. #include "WaveTranform.h"
  7. #include "DIBAPI.h"
  8. #include "Diproc.h"
  9. #include <math.h>
  10. #include <direct.h>
  11. #ifdef _DEBUG
  12. #undef THIS_FILE
  13. static char THIS_FILE[]=__FILE__;
  14. #define new DEBUG_NEW
  15. #endif
  16. //////////////////////////////////////////////////////////////////////
  17. // Construction/Destruction
  18. //////////////////////////////////////////////////////////////////////
  19. CWaveTranform::CWaveTranform()
  20. {
  21. m_GrayMax=255;
  22. m_GrayMin=0;
  23. for(int i=0;i<3;i++)
  24. {
  25. m_ColorMax[i]=255;//0蓝1绿2红
  26. m_ColorMin[i]=0;
  27. }
  28. m_preoffset=0;
  29. m_aftoffset=0;
  30. }
  31. CWaveTranform::~CWaveTranform()
  32. {
  33. }
  34. /*************************************************************************
  35.  *
  36.  * 函数名称:
  37.  *   Convolution()
  38.  *
  39.  * 参数:
  40.  *   double * LF HF - 指向小波的指针,是常量
  41.  *   FR                     - 小波窗的宽度 
  42.  *   double * f - 指向时域值的指针和返回的小波变换频域的指针
  43.  *   fr -原图象每一行的像素个数
  44.  *
  45.  * 返回值:
  46.  *   无。
  47.  *
  48.  * 说明:
  49.  *   该函数用来实现卷积运算。
  50.  *
  51.  ************************************************************************/
  52. void CWaveTranform::Convolution(double *LF,double *HF,int FR, double *f, int fr)
  53. {
  54. int i,j,m;// 循环变量
  55. double *X;
  56. X = new double[fr]; // 分配运算所需的数组
  57. // 卷积运算
  58. for(i=0;i<fr/2;i++)
  59. {
  60. X[i]=0;
  61. X[i+fr/2]=0;
  62. for(j=0;j<FR;j++)
  63. {
  64. m=(2*i+j+fr-m_preoffset)%fr;
  65. X[i]+=f[m]*LF[j];
  66. X[i+fr/2]+=f[m]*HF[j];
  67. }
  68. }
  69. //运算结果反传给f。
  70. for(i= 0; i <fr; i++)
  71. {
  72. f[i]=X[i];
  73. }
  74. delete X;// 释放内存
  75. }
  76. /*************************************************************************
  77.  *
  78.  * 函数名称:
  79.  *   DisConvolution()
  80.  *
  81.  * 参数:
  82.  *   double * F - 指向小波的指针,是常量
  83.  *   FR                     - 小波窗的宽度 
  84.  *   double * f - 指向时域值的指针和返回的小波变换频域的指针
  85.  *   fr -原图象每一行的像素个数
  86.  *
  87.  * 返回值:
  88.  *   无。
  89.  *
  90.  * 说明:
  91.  *   该函数用来实现解卷积运算。
  92.  *
  93.  ************************************************************************/
  94. void CWaveTranform::DisConvolution(double *LF,double *HF,int FR, double *f0,double *f1, int fr)
  95. {
  96. int i,j;// 循环变量
  97. double *X,*Y;
  98. // 分配运算所需的数组
  99. X = new double[fr];
  100. Y = new double[fr];
  101. // 解卷积运算
  102. for(i=0;i<fr;i++)
  103. {
  104. X[i]=0;
  105. Y[i]=0;
  106. for(j=0;j<FR;j++)
  107. {
  108. X[i]+=f0[(i+j)%fr]*LF[j];
  109. Y[i]+=f1[(i+j)%fr]*HF[j];
  110. }
  111. }
  112. //运算结果反传给f0。
  113. for(i= 0; i <fr; i++)
  114. {
  115. j=(i+fr-m_aftoffset)%fr;//循环移位
  116. f0[i]=X[j]+Y[j];
  117. }
  118. delete X,Y; // 释放内存
  119. }
  120. /*************************************************************************
  121.  *
  122.  * 函数名称:
  123.  *   DIBWavelet()
  124.  *
  125.  * 参数:
  126.  *   LPSTR lpDIB        - 指向DIB图像指针
  127.  *   LPSTR lpDIBBits    - 指向源DIB象素指针
  128.  *   double *LF         - 使用的小波尺度函数,是常量
  129.  *   double *HF         - 使用的小波母函数,是常量
  130.  *   int FWidth         - 小波窗的宽度
  131.  *   int nLevel         - 小波分解的层数  
  132.  *
  133.  * 返回值:
  134.  *   BOOL               - 成功返回TRUE,否则返回FALSE。
  135.  *
  136.  * 说明:
  137.  *   该函数用来对图像进行小波变换分解。于上面不同的是,此处是将二维
  138.  * 矩阵转换成一个列向量,然后对该列向量进行一次一维小波变换。
  139.  *
  140.  ************************************************************************/
  141. BOOL CWaveTranform::DIBWavelet(LPSTR lpDIB,LPSTR lpDIBBits,double* LF,double* HF,int FWidth,int nLevel)
  142. {
  143. unsigned char* lpSrc;// 指向源图像的指针
  144. double dTemp;// 中间变量
  145. LONG lLineBytes; // 图像每行的字节数
  146. LONG lWidth, lHeight;
  147. lWidth=::DIBWidth(lpDIB);
  148. lHeight=::DIBHeight(lpDIB);
  149. LONG i,j;//循环变量
  150. double *f = new double[lWidth*lHeight];// 分配内存
  151. if(::DIBNumColors(lpDIB)==256)
  152. {
  153. lLineBytes = WIDTHBYTES(lWidth * 8);// 计算图像每行的字节数
  154. // 从源图像中读取数据。
  155. for(i = 0; i < lHeight; i++)//每列
  156. {
  157. for(j = 0; j < lWidth; j++)// 每行
  158. {
  159. lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) +j; // 指向DIB第i行,第j个象素的指针
  160. f[i*lWidth+j] = *(lpSrc);// 给时域赋值
  161. }
  162. }
  163. int n;//层数循环变量
  164. //小波变换分解过程循环
  165. for(n=0;n<nLevel;n++)
  166. {
  167. LONG Height,Width;//第n层图象的高度和宽度
  168. Height=long(lHeight/pow(2,n));
  169. Width=long(lWidth/pow(2,n));
  170. double *LH=new double[Width];  //存放每一行元素
  171. for(i = 0; i < Height; i++)
  172. {
  173. for(j=0;j<Width;j++)
  174. {
  175. LH[j]=f[i*lWidth+j];
  176. }
  177. Convolution( LF,HF, FWidth,LH, Width);// 对x方向进行卷积运算
  178. for(j=0;j<Width;j++)
  179. {
  180. f[i*lWidth+j]=LH[j];
  181. }
  182. }
  183. delete LH;
  184. LH=new double[Height];  //存放每一列元素
  185. for(i = 0; i < Width; i++)
  186. {
  187. for(j=0;j<Height;j++)
  188. {
  189. LH[j]=f[i+j*lWidth];
  190. }
  191. Convolution( LF,HF, FWidth,LH, Height);// 对y方向进行卷积运算
  192. for(j=0;j<Height;j++)
  193. {
  194. f[i+j*lWidth]=LH[j];
  195. }
  196. }
  197. delete LH;//释放内存
  198. }
  199. //将分解后的值规划处理
  200. m_GrayMax=0;
  201. m_GrayMin=255;
  202. for(i=0;i<lHeight;i++)
  203. {
  204. for(j=0;j<lWidth;j++)
  205. {
  206. m_GrayMax=m_GrayMax>f[i * lWidth + j]?m_GrayMax:f[i * lWidth + j];
  207. m_GrayMin=m_GrayMin<f[i * lWidth + j]?m_GrayMin:f[i * lWidth + j];
  208. }
  209. }
  210. // 更新源图像
  211. for(i = 0; i < lHeight; i++)// 每列
  212. {
  213. for(j = 0; j < lWidth; j++)// 每行
  214. {
  215. dTemp = f[i * lWidth + j]; // 计算频谱
  216. dTemp=255/(m_GrayMax-m_GrayMin)*(dTemp-m_GrayMin);
  217. lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;// 指向DIB第i行,第j个象素的指针
  218. * (lpSrc) = (BYTE)(dTemp);// 更新源图像
  219. }
  220. }
  221. }
  222. //处理真彩色
  223. else
  224. {
  225. int ncolor;//颜色值循环
  226. for(ncolor=0;ncolor<3;ncolor++)
  227. {
  228. lLineBytes = WIDTHBYTES(lWidth * 24);// 计算图像每行的字节数
  229. // 从源图像中读取数据。
  230. for(i = 0; i < lHeight; i++)//每列
  231. {
  232. for(j = 0; j < lWidth; j++)// 每行
  233. {
  234. lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) +3*j+ncolor; // 指向DIB第i行,第j个象素的指针
  235. f[i*lWidth+j] = *(lpSrc);// 给时域赋值
  236. }
  237. }
  238. int n;//层数循环变量
  239. //小波变换分解过程循环
  240. for(n=0;n<nLevel;n++)
  241. {
  242. LONG Height,Width;//第n层图象的高度和宽度
  243. Height=long(lHeight/pow(2,n));
  244. Width=long(lWidth/pow(2,n));
  245. double *LH=new double[Width];  //存放每一行元素
  246. for(i = 0; i < Height; i++)
  247. {
  248. for(j=0;j<Width;j++)
  249. {
  250. LH[j]=f[i*lWidth+j];
  251. }
  252. Convolution( LF,HF, FWidth,LH, Width);// 对x方向进行卷积运算
  253. for(j=0;j<Width;j++)
  254. {
  255. f[i*lWidth+j]=LH[j];
  256. }
  257. }
  258. delete LH;
  259. LH=new double[Height];  //存放每一列元素
  260. for(i = 0; i < Width; i++)
  261. {
  262. for(j=0;j<Height;j++)
  263. {
  264. LH[j]=f[i+j*lWidth];
  265. }
  266. Convolution( LF,HF, FWidth,LH, Height);// 对y方向进行卷积运算
  267. for(j=0;j<Height;j++)
  268. {
  269. f[i+j*lWidth]=LH[j];
  270. }
  271. }
  272. delete LH;//释放内存
  273. }
  274. //将分解后的值规划处理
  275. m_ColorMax[ncolor]=0;
  276. m_ColorMin[ncolor]=255;
  277. for(i=0;i<lHeight;i++)
  278. {
  279. for(j=0;j<lWidth;j++)
  280. {
  281. m_ColorMax[ncolor]=m_ColorMax[ncolor]>f[i * lWidth + j]?m_ColorMax[ncolor]:f[i * lWidth + j];
  282. m_ColorMin[ncolor]=m_ColorMin[ncolor]<f[i * lWidth + j]?m_ColorMin[ncolor]:f[i * lWidth + j];
  283. }
  284. }
  285. // 更新源图像
  286. for(i = 0; i < lHeight; i++)// 每列
  287. {
  288. for(j = 0; j < lWidth; j++)// 每行
  289. {
  290. dTemp = f[i * lWidth + j]; // 计算频谱
  291. dTemp=255/(m_ColorMax[ncolor]-m_ColorMin[ncolor])*(dTemp-m_ColorMin[ncolor]);
  292. lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + 3*j+ncolor;// 指向DIB第i行,第j个象素的指针
  293. * (lpSrc) = (BYTE)(dTemp);// 更新源图像
  294. }
  295. }
  296. }
  297. }
  298. delete f;//释放内存
  299. return TRUE;// 返回
  300. }
  301. /*************************************************************************
  302.  *
  303.  * 函数名称:
  304.  *   DIBDisWavelet()
  305.  *
  306.  * 参数:
  307.  *   LPSTR lpDIB        - 指向DIB图像指针
  308.  *   LPSTR lpDIBBits    - 指向源DIB象素指针
  309.  *   double *LF         - 使用的小波尺度函数,是常量
  310.  *   double *HF         - 使用的小波母函数,是常量
  311.  *   int FWidth         - 小波窗的宽度
  312.  *   int nLevel         - 小波分解的层数  
  313.  *
  314.  * 返回值:
  315.  *   BOOL               - 成功返回TRUE,否则返回FALSE。
  316.  *
  317.  * 说明:
  318.  *   该函数用来对图像进行小波变换重建。于上面不同的是,此处是将二维
  319.  * 矩阵转换成一个列向量,然后对该列向量进行一次一维小波变换。
  320.  *
  321.  ************************************************************************/
  322. BOOL CWaveTranform::DIBDisWavelet(LPSTR lpDIB,LPSTR lpDIBBits,double* LF,double* HF,int FWidth,int nLevel)
  323. {
  324. unsigned char* lpSrc;// 指向源图像的指针
  325. double dTemp;// 中间变量
  326. LONG lLineBytes; // 图像每行的字节数
  327. LONG lWidth,lHeight;
  328. lWidth=::DIBWidth(lpDIB);
  329. lHeight=::DIBHeight(lpDIB);
  330. LONG i,j;//循环变量
  331. double *f = new double[lWidth*lHeight];// 分配内存
  332. if(::DIBNumColors(lpDIB)==256)
  333. {
  334. lLineBytes = WIDTHBYTES(lWidth * 8);// 计算图像每行的字节数
  335. // 从源图像中读取数据。
  336. for(i = 0; i < lHeight; i++)// 每列
  337. {
  338. for(j = 0; j < lWidth; j++)// 每行
  339. {
  340. lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) +j; // 指向DIB第i行,第j个象素的指针
  341. f[i*lWidth+j] = *(lpSrc);// 给时域赋值
  342. //将规划处理后的值变回原样
  343. f[i*lWidth+j]=(m_GrayMax-m_GrayMin)/255*f[i*lWidth+j]+m_GrayMin;
  344. }
  345. }
  346. int n;//层数循环变量
  347. //小波变换重建过程循环
  348. for(n=nLevel-1;n>=0;n--)
  349. {
  350. LONG Height,Width;
  351. Height=long(lHeight/pow(2,n));
  352. Width=long(lWidth/pow(2,n));
  353. double *H00=new double[Height];  //按列存放低低元素
  354. double *H01=new double[Height];  //按列存放低高元素
  355. double *H10=new double[Height];  //按列存放高低元素
  356. double *H11=new double[Height];  //按列存放高高元素
  357. for(i = 0; i < Width/2; i++)
  358. {
  359. for(j=0;j<Height/2;j++)
  360. {
  361. H00[2*j]=f[i+j*lWidth];
  362. H00[2*j+1]=0;
  363. }
  364. for(j=Height/2;j<Height;j++)
  365. {
  366. H01[2*j-Height]=f[i+j*lWidth];
  367. H01[2*j-Height+1]=0;
  368. }
  369. DisConvolution( LF,HF, FWidth,H00,H01 ,Height);// 对y方向进行解内积运算
  370. for(j=0;j<Height;j++)
  371. {
  372. f[i+j*lWidth]=H00[j];
  373. }
  374. }
  375. for(i =Width/2 ; i < Width; i++)
  376. {
  377. for(j=0;j<Height/2;j++)
  378. {
  379. H10[2*j]=f[i+j*lWidth];
  380. H10[2*j+1]=0;
  381. }
  382. for(j=Height/2;j<Height;j++)
  383. {
  384. H11[2*j-Height]=f[i+j*lWidth];
  385. H11[2*j-Height+1]=0;
  386. }
  387. DisConvolution( LF,HF, FWidth,H10,H11, Height); // 对y方向进行解内积运算
  388. for(j=0;j<Height;j++)
  389. {
  390. f[i+j*lWidth]=H10[j];
  391. }
  392. }
  393. delete H00,H01,H10,H11;//释放内存
  394. double *H0=new double[Width];  //按行存放低元素
  395. double *H1=new double[Width];  //按行存放高元素
  396. for(i = 0; i < Height; i++)
  397. {
  398. for(j=0;j<Width/2;j++)
  399. {
  400. H0[2*j]=f[i*lWidth+j];
  401. H0[2*j+1]=0;
  402. }
  403. for(j=Width/2;j<Width;j++)
  404. {
  405. H1[2*j-Width]=f[i*lWidth+j];
  406. H1[2*j-Width+1]=0;
  407. }
  408. DisConvolution( LF,HF, FWidth,H0,H1, Width);// 对x方向进行解卷积运算
  409. for(j=0;j<Width;j++)
  410. {
  411. f[i*lWidth+j]=H0[j];
  412. }
  413. }
  414. delete H0,H1;
  415. }
  416. // 更新源图像
  417. for(i = 0; i < lHeight; i++)// 每列
  418. {
  419. for(j = 0; j < lWidth; j++)// 每行
  420. {
  421. dTemp = f[i * lWidth + j]; // 计算频谱
  422. if (dTemp > 255)
  423. dTemp = 255;
  424. if(dTemp < 0)
  425. dTemp=0;
  426. lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;// 指向DIB第i行,第j个象素的指针
  427. * (lpSrc) = (BYTE)(dTemp);// 更新源图像
  428. }
  429. }
  430. }
  431. else
  432. {
  433. int ncolor;
  434. for(ncolor=0;ncolor<3;ncolor++)
  435. {
  436. lLineBytes = WIDTHBYTES(lWidth * 24);// 计算图像每行的字节数
  437. // 从源图像中读取数据。
  438. for(i = 0; i < lHeight; i++)// 每列
  439. {
  440. for(j = 0; j < lWidth; j++)// 每行
  441. {
  442. lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) +3*j+ncolor; // 指向DIB第i行,第j个象素的指针
  443. f[i*lWidth+j] = *(lpSrc);// 给时域赋值
  444. //将规划处理后的值变回原样
  445. f[i*lWidth+j]=(m_ColorMax[ncolor]-m_ColorMin[ncolor])/255*f[i*lWidth+j]+m_ColorMin[ncolor];
  446. }
  447. }
  448. int n;//层数循环变量
  449. //小波变换重建过程循环
  450. for(n=nLevel-1;n>=0;n--)
  451. {
  452. LONG Height,Width;
  453. Height=long(lHeight/pow(2,n));
  454. Width=long(lWidth/pow(2,n));
  455. double *H00=new double[Height];  //按列存放低低元素
  456. double *H01=new double[Height];  //按列存放低高元素
  457. double *H10=new double[Height];  //按列存放高低元素
  458. double *H11=new double[Height];  //按列存放高高元素
  459. for(i = 0; i < Width/2; i++)
  460. {
  461. for(j=0;j<Height/2;j++)
  462. {
  463. H00[2*j]=f[i+j*lWidth];
  464. H00[2*j+1]=0;
  465. }
  466. for(j=Height/2;j<Height;j++)
  467. {
  468. H01[2*j-Height]=f[i+j*lWidth];
  469. H01[2*j-Height+1]=0;
  470. }
  471. DisConvolution( LF,HF, FWidth,H00,H01 ,Height);// 对y方向进行解内积运算
  472. for(j=0;j<Height;j++)
  473. {
  474. f[i+j*lWidth]=H00[j];
  475. }
  476. }
  477. for(i =Width/2 ; i < Width; i++)
  478. {
  479. for(j=0;j<Height/2;j++)
  480. {
  481. H10[2*j]=f[i+j*lWidth];
  482. H10[2*j+1]=0;
  483. }
  484. for(j=Height/2;j<Height;j++)
  485. {
  486. H11[2*j-Height]=f[i+j*lWidth];
  487. H11[2*j-Height+1]=0;
  488. }
  489. DisConvolution( LF,HF, FWidth,H10,H11, Height); // 对y方向进行解内积运算
  490. for(j=0;j<Height;j++)
  491. {
  492. f[i+j*lWidth]=H10[j];
  493. }
  494. }
  495. delete H00,H01,H10,H11;//释放内存
  496. double *H0=new double[Width];  //按行存放低元素
  497. double *H1=new double[Width];  //按行存放高元素
  498. for(i = 0; i < Height; i++)
  499. {
  500. for(j=0;j<Width/2;j++)
  501. {
  502. H0[2*j]=f[i*lWidth+j];
  503. H0[2*j+1]=0;
  504. }
  505. for(j=Width/2;j<Width;j++)
  506. {
  507. H1[2*j-Width]=f[i*lWidth+j];
  508. H1[2*j-Width+1]=0;
  509. }
  510. DisConvolution( LF,HF, FWidth,H0,H1, Width);// 对x方向进行解卷积运算
  511. for(j=0;j<Width;j++)
  512. {
  513. f[i*lWidth+j]=H0[j];
  514. }
  515. }
  516. delete H0,H1;
  517. }
  518. // 更新源图像
  519. for(i = 0; i < lHeight; i++)// 每列
  520. {
  521. for(j = 0; j < lWidth; j++)// 每行
  522. {
  523. dTemp = f[i * lWidth + j]; // 计算频谱
  524. if (dTemp > 255)
  525. dTemp = 255;
  526. if(dTemp < 0)
  527. dTemp=0;
  528. lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + 3*j+ncolor;// 指向DIB第i行,第j个象素的指针
  529. * (lpSrc) = (BYTE)(dTemp);// 更新源图像
  530. }
  531. }
  532. }
  533. }
  534. delete f;//释放内存
  535. return TRUE;// 返回
  536. }
  537. void CWaveTranform::DIP_ImageFusion2(LPSTR lpDIB1,LPSTR lpDIBBits1,LPSTR lpDIB2,LPSTR lpDIBBits2,int nlever)
  538. {
  539.     unsigned char* lpSrc;// 指向源图像的指针
  540. double dTemp;// 中间变量
  541. LONG lLineBytes; // 图像每行的字节数
  542. LONG lWidth,lHeight;
  543. lWidth=::DIBWidth(lpDIB1);
  544. lHeight=::DIBHeight(lpDIB1);
  545. LONG i,j;//循环变量
  546. double *f1 = new double[lWidth*lHeight];// 分配内存
  547. double *f2 = new double[lWidth*lHeight];
  548. int N=lWidth*lHeight;
  549. int x,y;
  550. int dd=(int)pow(2,nlever);
  551. int nw=lWidth/dd;
  552. int nh=lHeight/dd;
  553. int p1,p2;
  554. if((::DIBNumColors(lpDIB1)==256)&&(::DIBNumColors(lpDIB2)==256))
  555. {
  556. lLineBytes = WIDTHBYTES(lWidth * 8);// 计算图像每行的字节数
  557. // 从源图像1中读取数据。
  558. for(i = 0; i < lHeight; i++)// 每列
  559. {
  560. for(j = 0; j < lWidth; j++)// 每行
  561. {
  562. lpSrc = (unsigned char*)lpDIBBits1 + lLineBytes * (lHeight - 1 - i) +j; // 指向DIB第i行,第j个象素的指针
  563. f1[i*lWidth+j] = *(lpSrc);// 给时域赋值
  564. //将规划处理后的值变回原样
  565. f1[i*lWidth+j]=(m_GrayMax-m_GrayMin)/255*f1[i*lWidth+j]+m_GrayMin;
  566. }
  567. }
  568.    // 从源图像1中读取数据。
  569. for(i = 0; i < lHeight; i++)// 每列
  570. {
  571. for(j = 0; j < lWidth; j++)// 每行
  572. {
  573. lpSrc = (unsigned char*)lpDIBBits2 + lLineBytes * (lHeight - 1 - i) +j; // 指向DIB第i行,第j个象素的指针
  574. f2[i*lWidth+j] = *(lpSrc);// 给时域赋值
  575. //将规划处理后的值变回原样
  576. f2[i*lWidth+j]=(m_GrayMax-m_GrayMin)/255*f2[i*lWidth+j]+m_GrayMin;
  577. }
  578. }
  579.         for(i=0;i<N;i++)
  580. {
  581. p1=f1[i];
  582. p2=f2[i];
  583.             x=i%lWidth;
  584. y=i/lWidth;
  585. if((x<nw)&&(y<nh))
  586. {
  587. f1[i]=(p1+p2)/2;
  588. }
  589. else
  590. {
  591. f1[i]=(abs(p1)>abs(p2))?p1:p2;
  592. }
  593. }
  594. //更新图像源
  595. for(i = 0; i < lHeight; i++)// 每列
  596. {
  597. for(j = 0; j < lWidth; j++)// 每行
  598. {
  599. dTemp = f1[i * lWidth + j]; // 计算频谱
  600. dTemp=255/(m_GrayMax-m_GrayMin)*(dTemp-m_GrayMin);
  601. lpSrc = (unsigned char*)lpDIBBits1 + lLineBytes * (lHeight - 1 - i) + j;// 指向DIB第i行,第j个象素的指针
  602. * (lpSrc) = (BYTE)(dTemp);// 更新源图像
  603. }
  604. }
  605. }
  606. else 
  607. {
  608. int ncolor;
  609. for(ncolor=0;ncolor<3;ncolor++)
  610. {
  611. lLineBytes = WIDTHBYTES(lWidth * 24);// 计算图像每行的字节数
  612. // 从源图像中读取数据。
  613. for(i = 0; i < lHeight; i++)// 每列
  614. {
  615. for(j = 0; j < lWidth; j++)// 每行
  616. {
  617. lpSrc = (unsigned char*)lpDIBBits1 + lLineBytes * (lHeight - 1 - i) +3*j+ncolor; // 指向DIB第i行,第j个象素的指针
  618. f1[i*lWidth+j] = *(lpSrc);// 给时域赋值
  619. //将规划处理后的值变回原样
  620. f1[i*lWidth+j]=(m_ColorMax[ncolor]-m_ColorMin[ncolor])/255*f1[i*lWidth+j]+m_ColorMin[ncolor];
  621. }
  622. }
  623. // 从源图像中读取数据。
  624. for(i = 0; i < lHeight; i++)// 每列
  625. {
  626. for(j = 0; j < lWidth; j++)// 每行
  627. {
  628. lpSrc = (unsigned char*)lpDIBBits2 + lLineBytes * (lHeight - 1 - i) +3*j+ncolor; // 指向DIB第i行,第j个象素的指针
  629. f2[i*lWidth+j] = *(lpSrc);// 给时域赋值
  630. //将规划处理后的值变回原样
  631. f2[i*lWidth+j]=(m_ColorMax[ncolor]-m_ColorMin[ncolor])/255*f2[i*lWidth+j]+m_ColorMin[ncolor];
  632. }
  633. }
  634. for(i=0;i<N;i++)
  635. {
  636. p1=f1[i];
  637. p2=f2[i];
  638.             x=i%lWidth;
  639. y=i/lWidth;
  640. if((x<nw)&&(y<nh))
  641. {
  642. f1[i]=(p1+p2)/2;
  643. }
  644. else
  645. {
  646. f1[i]=(abs(p1)>abs(p2))?p1:p2;
  647. }
  648. }
  649. for(i = 0; i < lHeight; i++)// 每列
  650. {
  651. for(j = 0; j < lWidth; j++)// 每行
  652. {
  653. dTemp = f1[i * lWidth + j]; // 计算频谱
  654. dTemp=255/(m_ColorMax[ncolor]-m_ColorMin[ncolor])*(dTemp-m_ColorMin[ncolor]);
  655. lpSrc = (unsigned char*)lpDIBBits1 + lLineBytes * (lHeight - 1 - i) + 3*j+ncolor;// 指向DIB第i行,第j个象素的指针
  656. * (lpSrc) = (BYTE)(dTemp);// 更新源图像
  657. }
  658. }
  659. }
  660. delete f1;//释放内存
  661. delete f2;//释放内存
  662. }
  663. }