WvltTransDib2.cpp
Upload User: szkelitina
Upload Date: 2022-05-21
Package Size: 6797k
Code Size: 20k
Category:

Special Effects

Development Platform:

Visual C++

  1. // WvltTrans.cpp: implementation of the CWvltTrans class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "windowsx.h"
  6. #include "math.h"
  7. #include "MainFrm.h"
  8. #include "DynSplitView2.h"
  9. //#include "wavelets.h"
  10. //#include "DIP_System.h"
  11. #include "WvltTransDib.h"
  12. #ifdef _DEBUG
  13. #undef THIS_FILE
  14. static char THIS_FILE[]=__FILE__;
  15. #define new DEBUG_NEW
  16. #endif
  17. //////////////////////////////////////////////////////////////////////
  18. // Construction/Destruction
  19. //////////////////////////////////////////////////////////////////////
  20. CWvltTransDib::CWvltTransDib()
  21. {
  22. layer1=FALSE;
  23. layer2=FALSE;
  24. layer3=FALSE;
  25. }
  26. CWvltTransDib::~CWvltTransDib()
  27. {
  28. }
  29. void CWvltTransDib::Hangbianhuan()
  30. {
  31. int i,j;
  32. LONG width,height;
  33. BYTE r, g, b;
  34. LPBYTE temp1, temp2;
  35. float tpBuffer;
  36. short maxVal,minVal,difVal;
  37. width=this->GetWidth();
  38. height=this->GetHeight();
  39. int nWidth=width/2;
  40. LONG lLineBytes = (width*3+3)/4 *4;
  41. //分配临时数据空间
  42. temp1 = new BYTE[height*width];
  43. temp2 = new BYTE[height*width];
  44. //从设备缓存中获得原始图像数据
  45. for(j=0; j<(int)height; j++)
  46. {
  47. for( i=0; i<(int)width; i++)
  48. {
  49. b=m_pData[j*lLineBytes+3*i];
  50. g=m_pData[j*lLineBytes+3*i+1];
  51. r=m_pData[j*lLineBytes+3*i+2];
  52. temp1[(height-1-j)*width+i]=(BYTE)(0.3*r+0.59*g+0.11*b);  
  53. }
  54. }
  55.     for(j = 0; j < height; j ++)            
  56. {
  57. for(i = 0; i < nWidth; i ++)           
  58. {
  59. int w = i *2;
  60. temp2[j*width+i] = temp1[j*width+w]; //偶
  61. temp2[j*width+nWidth+i] = temp1[j*width+w+1]; //奇
  62. }
  63. }
  64. //通过图像的差分,完成小波变换
  65. for(j=0; j<height; j++)
  66. {
  67. for(i=0; i<nWidth-1; i++)
  68. {
  69. temp2[j*width+nWidth+i] = temp2[j*width+nWidth+i] -temp2[j*width+i]+128;
  70. }
  71. }
  72. maxVal=temp2[0*width+0];
  73. minVal=temp2[0*width+0];
  74. //得到图像小波系数的极大值与极小值
  75. for( j=0; j<(int)height; j++)
  76. {
  77. for( i=0; i<(int)width; i++)
  78. {
  79. if(maxVal<temp2[j*width+i])
  80. maxVal=temp2[j*width+i];
  81. if(minVal>temp2[j*width+i])
  82. minVal=temp2[j*width+i];
  83. }
  84. }
  85. //计算获取图像小波系数的极值差
  86. difVal=maxVal-minVal;
  87. //小波经过处理后,放入显示缓存中
  88.     for(j=0; j<(int)height; j++)
  89. {
  90. for(i=0; i<(int)width; i++)
  91. {
  92. //因为小波变换后的小波系数有可能超过255甚至更多,那么就将
  93. //小波系数的范围映射到0~255区间内,以后出现类似的处理,目的都是一样的
  94. tpBuffer=temp2[(height-1-j)*width+i];
  95. tpBuffer-=minVal;
  96. tpBuffer*=255;
  97. tpBuffer/=difVal;
  98. m_pData[j*lLineBytes+3*i]  = (BYTE)tpBuffer;
  99. m_pData[j*lLineBytes+3*i+1]= (BYTE)tpBuffer;
  100. m_pData[j*lLineBytes+3*i+2]= (BYTE)tpBuffer;
  101. }
  102. }
  103. //删除临时的数据空间
  104. delete temp1;
  105. delete temp2;
  106. }
  107. void CWvltTransDib::Liebianhuan()
  108. {
  109. int i,j;
  110. LONG width,height;
  111. BYTE r, g, b;
  112. LPBYTE temp1, temp2;
  113. float tpBuffer;
  114. short maxVal,minVal,difVal;
  115. width=this->GetWidth();
  116. height=this->GetHeight();
  117. int nHeight=height/2;
  118. LONG lLineBytes = (width*3+3)/4 *4;
  119. //分配临时数据空间
  120. temp1 = new BYTE[height*width];
  121. temp2 = new BYTE[height*width];
  122. //从设备缓存中获得原始图像数据
  123. for(j=0; j<(int)height; j++)
  124. {
  125. for( i=0; i<(int)width; i++)
  126. {
  127. b=m_pData[j*lLineBytes+3*i];
  128. g=m_pData[j*lLineBytes+3*i+1];
  129. r=m_pData[j*lLineBytes+3*i+2];
  130. temp1[(height-1-j)*width+i]=(BYTE)(0.3*r+0.59*g+0.11*b);  
  131. }
  132. }
  133. for(i = 0; i < width; i ++)            
  134. {
  135. for(j = 0; j < nHeight; j ++)           
  136. {
  137. int h = j *2 ;
  138. temp2[j*width+i] = temp1[h*width+i]; //even
  139. temp2[(nHeight + j)*width+i] = temp1[(h+1)*width+i]; //odd
  140. }
  141. }
  142. //通过图像的差分,完成小波变换
  143. for(i=0; i<width; i++)
  144. {
  145. for(j=0; j<nHeight-1; j++)
  146. {
  147. temp2[(nHeight + j)*width+i] -= temp2[j*width+i]+128;
  148. }
  149. }
  150. maxVal=temp2[0*width+0];
  151. minVal=temp2[0*width+0];
  152. //得到图像小波系数的极大值与极小值
  153. for( j=0; j<(int)height; j++)
  154. {
  155. for( i=0; i<(int)width; i++)
  156. {
  157. if(maxVal<temp2[j*width+i])
  158. maxVal=temp2[j*width+i];
  159. if(minVal>temp2[j*width+i])
  160. minVal=temp2[j*width+i];
  161. }
  162. }
  163. //计算获取图像小波系数的极值差
  164. difVal=maxVal-minVal;
  165. //小波经过处理后,放入显示缓存中
  166.     for(j=0; j<(int)height; j++)
  167. {
  168. for(i=0; i<(int)width; i++)
  169. {
  170. //因为小波变换后的小波系数有可能超过255甚至更多,那么就将
  171. //小波系数的范围映射到0~255区间内,以后出现类似的处理,目的都是一样的
  172. tpBuffer=temp2[(height-1-j)*width+i];
  173. tpBuffer-=minVal;
  174. tpBuffer*=255;
  175. tpBuffer/=difVal;
  176. m_pData[j*lLineBytes+3*i]  = (BYTE)tpBuffer;
  177. m_pData[j*lLineBytes+3*i+1]= (BYTE)tpBuffer;
  178. m_pData[j*lLineBytes+3*i+2]= (BYTE)tpBuffer;
  179. }
  180. }
  181. //删除临时的数据空间
  182. delete temp1;
  183. delete temp2;
  184. }
  185. void CWvltTransDib::Once()
  186. {
  187. // Hangbianhuan();
  188. // Liebianhuan();
  189. int i,j;
  190. LONG width,height,nWidth,nHeight;
  191. BYTE r, g, b;
  192. LPBYTE temp1, temp2,temp3;
  193. float tpBuffer;
  194. short maxVal,minVal,difVal;
  195. width=this->GetWidth();
  196. height=this->GetHeight();
  197. nWidth=width/2;
  198. nHeight=height/2;
  199. LONG lLineBytes = (width*3+3)/4 *4;
  200. //分配临时数据空间
  201. temp1 = new BYTE[height*width];
  202. temp2 = new BYTE[height*width];
  203. temp3 = new BYTE[height*width];
  204. //从设备缓存中获得原始图像数据
  205. for(j=0; j<(int)height; j++)
  206. {
  207. for( i=0; i<(int)width; i++)
  208. {
  209. b=m_pData[j*lLineBytes+3*i];
  210. g=m_pData[j*lLineBytes+3*i+1];
  211. r=m_pData[j*lLineBytes+3*i+2];
  212. temp1[(height-1-j)*width+i]=(BYTE)(0.3*r+0.59*g+0.11*b);  
  213. }
  214. }
  215.     for(j = 0; j < height; j ++)            
  216. {
  217. for(i = 0; i < nWidth; i ++)           
  218. {
  219. int w = i *2;
  220. temp2[j*width+i] = temp1[j*width+w]; //偶
  221. temp2[j*width+nWidth+i] = temp1[j*width+w+1]; //奇
  222. }
  223. }
  224. //通过图像的差分,完成小波变换
  225. for(j=0; j<height; j++)
  226. {
  227. for(i=0; i<nWidth-1; i++)
  228. {
  229. temp2[j*width+nWidth+i] -= temp2[j*width+i]+128;
  230. }
  231. }
  232. for(i=0;i<nWidth;i++)
  233. {
  234. for(j=0;j<nHeight;j++)
  235. {
  236. int h=j*2;
  237. temp3[j*width+i]=temp2[h*width+i];//左上
  238. temp3[(j+nHeight)*width+i]=temp2[(h+1)*width+i];//左下
  239. temp3[j*width+nWidth+i]=temp2[h*width+nWidth+i];//右上
  240. temp3[(j+nWidth)*width+nWidth+i]=temp2[(h+1)*width+nWidth+i];//右下
  241. }
  242. for(j=0;j<nHeight;j++)
  243. {
  244. temp3[(j+nHeight)*width+i]-= temp3[j*width+i]+128;
  245. temp3[(j+nHeight)*width+nWidth+i]-= temp3[j*width+nWidth+i]+128;
  246. }
  247. }
  248. maxVal=temp3[0*width+0];
  249. minVal=temp3[0*width+0];
  250. //得到图像小波系数的极大值与极小值
  251. for( j=0; j<(int)height; j++)
  252. {
  253. for( i=0; i<(int)width; i++)
  254. {
  255. if(maxVal<temp3[j*width+i])
  256. maxVal=temp3[j*width+i];
  257. if(minVal>temp3[j*width+i])
  258. minVal=temp3[j*width+i];
  259. }
  260. }
  261. //计算获取图像小波系数的极值差
  262. difVal=maxVal-minVal;
  263. //小波经过处理后,放入显示缓存中
  264.     for(j=0; j<(int)height; j++)
  265. {
  266. for(i=0; i<(int)width; i++)
  267. {
  268. //因为小波变换后的小波系数有可能超过255甚至更多,那么就将
  269. //小波系数的范围映射到0~255区间内,以后出现类似的处理,目的都是一样的
  270. tpBuffer=temp3[(height-1-j)*width+i];
  271. tpBuffer-=minVal;
  272. tpBuffer*=255;
  273. tpBuffer/=difVal;
  274. m_pData[j*lLineBytes+3*i]  = (BYTE)tpBuffer;
  275. m_pData[j*lLineBytes+3*i+1]= (BYTE)tpBuffer;
  276. m_pData[j*lLineBytes+3*i+2]= (BYTE)tpBuffer;
  277. }
  278. }
  279. //删除临时的数据空间
  280. delete temp1;
  281. delete temp2;
  282. delete temp3;
  283. layer1=TRUE;
  284. }
  285. void CWvltTransDib::Twice()
  286. {
  287. Once();
  288. int i,j;
  289. LONG width,height,nWidth,nHeight;
  290. BYTE r, g, b;
  291. LPBYTE temp1, temp2,temp3;
  292. float tpBuffer;
  293. short maxVal,minVal,difVal;
  294. width=this->GetWidth()/2;
  295. height=this->GetHeight()/2;
  296. nWidth=width/2;
  297. nHeight=height/2;
  298. LONG lLineBytes = (this->GetWidth()*3+3)/4 *4;
  299. //分配临时数据空间
  300. temp1 = new BYTE[height*width];
  301. temp2 = new BYTE[height*width];
  302. temp3 = new BYTE[height*width];
  303. //从设备缓存中获得原始图像数据
  304. for(j=0; j<(int)height; j++)
  305. {
  306. for( i=0; i<(int)width; i++)
  307. {
  308. b=m_pData[(j+height)*lLineBytes+3*i];
  309. g=m_pData[(j+height)*lLineBytes+3*i+1];
  310. r=m_pData[(j+height)*lLineBytes+3*i+2];
  311. temp1[(height-1-j)*width+i]=(BYTE)(0.3*r+0.59*g+0.11*b);  
  312. }
  313. }
  314.     for(j = 0; j < height; j ++)            
  315. {
  316. for(i = 0; i < nWidth; i ++)           
  317. {
  318. int w = i *2;
  319. temp2[j*width+i] = (temp1[j*width+w]); //偶
  320. temp2[j*width+nWidth+i] = (temp1[j*width+w+1]); //奇
  321. }
  322. }
  323. //通过图像的差分,完成小波变换
  324. for(j=0; j<height; j++)
  325. {
  326. for(i=0; i<nWidth-1; i++)
  327. {
  328. temp2[j*width+nWidth+i] -= temp2[j*width+i]+128;
  329. }
  330. }
  331. for(i=0;i<nWidth;i++)
  332. {
  333. for(j=0;j<nHeight;j++)
  334. {
  335. int h=j*2;
  336. temp3[j*width+i]=temp2[h*width+i];//左上
  337. temp3[(j+nHeight)*width+i]=temp2[(h+1)*width+i];//左下
  338. temp3[j*width+nWidth+i]=temp2[h*width+nWidth+i];//右上
  339. temp3[(j+nWidth)*width+nWidth+i]=temp2[(h+1)*width+nWidth+i];//右下
  340. }
  341. for(j=0;j<nHeight;j++)
  342. {
  343. temp3[(j+nHeight)*width+i]-= temp3[j*width+i]+128;
  344. temp3[(j+nHeight)*width+nWidth+i]-= temp3[j*width+nWidth+i]+128;
  345. }
  346. }
  347. maxVal=temp3[0*width+0];
  348. minVal=temp3[0*width+0];
  349. //得到图像小波系数的极大值与极小值
  350. for( j=0; j<(int)height; j++)
  351. {
  352. for( i=0; i<(int)width; i++)
  353. {
  354. if(maxVal<temp3[j*width+i])
  355. maxVal=temp3[j*width+i];
  356. if(minVal>temp3[j*width+i])
  357. minVal=temp3[j*width+i];
  358. }
  359. }
  360. //计算获取图像小波系数的极值差
  361. difVal=maxVal-minVal;
  362. //小波经过处理后,放入显示缓存中
  363.     for(j=0; j<(int)height; j++)
  364. {
  365. for(i=0; i<(int)width; i++)
  366. {
  367. //因为小波变换后的小波系数有可能超过255甚至更多,那么就将
  368. //小波系数的范围映射到0~255区间内,以后出现类似的处理,目的都是一样的
  369. tpBuffer=temp3[(height-1-j)*width+i];
  370. tpBuffer-=minVal;
  371. tpBuffer*=255;
  372. tpBuffer/=difVal;
  373. m_pData[(j+height)*lLineBytes+3*i]  = (BYTE)tpBuffer;
  374. m_pData[(j+height)*lLineBytes+3*i+1]= (BYTE)tpBuffer;
  375. m_pData[(j+height)*lLineBytes+3*i+2]= (BYTE)tpBuffer;
  376. }
  377. }
  378. //删除临时的数据空间
  379. delete temp1;
  380. delete temp2;
  381. delete temp3;
  382. layer2=TRUE;
  383. }
  384. void CWvltTransDib::Thrice()
  385. {
  386. Twice();
  387. int i,j;
  388. LONG width,height,nWidth,nHeight;
  389. BYTE r, g, b;
  390. LPBYTE temp1, temp2,temp3;
  391. float tpBuffer;
  392. short maxVal,minVal,difVal;
  393. width=this->GetWidth()/4;
  394. height=this->GetHeight()/4;
  395. nWidth=width/2;
  396. nHeight=height/2;
  397. LONG lLineBytes = (this->GetWidth()*3+3)/4 *4;
  398. //分配临时数据空间
  399. temp1 = new BYTE[height*width];
  400. temp2 = new BYTE[height*width];
  401. temp3 = new BYTE[height*width];
  402. //从设备缓存中获得原始图像数据
  403. for(j=0; j<(int)height; j++)
  404. {
  405. for( i=0; i<(int)width; i++)
  406. {
  407. b=m_pData[(j+height*3)*lLineBytes+3*i];
  408. g=m_pData[(j+height*3)*lLineBytes+3*i+1];
  409. r=m_pData[(j+height*3)*lLineBytes+3*i+2];
  410. temp1[(height-1-j)*width+i]=(BYTE)(0.3*r+0.59*g+0.11*b);  
  411. }
  412. }
  413.     for(j = 0; j < height; j ++)            
  414. {
  415. for(i = 0; i < nWidth; i ++)           
  416. {
  417. int w = i *2;
  418. temp2[j*width+i] = (temp1[j*width+w]); //偶
  419. temp2[j*width+nWidth+i] = (temp1[j*width+w+1]); //奇
  420. }
  421. }
  422. //通过图像的差分,完成小波变换
  423. for(j=0; j<height; j++)
  424. {
  425. for(i=0; i<nWidth-1; i++)
  426. {
  427. temp2[j*width+nWidth+i] -= temp2[j*width+i]+128;
  428. }
  429. }
  430. for(i=0;i<nWidth;i++)
  431. {
  432. for(j=0;j<nHeight;j++)
  433. {
  434. int h=j*2;
  435. temp3[j*width+i]=temp2[h*width+i];//左上
  436. temp3[(j+nHeight)*width+i]=temp2[(h+1)*width+i];//左下
  437. temp3[j*width+nWidth+i]=temp2[h*width+nWidth+i];//右上
  438. temp3[(j+nWidth)*width+nWidth+i]=temp2[(h+1)*width+nWidth+i];//右下
  439. }
  440. for(j=0;j<nHeight;j++)
  441. {
  442. temp3[(j+nHeight)*width+i]-= temp3[j*width+i]+128;
  443. temp3[(j+nHeight)*width+nWidth+i]-= temp3[j*width+nWidth+i]+128;
  444. }
  445. }
  446. maxVal=temp3[0*width+0];
  447. minVal=temp3[0*width+0];
  448. //得到图像小波系数的极大值与极小值
  449. for( j=0; j<(int)height; j++)
  450. {
  451. for( i=0; i<(int)width; i++)
  452. {
  453. if(maxVal<temp3[j*width+i])
  454. maxVal=temp3[j*width+i];
  455. if(minVal>temp3[j*width+i])
  456. minVal=temp3[j*width+i];
  457. }
  458. }
  459. //计算获取图像小波系数的极值差
  460. difVal=maxVal-minVal;
  461. //小波经过处理后,放入显示缓存中
  462.     for(j=0; j<(int)height; j++)
  463. {
  464. for(i=0; i<(int)width; i++)
  465. {
  466. //因为小波变换后的小波系数有可能超过255甚至更多,那么就将
  467. //小波系数的范围映射到0~255区间内,以后出现类似的处理,目的都是一样的
  468. tpBuffer=temp3[(height-1-j)*width+i];
  469. tpBuffer-=minVal;
  470. tpBuffer*=255;
  471. tpBuffer/=difVal;
  472. m_pData[(j+height*3)*lLineBytes+3*i]  = (BYTE)tpBuffer;
  473. m_pData[(j+height*3)*lLineBytes+3*i+1]= (BYTE)tpBuffer;
  474. m_pData[(j+height*3)*lLineBytes+3*i+2]= (BYTE)tpBuffer;
  475. }
  476. }
  477. //删除临时的数据空间
  478. delete temp1;
  479. delete temp2;
  480. delete temp3;
  481. layer3=TRUE;
  482. }
  483. void CWvltTransDib::IDWT()
  484. {
  485. if ((layer1==TRUE)||(layer2==TRUE)||(layer3==TRUE))
  486. {
  487. if(layer3)
  488. IDWT_Thrice();
  489. if(layer2)
  490. IDWT_Twice();
  491. if(layer1)
  492. IDWT_Once();
  493. }
  494. else
  495. AfxMessageBox("请先做小波变换。",MB_OK,NULL);
  496. }
  497. void CWvltTransDib::IDWT_Once()
  498. {
  499. int i,j;
  500. LONG width,height,nWidth,nHeight;
  501. BYTE r, g, b;
  502. LPBYTE temp1, temp2,temp3;
  503. float tpBuffer;
  504. short maxVal,minVal,difVal;
  505. width=this->GetWidth();
  506. height=this->GetHeight();
  507. nWidth=width/2;
  508. nHeight=height/2;
  509. LONG lLineBytes = (width*3+3)/4 *4;
  510. //分配临时数据空间
  511. temp1 = new BYTE[height*width];
  512. temp2 = new BYTE[height*width];
  513. temp3 = new BYTE[height*width];
  514. memset(temp1,0,height*width);
  515. memset(temp2,0,height*width);
  516. memset(temp3,0,height*width);
  517. //从设备缓存中获得原始图像数据
  518. for(j=0; j<(int)height; j++)
  519. {
  520. for( i=0; i<(int)width; i++)
  521. {
  522. b=m_pData[j*lLineBytes+3*i];
  523. g=m_pData[j*lLineBytes+3*i+1];
  524. r=m_pData[j*lLineBytes+3*i+2];
  525. temp1[(height-1-j)*width+i]=(BYTE)(0.3*r+0.59*g+0.11*b);  
  526. }
  527. }
  528. for(j=0; j<nHeight; j++)
  529. {
  530. for( i=0; i<width; i++)
  531. {
  532. int h=j*2;
  533. temp2[h*width+i]=temp1[j*width+i];
  534. temp2[(h+1)*width+i]=temp1[j*width+i]+temp1[(j+nHeight)*width+i]-128;
  535. }
  536. }
  537. for( i=0; i<nWidth-1; i++)
  538. {
  539. for(j=0; j<height; j++)
  540. {
  541. int w=i*2;
  542. temp3[j*width+w]=temp2[j*width+i];
  543. temp3[j*width+w+1]=temp2[j*width+i]+temp2[j*width+nWidth+i]-128;
  544. }
  545. }
  546. maxVal=temp3[0*width+0];
  547. minVal=temp3[0*width+0];
  548. //得到图像小波系数的极大值与极小值
  549. for( j=0; j<(int)height; j++)
  550. {
  551. for( i=0; i<(int)width; i++)
  552. {
  553. if(maxVal<temp3[j*width+i])
  554. maxVal=temp3[j*width+i];
  555. if(minVal>temp3[j*width+i])
  556. minVal=temp3[j*width+i];
  557. }
  558. }
  559. //计算获取图像小波系数的极值差
  560. difVal=maxVal-minVal;
  561. //小波经过处理后,放入显示缓存中
  562.     for(j=0; j<(int)height; j++)
  563. {
  564. for(i=0; i<(int)width; i++)
  565. {
  566. //因为小波变换后的小波系数有可能超过255甚至更多,那么就将
  567. //小波系数的范围映射到0~255区间内,以后出现类似的处理,目的都是一样的
  568. tpBuffer=temp3[(height-1-j)*width+i];
  569. tpBuffer-=minVal;
  570. tpBuffer*=255;
  571. tpBuffer/=difVal;
  572. m_pData[j*lLineBytes+3*i]  = (BYTE)tpBuffer;
  573. m_pData[j*lLineBytes+3*i+1]= (BYTE)tpBuffer;
  574. m_pData[j*lLineBytes+3*i+2]= (BYTE)tpBuffer;
  575. }
  576. }
  577. //删除临时的数据空间
  578. delete temp1;
  579. delete temp2;
  580. delete temp3;
  581. layer1=FALSE;
  582. }
  583. void CWvltTransDib::IDWT_Twice()
  584. {
  585. int i,j;
  586. LONG width,height,nWidth,nHeight;
  587. BYTE r, g, b;
  588. LPBYTE temp1, temp2,temp3;
  589. float tpBuffer;
  590. short maxVal,minVal,difVal;
  591. width=this->GetWidth()/2;
  592. height=this->GetHeight()/2;
  593. nWidth=width/2;
  594. nHeight=height/2;
  595. LONG lLineBytes = (this->GetWidth()*3+3)/4 *4;
  596. //分配临时数据空间
  597. temp1 = new BYTE[height*width];
  598. temp2 = new BYTE[height*width];
  599. temp3 = new BYTE[height*width];
  600. memset(temp1,0,height*width);
  601. memset(temp2,0,height*width);
  602. memset(temp3,0,height*width);
  603. //从设备缓存中获得原始图像数据
  604. for(j=0; j<(int)height; j++)
  605. {
  606. for( i=0; i<(int)width; i++)
  607. {
  608. b=m_pData[(j+height)*lLineBytes+3*i];
  609. g=m_pData[(j+height)*lLineBytes+3*i+1];
  610. r=m_pData[(j+height)*lLineBytes+3*i+2];
  611. temp1[(height-1-j)*width+i]=(BYTE)(0.3*r+0.59*g+0.11*b);  
  612. }
  613. }
  614. for(j=0; j<nHeight; j++)
  615. {
  616. for( i=0; i<width; i++)
  617. {
  618. int h=j*2;
  619. temp2[h*width+i]=temp1[j*width+i];
  620. temp2[(h+1)*width+i]=temp1[j*width+i]+temp1[(j+nHeight)*width+i]-128;
  621. }
  622. }
  623. for( i=0; i<nWidth-1; i++)
  624. {
  625. for(j=0; j<height; j++)
  626. {
  627. int w=i*2;
  628. temp3[j*width+w]=temp2[j*width+i];
  629. temp3[j*width+w+1]=temp2[j*width+i]+temp2[j*width+nWidth+i]-128;
  630. }
  631. }
  632. maxVal=temp3[0*width+0];
  633. minVal=temp3[0*width+0];
  634. //得到图像小波系数的极大值与极小值
  635. for( j=0; j<(int)height; j++)
  636. {
  637. for( i=0; i<(int)width; i++)
  638. {
  639. if(maxVal<temp3[j*width+i])
  640. maxVal=temp3[j*width+i];
  641. if(minVal>temp3[j*width+i])
  642. minVal=temp3[j*width+i];
  643. }
  644. }
  645. //计算获取图像小波系数的极值差
  646. difVal=maxVal-minVal;
  647. //小波经过处理后,放入显示缓存中
  648.     for(j=0; j<(int)height; j++)
  649. {
  650. for(i=0; i<(int)width; i++)
  651. {
  652. //因为小波变换后的小波系数有可能超过255甚至更多,那么就将
  653. //小波系数的范围映射到0~255区间内,以后出现类似的处理,目的都是一样的
  654. tpBuffer=temp3[(height-1-j)*width+i];
  655. tpBuffer-=minVal;
  656. tpBuffer*=255;
  657. tpBuffer/=difVal;
  658. m_pData[(j+height)*lLineBytes+3*i]  = (BYTE)tpBuffer;
  659. m_pData[(j+height)*lLineBytes+3*i+1]= (BYTE)tpBuffer;
  660. m_pData[(j+height)*lLineBytes+3*i+2]= (BYTE)tpBuffer;
  661. }
  662. }
  663. //删除临时的数据空间
  664. delete temp1;
  665. delete temp2;
  666. delete temp3;
  667. layer2=FALSE;
  668. }
  669. void CWvltTransDib::IDWT_Thrice()
  670. {
  671. int i,j;
  672. LONG width,height,nWidth,nHeight;
  673. BYTE r, g, b;
  674. LPBYTE temp1, temp2,temp3;
  675. float tpBuffer;
  676. short maxVal,minVal,difVal;
  677. width=this->GetWidth()/4;
  678. height=this->GetHeight()/4;
  679. nWidth=width/2;
  680. nHeight=height/2;
  681. LONG lLineBytes = (this->GetWidth()*3+3)/4 *4;
  682. //分配临时数据空间
  683. temp1 = new BYTE[height*width];
  684. temp2 = new BYTE[height*width];
  685. temp3 = new BYTE[height*width];
  686. memset(temp1,0,height*width);
  687. memset(temp2,0,height*width);
  688. memset(temp3,0,height*width);
  689. //从设备缓存中获得原始图像数据
  690. for(j=0; j<(int)height; j++)
  691. {
  692. for( i=0; i<(int)width; i++)
  693. {
  694. b=m_pData[(j+height*3)*lLineBytes+3*i];
  695. g=m_pData[(j+height*3)*lLineBytes+3*i+1];
  696. r=m_pData[(j+height*3)*lLineBytes+3*i+2];
  697. temp1[(height-1-j)*width+i]=(BYTE)(0.3*r+0.59*g+0.11*b);  
  698. }
  699. }
  700. for(j=0; j<nHeight; j++)
  701. {
  702. for( i=0; i<width; i++)
  703. {
  704. int h=j*2;
  705. temp2[h*width+i]=temp1[j*width+i];
  706. temp2[(h+1)*width+i]=temp1[j*width+i]+temp1[(j+nHeight)*width+i]-128;
  707. }
  708. }
  709. for( i=0; i<nWidth-1; i++)
  710. {
  711. for(j=0; j<height; j++)
  712. {
  713. int w=i*2;
  714. temp3[j*width+w]=temp2[j*width+i];
  715. temp3[j*width+w+1]=temp2[j*width+i]+temp2[j*width+nWidth+i]-128;
  716. }
  717. }
  718. maxVal=temp3[0*width+0];
  719. minVal=temp3[0*width+0];
  720. //得到图像小波系数的极大值与极小值
  721. for( j=0; j<(int)height; j++)
  722. {
  723. for( i=0; i<(int)width; i++)
  724. {
  725. if(maxVal<temp3[j*width+i])
  726. maxVal=temp3[j*width+i];
  727. if(minVal>temp3[j*width+i])
  728. minVal=temp3[j*width+i];
  729. }
  730. }
  731. //计算获取图像小波系数的极值差
  732. difVal=maxVal-minVal;
  733. //小波经过处理后,放入显示缓存中
  734.     for(j=0; j<(int)height; j++)
  735. {
  736. for(i=0; i<(int)width; i++)
  737. {
  738. //因为小波变换后的小波系数有可能超过255甚至更多,那么就将
  739. //小波系数的范围映射到0~255区间内,以后出现类似的处理,目的都是一样的
  740. tpBuffer=temp3[(height-1-j)*width+i];
  741. tpBuffer-=minVal;
  742. tpBuffer*=255;
  743. tpBuffer/=difVal;
  744. m_pData[(j+height*3)*lLineBytes+3*i]  = (BYTE)tpBuffer;
  745. m_pData[(j+height*3)*lLineBytes+3*i+1]= (BYTE)tpBuffer;
  746. m_pData[(j+height*3)*lLineBytes+3*i+2]= (BYTE)tpBuffer;
  747. }
  748. }
  749. //删除临时的数据空间
  750. delete temp1;
  751. delete temp2;
  752. delete temp3;
  753. layer3=FALSE;
  754. }
  755. void CWvltTransDib::LowFilter()
  756. {
  757. int i,j;
  758. LONG width,height,nWidth,nHeight;
  759. width=this->GetWidth();
  760. height=this->GetHeight();
  761. nWidth=width/2;
  762. nHeight=height/2;
  763. LONG lLineBytes = (width*3+3)/4 *4;
  764. Once();
  765. for(j=0;j<height;j++)
  766. {
  767. for(i=0;i<width;i++)
  768. {
  769. if(!((i<nWidth)&&(j>nHeight)))
  770. {
  771. m_pData[j*lLineBytes+3*i]  = (BYTE)128;
  772. m_pData[j*lLineBytes+3*i+1]= (BYTE)128;
  773. m_pData[j*lLineBytes+3*i+2]= (BYTE)128;
  774. }
  775. }
  776. }
  777. IDWT_Once();
  778. }
  779. void CWvltTransDib::HighFilter()
  780. {
  781. int i,j;
  782. LONG width,height,nWidth,nHeight;
  783. width=this->GetWidth();
  784. height=this->GetHeight();
  785. nWidth=width/2;
  786. nHeight=height/2;
  787. LONG lLineBytes = (width*3+3)/4 *4;
  788. Once();
  789. for(j=0;j<height;j++)
  790. {
  791. for(i=0;i<width;i++)
  792. {
  793. if((i<nWidth)&&(j>nHeight))
  794. {
  795. m_pData[j*lLineBytes+3*i]  = (BYTE)128;
  796. m_pData[j*lLineBytes+3*i+1]= (BYTE)128;
  797. m_pData[j*lLineBytes+3*i+2]= (BYTE)128;
  798. }
  799. }
  800. }
  801. IDWT_Once();
  802. }