小波变换Doc.cpp
上传用户:aqingfeng
上传日期:2014-03-25
资源大小:1839k
文件大小:38k
源码类别:

波变换

开发平台:

Visual C++

  1. // 小波变换Doc.cpp : implementation of the CMyDoc class
  2. //
  3. #include "stdafx.h"
  4. #include "小波变换.h"
  5. #include "WvltTrans.h"
  6. #include "小波变换Doc.h"
  7. #include "Diproc.h"
  8. #include "WFilter.h"
  9. #include "math.h"
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #undef THIS_FILE
  13. static char THIS_FILE[] = __FILE__;
  14. #endif
  15. /////////////////////////////////////////////////////////////////////////////
  16. // CMyDoc
  17. IMPLEMENT_DYNCREATE(CMyDoc, CDocument)
  18. BEGIN_MESSAGE_MAP(CMyDoc, CDocument)
  19. //{{AFX_MSG_MAP(CMyDoc)
  20. ON_COMMAND(ID_FILE_REOPEN, OnFileReopen)
  21. ON_COMMAND(IDM_WVLT_HORTRANS, OnWvltHortrans)
  22. ON_COMMAND(IDM_WVLT_VERTRANS, OnWvltVertrans)
  23. ON_COMMAND(IDM_WVLT_ONCE, OnWvltTransOnce)
  24. ON_COMMAND(IDM_WVLT_TWICE, OnWvltTransTwice)
  25. ON_COMMAND(IDM_WVLT_TRBL, OnWvltTransTrbl)
  26. ON_COMMAND(IDM_DIPROC_FUSION, OnDiprocFusion)
  27. ON_COMMAND(IDM_DIPROC_REVER, OnDiprocRever)
  28. ON_COMMAND(IDM_FILTER_BLUR, OnFilterBlur)
  29. ON_COMMAND(IDM_FILTER_SHARPNESS, OnFilterSharpness)
  30. ON_COMMAND(IDM_FILTER_BLUR2, OnFilterBlur2)
  31. ON_COMMAND(IDM_FILTER_SHARPNESS2, OnFilterSharpness2)
  32.    
  33. //}}AFX_MSG_MAP
  34. END_MESSAGE_MAP()
  35. /////////////////////////////////////////////////////////////////////////////
  36. // CMyDoc construction/destruction
  37. CMyDoc::CMyDoc()
  38. {
  39. // TODO: add one-time construction code here
  40. m_fDirty = FALSE;
  41. m_pBitmap = NULL ;
  42. m_pTransfered = NULL;
  43. m_bTribl = FALSE; m_bOnce = FALSE; m_bTwice = FALSE; m_bFilter = FALSE;
  44. m_hDIB = NULL;
  45. m_palDIB = NULL;
  46. m_sizeDoc = CSize(1,1);
  47. m_hMulDIB= NULL;
  48. }
  49. CMyDoc::~CMyDoc()
  50. {
  51. if( m_pBitmap != NULL)
  52. free( m_pBitmap);
  53. if( m_pTransfered != NULL)
  54. free( m_pTransfered );
  55. // 判断DIB对象是否存在
  56. if (m_hDIB != NULL)
  57. {
  58. // 清除DIB对象
  59. ::GlobalFree((HGLOBAL) m_hDIB);
  60. }
  61. // 判断调色板是否存在
  62. if (m_palDIB != NULL)
  63. {
  64. // 清除调色板
  65. delete m_palDIB;
  66. }
  67. }
  68. /////////////////////////////////////////////////////////////////////////////
  69. // CMyDoc serialization
  70. void CMyDoc::Serialize(CArchive& ar)
  71. {
  72. if (ar.IsStoring())
  73. {
  74. // TODO: add storing code here
  75. }
  76. else
  77. {
  78. // TODO: add loading code here
  79. }
  80. }
  81. /////////////////////////////////////////////////////////////////////////////
  82. // CMyDoc diagnostics
  83. #ifdef _DEBUG
  84. void CMyDoc::AssertValid() const
  85. {
  86. CDocument::AssertValid();
  87. }
  88. void CMyDoc::Dump(CDumpContext& dc) const
  89. {
  90. CDocument::Dump(dc);
  91. }
  92. #endif //_DEBUG
  93. /////////////////////////////////////////////////////////////////////////////
  94. // CMyDoc commands
  95. BOOL CMyDoc::OnNewDocument()//建立新文档
  96. {
  97. if (!CDocument::OnNewDocument())
  98. return FALSE;
  99. // TODO: add reinitialization code here
  100. // (SDI documents will reuse this document)
  101. return TRUE;
  102. }
  103. BOOL CMyDoc::OnOpenDocument(LPCTSTR lpszPathName)//打开已有文档,lpszPathName是待打开文件的文件名 
  104. {
  105. CFile file;
  106. CFileException fe;
  107. // 打开文件
  108. if (!file.Open(lpszPathName, CFile::modeRead | CFile::shareDenyWrite, &fe))
  109. {
  110. // 失败
  111. ReportSaveLoadException(lpszPathName, &fe,FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
  112. // 返回FALSE
  113. return FALSE;
  114. }
  115. DeleteContents();
  116. // 更改光标形状
  117. BeginWaitCursor();
  118. // 尝试调用ReadDIBFile()读取图像
  119. TRY
  120. {
  121. m_hDIB = ::ReadDIBFile(file);
  122. }
  123. CATCH (CFileException, eLoad)
  124. {
  125. // 读取失败
  126. file.Abort();
  127. // 恢复光标形状
  128. EndWaitCursor();
  129. // 报告失败
  130. ReportSaveLoadException(lpszPathName, eLoad,FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
  131. // 设置DIB为空
  132. m_hDIB = NULL;
  133. // 返回FALSE
  134. return FALSE;
  135. }
  136. END_CATCH
  137. // 初始化DIB
  138. InitDIBData();
  139. // 恢复光标形状
  140. EndWaitCursor();
  141. // 判断读取文件是否成功
  142. if (m_hDIB == NULL)
  143. {
  144. // 失败,可能非BMP格式
  145. CString strMsg;
  146. strMsg = "读取图像时出错!可能是不支持该类型的图像文件!";
  147. // 提示出错
  148. MessageBox(NULL, strMsg, "系统提示", MB_ICONINFORMATION | MB_OK);
  149. // 返回FALSE
  150. return FALSE;
  151. }
  152. // 设置文件名称
  153. SetPathName(lpszPathName);
  154. // 初始化胀标记为FALSE
  155. SetModifiedFlag(FALSE);
  156. // 返回TRUE
  157. return TRUE;
  158. }
  159.  void CMyDoc::OnFileReopen() 
  160. {
  161.   // 重新打开图像,放弃所有修改
  162.  
  163. // 判断当前图像是否已经被改动
  164. if (IsModified())
  165. {
  166. // 提示用户该操作将丢失所有当前的修改
  167. if (MessageBox(NULL, "重新打开图像将丢失所有改动!是否继续?", "系统提示", MB_ICONQUESTION | MB_YESNO) == IDNO)
  168. {
  169. // 用户取消操作,直接返回
  170. return;
  171. }
  172. }
  173. CFile file;
  174.   CFileException fe;
  175.  
  176.   CString strPathName;
  177.   
  178. // 获取当前文件路径
  179.   strPathName = GetPathName();
  180.  
  181.   // 重新打开文件
  182.   if (!file.Open(strPathName, CFile::modeRead | CFile::shareDenyWrite, &fe))
  183.   {
  184.   // 失败
  185.   ReportSaveLoadException(strPathName, &fe,
  186.   FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
  187.  
  188.   // 返回
  189.   return;
  190.   }
  191.  
  192.   // 更改光标形状
  193.   BeginWaitCursor();
  194.  
  195.   // 尝试调用ReadDIBFile()读取图像
  196.   TRY
  197.   {
  198.   m_hDIB = ::ReadDIBFile(file);
  199.   }
  200.   CATCH (CFileException, eLoad)
  201.   {
  202.   // 读取失败
  203.   file.Abort();
  204.  
  205.   // 恢复光标形状
  206.   EndWaitCursor();
  207.  
  208.   // 报告失败
  209.   ReportSaveLoadException(strPathName, eLoad,
  210.   FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
  211.  
  212.   // 设置DIB为空
  213.   m_hDIB = NULL;
  214.  
  215.   // 返回
  216.   return;
  217.   }
  218.   END_CATCH
  219.  
  220.   // 初始化DIB
  221.   InitDIBData();
  222.  
  223.   // 判断读取文件是否成功
  224.   if (m_hDIB == NULL)
  225.   {
  226.   // 失败,可能非BMP格式
  227.   CString strMsg;
  228.   strMsg = "读取图像时出错!可能是不支持该类型的图像文件!";
  229.  
  230.   // 提示出错
  231.   MessageBox(NULL, strMsg, "系统提示", MB_ICONINFORMATION | MB_OK);
  232.   
  233.   // 恢复光标形状
  234.   EndWaitCursor();
  235.  
  236.   // 返回
  237.   return;
  238.   }
  239.  
  240.   // 初始化胀标记为FALSE
  241.   SetModifiedFlag(FALSE);
  242.  
  243.   // 刷新
  244.   UpdateAllViews(NULL);
  245.   
  246.   // 恢复光标形状
  247.   EndWaitCursor();
  248.   // 返回
  249.   return;
  250.  
  251. }
  252. void CMyDoc::InitDIBData()
  253. {
  254. // 初始化DIB对象
  255. // 判断调色板是否为空
  256. if (m_palDIB != NULL)
  257. {
  258. // 删除调色板对象
  259. delete m_palDIB;
  260. // 重置调色板为空
  261. m_palDIB = NULL;
  262. }
  263. // 如果DIB对象为空,直接返回
  264. if (m_hDIB == NULL)
  265. {
  266. // 返回
  267. return;
  268. }
  269. LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_hDIB);
  270. // 判断图像是否过大
  271. if (::DIBWidth(lpDIB) > INT_MAX ||::DIBHeight(lpDIB) > INT_MAX)
  272. {
  273. ::GlobalUnlock((HGLOBAL) m_hDIB);
  274. // 释放DIB对象
  275. ::GlobalFree((HGLOBAL) m_hDIB);
  276. // 设置DIB为空
  277. m_hDIB = NULL;
  278. CString strMsg;
  279. strMsg = "BMP图像太大!";
  280. // 提示用户
  281. MessageBox(NULL, strMsg, "系统提示", MB_ICONINFORMATION | MB_OK);
  282. // 返回
  283. return;
  284. }
  285. // 设置文档大小
  286. m_sizeDoc = CSize((int) ::DIBWidth(lpDIB), (int) ::DIBHeight(lpDIB));
  287. ::GlobalUnlock((HGLOBAL) m_hDIB);
  288. // 创建新调色板
  289. m_palDIB = new CPalette;
  290. // 判断是否创建成功
  291. if (m_palDIB == NULL)
  292. {
  293. // 失败,可能是内存不足
  294. ::GlobalFree((HGLOBAL) m_hDIB);
  295. // 设置DIB对象为空
  296. m_hDIB = NULL;
  297. // 返回
  298. return;
  299. }
  300. // 调用CreateDIBPalette来创建调色板
  301. if (::CreateDIBPalette(m_hDIB, m_palDIB) == NULL)
  302. {
  303. // 返回空,可能该DIB对象没有调色板
  304. // 删除
  305. delete m_palDIB;
  306. // 设置为空
  307. m_palDIB = NULL;
  308. // 返回
  309. return;
  310. }
  311. }
  312. BOOL CMyDoc::OnSaveDocument(LPCTSTR lpszPathName) 
  313. {
  314. CFile file;
  315. CFileException fe;
  316. // 打开文件
  317. if (!file.Open(lpszPathName, CFile::modeCreate |
  318.   CFile::modeReadWrite | CFile::shareExclusive, &fe))
  319. {
  320. // 失败
  321. ReportSaveLoadException(lpszPathName, &fe,TRUE, AFX_IDP_INVALID_FILENAME);
  322. // 返回FALSE
  323. return FALSE;
  324. }
  325. // 尝试调用SaveDIB保存图像
  326. BOOL bSuccess = FALSE;
  327. TRY
  328. {
  329. // 更改光标形状
  330. BeginWaitCursor();
  331. // 尝试保存图像
  332. bSuccess = ::SaveDIB(m_hDIB, file);
  333. // 关闭文件
  334. file.Close();
  335. }
  336. CATCH (CException, eSave)
  337. {
  338. // 失败
  339. file.Abort();
  340. // 恢复光标形状
  341. EndWaitCursor();
  342. ReportSaveLoadException(lpszPathName, eSave,TRUE, AFX_IDP_FAILED_TO_SAVE_DOC);
  343. // 返回FALSE
  344. return FALSE;
  345. }
  346. END_CATCH
  347. // 恢复光标形状
  348. EndWaitCursor();
  349. // 重置胀标记为FALSE
  350. SetModifiedFlag(FALSE);
  351. if (!bSuccess)
  352. {
  353. // 保存失败,可能是其它格式的DIB,可以读取但是不能保存
  354. // 或者是SaveDIB函数有误
  355. CString strMsg;
  356. strMsg = "无法保存BMP图像!";
  357. // 提示出错
  358. MessageBox(NULL, strMsg, "系统提示", MB_ICONINFORMATION | MB_OK);
  359. }
  360. return bSuccess;
  361. }
  362. void CMyDoc::OnWvltHortrans() 
  363. {
  364. // TODO: Add your command handler code here
  365. //读取数字图像的文件头,获取图像的属性参数
  366. LPSTR lpDIB;
  367. // 指向DIB象素指针
  368. LPSTR    lpDIBBits;
  369. // 锁定DIB
  370. lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)GetHDIB());
  371. // 找到DIB图像象素起始位置
  372. lpDIBBits = ::FindDIBBits(lpDIB);
  373. unsigned long biWidth =::DIBWidth(lpDIB);
  374. unsigned long biHeight = ::DIBHeight(lpDIB);
  375. unsigned long biAlign = (biWidth*3+3)/4 *4;
  376. unsigned long bmSize = biHeight * biAlign;
  377. unsigned char *lpData = (unsigned char*)lpDIBBits ;
  378. //图像矩阵坐标与像素数值
  379. int x,y,cur;
  380. unsigned char tempR, tempG, tempB;
  381. short **spOriginData, **spTransData0;
  382. float fTempBufforDisp;
  383. short MaxPixVal,MinPixVal,Diff;
  384. //分配数据空间
  385. spOriginData = new short* [biHeight];
  386. spTransData0 = new short* [biHeight];
  387. //
  388. for(int i = 0; i < biHeight; i ++)
  389. {
  390. spOriginData[i] = new short [biWidth];
  391. spTransData0[i] = new short [biWidth];
  392. }
  393. //创建图像小波变换类
  394. CWvltTrans *pTrans;
  395. //从设备缓存中获得原始图像数据
  396. for(y=0; y<(int)biHeight; y++)
  397. {
  398. for( x=0; x<(int)biWidth; x++)
  399. {
  400. cur = y*biAlign+3*x;
  401. tempB=lpData[cur];
  402. tempG=lpData[cur+1];
  403. tempR=lpData[cur+2];
  404. spOriginData[biHeight-1-y][x]=(short)(0.3*tempR+0.59*tempG+0.11*tempB);  //no problem
  405. }
  406. }
  407. //完成图像水平方向的一次小波变换
  408. pTrans->Hori_Transform(spOriginData,spTransData0,biHeight,biWidth/2,1);
  409. //屏蔽图像复原操作标志
  410. m_bFilter = TRUE;
  411. m_bFilter = m_bFilter & ~m_bOnce & ~m_bTwice & ~m_bTribl;
  412. MaxPixVal=spTransData0[0][0];
  413. MinPixVal=spTransData0[0][0];
  414. //得到图像小波系数的极大值与极小值
  415. for( y=0; y<(int)biHeight; y++)
  416. {
  417. for( x=0; x<(int)biWidth; x++)
  418. {
  419. if(MaxPixVal<spTransData0[y][x])
  420. MaxPixVal=spTransData0[y][x];
  421. if(MinPixVal>spTransData0[y][x])
  422. MinPixVal=spTransData0[y][x];
  423. }
  424. }
  425. //计算获取图像小波系数的极值差
  426. Diff=MaxPixVal-MinPixVal;
  427. //小波经过处理后,放入显示缓存中
  428. for(y=0; y<(int)biHeight; y++)
  429. {
  430. for(x=0; x<(int)biWidth; x++)
  431. {
  432. //因为小波变换后的小波系数有可能超过255甚至更多,那么就将
  433. //小波系数的范围映射到0~255区间内,以后出现类似的处理,目的都是一样的
  434. fTempBufforDisp=spTransData0[biHeight-1-y][x];
  435. fTempBufforDisp-=MinPixVal;
  436. fTempBufforDisp*=255;
  437. fTempBufforDisp/=Diff;
  438. cur= y*biAlign+3*x; //current pixel
  439. lpData[cur] = (unsigned char)fTempBufforDisp;
  440. lpData[cur+1]= (unsigned char)fTempBufforDisp;
  441. lpData[cur+2]= (unsigned char)fTempBufforDisp;
  442. }
  443. }
  444. //小波图像水平方向小波变换
  445. SetModifiedFlag(TRUE);
  446. UpdateAllViews(NULL);
  447. ::GlobalUnlock((HGLOBAL)GetHDIB());
  448. //删除临时的数据空间
  449. delete spOriginData;
  450. delete spTransData0;
  451. }
  452. void CMyDoc::OnWvltVertrans() 
  453. {
  454. // TODO: Add your command handler code here
  455. //读取数字图像的文件头,获取图像的属性参数
  456. LPSTR lpDIB;
  457. // 指向DIB象素指针
  458. LPSTR    lpDIBBits;
  459. // 锁定DIB
  460. lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)GetHDIB());
  461. // 找到DIB图像象素起始位置
  462. lpDIBBits = ::FindDIBBits(lpDIB);
  463. unsigned long biWidth =::DIBWidth(lpDIB);
  464. unsigned long biHeight = ::DIBHeight(lpDIB);
  465. unsigned long biAlign = (biWidth*3+3)/4 *4;
  466. unsigned long bmSize = biHeight * biAlign;
  467. unsigned char *lpData = (unsigned char*)lpDIBBits ;
  468. //图像矩阵坐标与像素数据
  469. int x,y,cur;
  470. unsigned char tempR, tempG, tempB;
  471. float fTempBufforDisp;
  472. short MaxPixVal,MinPixVal,Diff;
  473. short **spOriginData, **spTransData1;
  474. //分配图像小波变换所需的数据空间
  475. spOriginData = new short* [biHeight];
  476. spTransData1 = new short* [biHeight];
  477. for(int i = 0; i < biHeight; i ++)
  478. {
  479. spOriginData[i] = new short [biWidth];
  480. spTransData1[i] = new short [biWidth];
  481. }
  482. //创建图像小波变换类
  483. CWvltTrans *pTrans;
  484. //从设备缓存中获取原始图像数据
  485. for(y=0; y<(int)biHeight; y++)
  486. {
  487. for( x=0; x<(int)biWidth; x++)
  488. {
  489. cur = y*biAlign+3*x;
  490. tempB=lpData[cur];
  491. tempG=lpData[cur+1];
  492. tempR=lpData[cur+2];
  493. spOriginData[biHeight-1-y][x]=(short)(0.3*tempR+0.59*tempG+0.11*tempB);  //no problem
  494. }
  495. }
  496. //完成一次竖直方向的图像小波变换
  497. pTrans->Vert_Transform(spOriginData,spTransData1,biHeight/2,biWidth,1);
  498. //屏蔽图像复原操作标志
  499. m_bFilter = TRUE;
  500. m_bFilter = m_bFilter & ~m_bOnce & ~m_bTwice & ~m_bTribl;
  501. MaxPixVal=spTransData1[0][0];
  502. MinPixVal=spTransData1[0][0];
  503. //计算得到图像小波系数的极大值和极小值
  504. for( y=0; y<(int)biHeight; y++)
  505. {
  506. for( x=0; x<(int)biWidth; x++)
  507. {
  508. if(MaxPixVal<spTransData1[y][x])
  509. MaxPixVal=spTransData1[y][x];
  510. if(MinPixVal>spTransData1[y][x])
  511. MinPixVal=spTransData1[y][x];
  512. }
  513. }
  514. //计算小波系数的极值差
  515. Diff=MaxPixVal-MinPixVal;
  516. //将小波系数处理后,放入显示缓存中
  517. for(y=0; y<(int)biHeight; y++)
  518. {
  519. for(x=0; x<(int)biWidth; x++)
  520. {
  521. //因为小波变换后的小波系数有可能超过255甚至更多,那么就将
  522. //小波系数的范围映射到0~255区间内,以后出现类似的处理,目的都是一样的
  523. fTempBufforDisp=spTransData1[biHeight-1-y][x];
  524. fTempBufforDisp-=MinPixVal;
  525. fTempBufforDisp*=255;
  526. fTempBufforDisp/=Diff;
  527. cur= y*biAlign+3*x; //current pixel
  528. lpData[cur] = (unsigned char)fTempBufforDisp;
  529. lpData[cur+1]= (unsigned char)fTempBufforDisp;
  530. lpData[cur+2]= (unsigned char)fTempBufforDisp;
  531. }
  532. }
  533. SetModifiedFlag(TRUE);
  534. //显示图像的小波系数
  535. UpdateAllViews(NULL);
  536. ::GlobalUnlock((HGLOBAL)GetHDIB());
  537. //删除临时的数据空间
  538. delete spOriginData;
  539. delete spTransData1;
  540. }
  541. void CMyDoc::OnWvltTransOnce() 
  542. {
  543. // TODO: Add your command handler code here
  544. //读取数字图像的文件头,获取图像的属性参数
  545. LPSTR lpDIB;
  546. // 指向DIB象素指针
  547. LPSTR    lpDIBBits;
  548. // 锁定DIB
  549. lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)GetHDIB());
  550. // 找到DIB图像象素起始位置
  551. lpDIBBits = ::FindDIBBits(lpDIB);
  552. unsigned long biWidth =::DIBWidth(lpDIB);
  553. unsigned long biHeight = ::DIBHeight(lpDIB);
  554. unsigned long biAlign = (biWidth*3+3)/4 *4;
  555. unsigned long bmSize = biHeight * biAlign;
  556. unsigned char *lpData = (unsigned char*)lpDIBBits ;
  557. //图像矩阵坐标与像素数据
  558. int x,y,cur;
  559. unsigned char tempR, tempG, tempB;
  560. float fTempBufforDisp;
  561. short MaxPixVal,MinPixVal,Diff;
  562. short **spOriginData, **spTransData0, **spTransData1;
  563. //分配图像小波变换所用的数据空间
  564. spOriginData = new short* [biHeight];
  565. spTransData0 = new short* [biHeight];
  566. spTransData1 = new short* [biHeight];
  567. m_WvltCoeff = new short * [biHeight];
  568. for(int i = 0; i < biHeight; i ++)
  569. {
  570. spOriginData[i] = new short [biWidth];
  571. spTransData0[i] = new short [biWidth];
  572. spTransData1[i] = new short [biWidth];
  573. m_WvltCoeff[i] = new short [biWidth];
  574. }
  575. //创建图像小波变换类
  576. CWvltTrans *pTrans;
  577. //从设备缓存中获取原始图像数据
  578. for(y=0; y<(int)biHeight; y++)
  579. {
  580. for( x=0; x<(int)biWidth; x++)
  581. {
  582. cur = y*biAlign+3*x;
  583. tempB=lpData[cur];
  584. tempG=lpData[cur+1];
  585. tempR=lpData[cur+2];
  586. spOriginData[biHeight-1-y][x]=(short)(0.3*tempR+0.59*tempG+0.11*tempB);  //no problem
  587. }
  588. }
  589. //完成一次图像小波变换
  590. pTrans->DWT_Once(spOriginData,spTransData0,spTransData1,biHeight,biHeight/2,biWidth,biWidth/2,1,1.414);
  591. //允许图像复原操作标志
  592. m_bOnce = TRUE;
  593. m_bOnce = m_bOnce & ~m_bTwice & ~m_bTribl & ~m_bFilter;
  594. MaxPixVal=spTransData1[0][0];
  595. MinPixVal=spTransData1[0][0];
  596. for( y=0; y<(int)biHeight; y++)
  597. {
  598. for( x=0; x<(int)biWidth; x++)
  599. {
  600. if(MaxPixVal<spTransData1[y][x])
  601. MaxPixVal=spTransData1[y][x];
  602. if(MinPixVal>spTransData1[y][x])
  603. MinPixVal=spTransData1[y][x];
  604. m_WvltCoeff[y][x] = spTransData1[y][x];
  605. }
  606. }
  607. Diff=MaxPixVal-MinPixVal;
  608. for(y=0; y<(int)biHeight; y++)
  609. {
  610. for(x=0; x<(int)biWidth; x++)
  611. {
  612. //因为小波变换后的小波系数有可能超过255甚至更多,那么就将
  613. //小波系数的范围映射到0~255区间内,以后出现类似的处理,目的都是一样的
  614. fTempBufforDisp=spTransData1[biHeight-1-y][x];
  615. fTempBufforDisp-=MinPixVal;
  616. fTempBufforDisp*=255;
  617. fTempBufforDisp/=Diff;
  618. cur= y*biAlign+3*x; //current pixel
  619. lpData[cur] = (unsigned char)fTempBufforDisp;
  620. lpData[cur+1]= (unsigned char)fTempBufforDisp;
  621. lpData[cur+2]= (unsigned char)fTempBufforDisp;
  622. }
  623. }
  624. SetModifiedFlag(TRUE);
  625. //显示图像的小波系数
  626. UpdateAllViews(NULL);
  627. ::GlobalUnlock((HGLOBAL)GetHDIB());
  628. //删除临时的数据空间
  629. delete spOriginData;
  630. delete spTransData0;
  631. delete spTransData1;
  632. }
  633. void CMyDoc::OnWvltTransTwice() 
  634. {
  635. // TODO: Add your command handler code here
  636. //读取数字图像的文件头,获取图像的属性参数
  637. LPSTR lpDIB;
  638. // 指向DIB象素指针
  639. LPSTR    lpDIBBits;
  640. // 锁定DIB
  641. lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)GetHDIB());
  642. // 找到DIB图像象素起始位置
  643. lpDIBBits = ::FindDIBBits(lpDIB);
  644. unsigned long biWidth =::DIBWidth(lpDIB);
  645. unsigned long biHeight = ::DIBHeight(lpDIB);
  646. unsigned long biAlign = (biWidth*3+3)/4 *4;
  647. unsigned long bmSize = biHeight * biAlign;
  648. unsigned char *lpData = (unsigned char*)lpDIBBits ;
  649. //图像矩阵坐标与像素数值
  650. int x,y,cur;
  651. unsigned char tempR, tempG, tempB;
  652. float fTempBufforDisp;
  653. short MaxPixVal,MinPixVal,Diff;
  654. short **spOriginData, **spTransData0, **spTransData1;
  655. //分配数据空间
  656. spOriginData = new short* [biHeight];
  657. spTransData0 = new short* [biHeight];
  658. spTransData1 = new short* [biHeight];
  659. m_WvltCoeff = new short * [biHeight];
  660. for(int i = 0; i < biHeight; i ++)
  661. {
  662. spOriginData[i] = new short [biWidth];
  663. spTransData0[i] = new short [biWidth];
  664. spTransData1[i] = new short [biWidth];
  665. m_WvltCoeff[i] = new short [biWidth];
  666. }
  667. //创建图像小波变化类
  668. CWvltTrans *pTrans;
  669. //从设备缓存中获取原始图像数据
  670. for(y=0; y<(int)biHeight; y++)
  671. {
  672. for( x=0; x<(int)biWidth; x++)
  673. {
  674. cur = y*biAlign+3*x;
  675. tempB=lpData[cur];
  676. tempG=lpData[cur+1];
  677. tempR=lpData[cur+2];
  678. spOriginData[biHeight-1-y][x]=(short)(0.3*tempR+0.59*tempG+0.11*tempB);  //no problem
  679. }
  680. }
  681. //完成图像的两次小波变换
  682. pTrans->DWT_TwoLayers(spOriginData,spTransData0,spTransData1,biHeight,biHeight/2,biWidth,biWidth/2,2,1.414);
  683. //允许图像复原操作标志
  684. m_bTwice = TRUE;
  685. m_bTwice = m_bTwice & ~m_bTribl & ~m_bOnce & ~m_bFilter;
  686. MaxPixVal=spTransData1[0][0];
  687. MinPixVal=spTransData1[0][0];
  688. //计算得到图像小波系数的极大值与极小值
  689. for( y=0; y<(int)biHeight; y++)
  690. {
  691. for( x=0; x<(int)biWidth; x++)
  692. {
  693. if(MaxPixVal<spTransData1[y][x])
  694. MaxPixVal=spTransData1[y][x];
  695. if(MinPixVal>spTransData1[y][x])
  696. MinPixVal=spTransData1[y][x];
  697. m_WvltCoeff[y][x] = spTransData1[y][x];
  698. }
  699. }
  700. //计算获得小波系数的极值差
  701. Diff=MaxPixVal-MinPixVal;
  702. //小波系数经过处理后,放入显示缓存中
  703. for(y=0; y<(int)biHeight; y++)
  704. {
  705. for(x=0; x<(int)biWidth; x++)
  706. {
  707. //因为小波变换后的小波系数有可能超过255甚至更多,那么就将
  708. //小波系数的范围映射到0~255区间内,以后出现类似的处理,目的都是一样的
  709. fTempBufforDisp=spTransData1[biHeight-1-y][x];
  710. fTempBufforDisp-=MinPixVal;
  711. fTempBufforDisp*=255;
  712. fTempBufforDisp/=Diff;
  713. cur= y*biAlign+3*x; //current pixel
  714. lpData[cur] = (unsigned char)fTempBufforDisp;
  715. lpData[cur+1]= (unsigned char)fTempBufforDisp;
  716. lpData[cur+2]= (unsigned char)fTempBufforDisp;
  717. }
  718. }
  719. SetModifiedFlag(TRUE);
  720. //显示图像
  721. UpdateAllViews(NULL);
  722. ::GlobalUnlock((HGLOBAL)GetHDIB());
  723. //删除临时的数据空间
  724. delete spOriginData;
  725. delete spTransData0;
  726. delete spTransData1;
  727. }
  728. void CMyDoc::OnWvltTransTrbl() 
  729. {
  730. // TODO: Add your command handler code here
  731. //读取数字图像的文件头,获取图像的属性参数
  732. LPSTR lpDIB;
  733. // 指向DIB象素指针
  734. LPSTR    lpDIBBits;
  735. // 锁定DIB
  736. lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)GetHDIB());
  737. // 找到DIB图像象素起始位置
  738. lpDIBBits = ::FindDIBBits(lpDIB);
  739. unsigned long biWidth =::DIBWidth(lpDIB);
  740. unsigned long biHeight = ::DIBHeight(lpDIB);
  741. unsigned long biAlign = (biWidth*3+3)/4 *4;
  742. unsigned long bmSize = biHeight * biAlign;
  743. unsigned char *lpData = (unsigned char*)lpDIBBits ;
  744. //图像矩阵坐标与像素数据
  745. int x,y,cur;
  746. unsigned char tempR, tempG, tempB;
  747. float fTempBufforDisp;
  748. short MaxPixVal,MinPixVal,Diff;
  749. short **spOriginData, **spTransData0, **spTransData1;
  750. //分配图像小波变换的数据内存空间
  751. spOriginData = new short* [biHeight];
  752. spTransData0 = new short* [biHeight];
  753. spTransData1 = new short* [biHeight];
  754. m_WvltCoeff = new short * [biHeight];
  755. for(int i = 0; i < biHeight; i ++)
  756. {
  757. spOriginData[i] = new short [biWidth];
  758. spTransData0[i] = new short [biWidth];
  759. spTransData1[i] = new short [biWidth];
  760. m_WvltCoeff[i] = new short [biWidth];
  761. }
  762. //创建图像小波类
  763. CWvltTrans *pTrans;
  764. //从设备的图像缓存中获取原始图像的数据
  765. for(y=0; y<(int)biHeight; y++)
  766. {
  767. for( x=0; x<(int)biWidth; x++)
  768. {
  769. cur = y*biAlign+3*x;
  770. tempB=lpData[cur];
  771. tempG=lpData[cur+1];
  772. tempR=lpData[cur+2];
  773. spOriginData[biHeight-1-y][x]=(short)(0.3*tempR+0.59*tempG+0.11*tempB);  //no problem
  774. }
  775. }
  776. //完成图像的三次小波变换
  777. pTrans->DWT_TriLayers(spOriginData,spTransData0,spTransData1,biHeight,biHeight/2,biWidth,biWidth/2,3,1.414);
  778. //允许图像复员操作标志
  779. m_bTribl = TRUE;
  780. m_bTribl = m_bTribl & ~m_bTwice & ~m_bOnce & ~m_bFilter;
  781. MaxPixVal=spTransData1[0][0];
  782. MinPixVal=spTransData1[0][0];
  783. //得到小波系数的极大值和极小值
  784. for( y=0; y<(int)biHeight; y++)
  785. {
  786. for( x=0; x<(int)biWidth; x++)
  787. {
  788. if(MaxPixVal<spTransData1[y][x])
  789. MaxPixVal=spTransData1[y][x];
  790. if(MinPixVal>spTransData1[y][x])
  791. MinPixVal=spTransData1[y][x];
  792. m_WvltCoeff[y][x] = spTransData1[y][x];
  793. }
  794. }
  795. //计算出小波系数的极值差
  796. Diff=MaxPixVal-MinPixVal;
  797. //将图像的小波数据处理后放入显示缓存中
  798. for(y=0; y<(int)biHeight; y++)
  799. {
  800. for(x=0; x<(int)biWidth; x++)
  801. {
  802. //因为小波变换后的小波系数有可能超过255甚至更多,那么就将
  803. //小波系数的范围映射到0~255区间内,以后出现类似的处理,目的都是一样的
  804. fTempBufforDisp=spTransData1[biHeight-1-y][x];
  805. fTempBufforDisp-=MinPixVal;
  806. fTempBufforDisp*=255;
  807. fTempBufforDisp/=(float)Diff;
  808. cur= y*biAlign+3*x; //current pixel
  809. lpData[cur] = (unsigned char)fTempBufforDisp;
  810. lpData[cur+1]= (unsigned char)fTempBufforDisp;
  811. lpData[cur+2]= (unsigned char)fTempBufforDisp;
  812. }
  813. }
  814. SetModifiedFlag(TRUE);
  815. //显示图像
  816. UpdateAllViews(NULL);
  817. ::GlobalUnlock((HGLOBAL)GetHDIB());
  818. //删除临时的数据空间
  819. delete spOriginData;
  820. delete spTransData0;
  821. delete spTransData1;
  822. }
  823. void CMyDoc::OnDiprocFusion() 
  824. {
  825. // TODO: Add your command handler code here
  826. //读取数字图像的文件头,获取图像的属性参数
  827. LPSTR lpDIB;
  828. // 指向DIB象素指针
  829. LPSTR    lpDIBBits;
  830. // 锁定DIB
  831. lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)GetHDIB());
  832. // 找到DIB图像象素起始位置
  833. lpDIBBits = ::FindDIBBits(lpDIB);
  834. unsigned long biWidth =::DIBWidth(lpDIB);
  835. unsigned long biHeight = ::DIBHeight(lpDIB);
  836. unsigned long biAlign = (biWidth*3+3)/4 *4;
  837. unsigned long bmSize = biHeight * biAlign;
  838. unsigned char *lpData = (unsigned char*)lpDIBBits ;
  839. //定义图像的内存数据空间指针
  840. short **pData, **pDataFusion;
  841. CString cstrFileName = m_strFileFusion;
  842. //图像矩阵的坐标与像素数据
  843. int x, y, cur;
  844. int tempR, tempG, tempB;
  845. //分配图像的数据空间
  846. pData = new short * [biHeight];
  847. pDataFusion = new short * [biHeight];
  848. for(int i = 0; i < biWidth; i ++)
  849. {
  850. pDataFusion[i] = new short [biWidth];
  851. pData[i] = new short [biWidth];
  852. }
  853. //从设备的显示缓存中获取原始图像的数据
  854. for(y = 0; y < (int) biHeight; y ++)
  855. {
  856. for(x = 0; x < (int) biWidth; x ++)
  857. {
  858. cur = y * biAlign + 3 * x;
  859. tempB = lpData[cur];
  860. tempG = lpData[cur + 1];
  861. tempR = lpData[cur + 2];
  862. pData[biHeight - 1 - y][x] = 0.3 * tempR + 0.59 * tempG + 0.11 * tempB;
  863. }
  864. }
  865. //释放设备占用的显示缓存
  866. m_hDIB = NULL;
  867. ::GlobalUnlock((HGLOBAL)GetHDIB());
  868. //打开另外一幅用于融合的图像文件
  869. MessageBoxA(NULL,_T("请在WvltDip\Fusion目录中打开另外一幅图像,进行图像融合"),_T("Message"),MB_ICONEXCLAMATION|MB_OK);
  870. while(!abs((int)strcmp(m_strFileFusion, cstrFileName)))
  871. {
  872. CFileDialog dlg( TRUE,NULL,NULL,
  873.                  OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
  874.                  _T("Bitmap (*.BMP)|*.BMP|"));
  875. if( dlg.DoModal()==IDOK )
  876. cstrFileName = dlg.GetPathName();
  877. //如果文件重名,提示重新打开文件
  878.     
  879. if(!abs((int)strcmp(m_strFileFusion, cstrFileName))) 
  880. MessageBoxA(NULL,_T("文件"+m_strFileFusion+"已打开,请打开该目录中另外一个文件"),_T("Message"),MB_ICONEXCLAMATION|MB_OK);
  881. else
  882. MessageBoxA(NULL,_T("用于图像融合的文件是:n"+m_strFileFusion+"n"+cstrFileName),_T("Message"),MB_ICONEXCLAMATION|MB_OK);
  883. }
  884. CFile file;
  885.     CFileException fe;
  886. if (!file.Open(cstrFileName, CFile::modeRead | CFile::shareDenyWrite, &fe))
  887.   {
  888.   // 失败
  889.   ReportSaveLoadException(cstrFileName, &fe,
  890.   FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
  891.   }
  892.  
  893.   // 更改光标形状
  894.   BeginWaitCursor();
  895.  
  896.   // 尝试调用ReadDIBFile()读取图像,读取位图数据,载入显示缓存中
  897.   TRY
  898.   {
  899.   m_hDIB = ::ReadDIBFile(file);
  900.   }
  901.   CATCH (CFileException, eLoad)
  902.   {
  903.   // 读取失败
  904.   file.Abort();
  905.  
  906.   // 恢复光标形状
  907.   EndWaitCursor();
  908.  
  909.   // 报告失败
  910.   ReportSaveLoadException(cstrFileName, eLoad,
  911.   FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
  912.  
  913.   // 设置DIB为空
  914.   m_hDIB = NULL;
  915.  
  916.   }
  917.   END_CATCH
  918.  
  919.   // 初始化DIB
  920.   InitDIBData();
  921.  
  922.   // 判断读取文件是否成功
  923.   if (m_hDIB == NULL)
  924.   {
  925.   // 失败,可能非BMP格式
  926.   CString strMsg;
  927.   strMsg = "读取图像时出错!可能是不支持该类型的图像文件!";
  928.  
  929.   // 提示出错
  930.   MessageBox(NULL, strMsg, "系统提示", MB_ICONINFORMATION | MB_OK);
  931.   
  932.   // 恢复光标形状
  933.   EndWaitCursor();
  934.   }
  935.  
  936.   // 初始化胀标记为FALSE
  937.   SetModifiedFlag(FALSE);
  938.  
  939.   //显示新打开的图像
  940.   UpdateAllViews(NULL);
  941.   
  942. // 锁定DIB
  943. lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)GetHDIB());
  944. // 找到DIB图像象素起始位置
  945. lpDIBBits = ::FindDIBBits(lpDIB);
  946. //读取另外一幅图像的数据
  947. unsigned char *lpImgData = (unsigned char*)lpDIBBits ;
  948. //从设备的显示缓存中获取原始图像的数据
  949. for(y = 0; y < biHeight; y ++)
  950. {
  951. for (x = 0; x < biWidth; x++)
  952. {
  953. cur = y * biAlign + 3 * x;
  954. tempB = lpImgData[cur];
  955. tempG = lpImgData[cur + 1];
  956. tempR = lpImgData[cur + 2];
  957. pDataFusion[biHeight - 1 - y][x] = 0.3 * tempR + 0.59 * tempG + 0.11 * tempB;
  958. }
  959. }
  960. //创建用于图像融合的Diproc类
  961. CDiproc *pDIP;
  962. pDIP->DIP_ImageFusion(pData, pDataFusion, biHeight, biWidth);
  963. //将图像数据放入显示缓存中
  964. for(y=0; y<(int)biHeight; y++)
  965. {
  966. for(x=0; x<(int)biWidth; x++)
  967. {
  968. cur= y*biAlign+3*x; //current pixel
  969. lpImgData[cur] = (unsigned char)pDataFusion[biHeight - 1- y][x];
  970. lpImgData[cur+1]= (unsigned char)pDataFusion[biHeight - 1 - y][x];
  971. lpImgData[cur+2]= (unsigned char)pDataFusion[biHeight - 1 - y][x];
  972. }
  973. }
  974. SetModifiedFlag(TRUE);
  975. //显示图像
  976. UpdateAllViews(NULL);
  977. ::GlobalUnlock((HGLOBAL)GetHDIB());
  978. //删除临时的数据内存空间
  979. delete pData;
  980. delete pDataFusion;
  981. }
  982. void CMyDoc::OnDiprocRever() 
  983. {
  984. // TODO: Add your command handler code here
  985. //读取数字图像的文件头,获取图像的属性参数
  986. LPSTR lpDIB;
  987. // 指向DIB象素指针
  988. LPSTR    lpDIBBits;
  989. // 锁定DIB
  990. lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)GetHDIB());
  991. // 找到DIB图像象素起始位置
  992. lpDIBBits = ::FindDIBBits(lpDIB);
  993. unsigned long biWidth =::DIBWidth(lpDIB);
  994. unsigned long biHeight = ::DIBHeight(lpDIB);
  995. unsigned long biAlign = (biWidth*3+3)/4 *4;
  996. unsigned long bmSize = biHeight * biAlign;
  997. unsigned char *lpData = (unsigned char*)lpDIBBits ;
  998. //图像矩阵的坐标
  999. int x,y,cur;
  1000. int tempR, tempG, tempB;
  1001. //图像数据与图像处理数据的存放空间
  1002. short **spOriginData, **spTransData0,**spTransData1;
  1003. spOriginData = new short* [biHeight];
  1004. spTransData0 = new short* [biHeight];
  1005. spTransData1 = new short* [biHeight];
  1006. //分配数据的内存空间
  1007. for(int i = 0; i < biHeight; i ++)
  1008. {
  1009. spOriginData[i] = new short [biWidth];
  1010. spTransData0[i] = new short [biWidth];
  1011. spTransData1[i] = new short [biWidth];
  1012. }
  1013. //创建图像小波变换类
  1014. CWvltTrans *pTrans;
  1015. //从设备缓存中获取原始图像数据
  1016. for(y=0; y<(int)biHeight; y++)
  1017. {
  1018. for( x=0; x<(int)biWidth; x++)
  1019. {
  1020. cur = y*biAlign+3*x;
  1021. tempB=lpData[cur];
  1022. tempG=lpData[cur+1];
  1023. tempR=lpData[cur+2];
  1024. spOriginData[biHeight-1-y][x]=(short)(0.3*tempR+0.59*tempG+0.11*tempB);  //no problem
  1025. }
  1026. }
  1027. //创建数字处理类
  1028. CDiproc *pDip;
  1029. //如果图像只经过一次小波变换,则进行相应的逆变换
  1030. if(m_bOnce)
  1031. { //完成一次图像小波变换
  1032.      pDip->DIP_WvltRevers(spOriginData, spTransData0, m_WvltCoeff,biHeight,biHeight/2,biWidth,biWidth/2,1,1.414);
  1033. m_bOnce = FALSE;
  1034. delete m_WvltCoeff;
  1035. }
  1036. //如果图像只经过两次小波变换,则进行相应的逆变换
  1037. else if(m_bTwice)
  1038. {
  1039. pDip->DIP_WvltRevers(spOriginData, spTransData0, m_WvltCoeff,biHeight ,biHeight/2,biWidth,biWidth/2,2,1.414);
  1040. m_bTwice = FALSE;
  1041. delete m_WvltCoeff;
  1042. }
  1043. //如果图像只经过三次小波变换,则进行相应的逆变换
  1044. else if(m_bTribl)
  1045. {
  1046. pDip->DIP_WvltRevers(spOriginData, spTransData0, m_WvltCoeff, biHeight, biHeight/2,biWidth,biWidth/2,3,1.414);
  1047. m_bTribl = FALSE;
  1048. delete m_WvltCoeff;
  1049. }
  1050. //判断是否有小波系数可以进行图像的复原
  1051. else if(m_bFilter)
  1052. {
  1053. MessageBoxA(NULL,_T("没有找到可用小波系数,或者是未做小波变换"),_T("Message"),MB_ICONEXCLAMATION|MB_OK);
  1054. m_bFilter = FALSE;
  1055. }
  1056. //将图像数据放入显示缓存中
  1057. for(y=0; y<(int)biHeight; y++)
  1058. {
  1059. for(x=0; x<(int)biWidth; x++)
  1060. {
  1061. cur= y*biAlign+3*x; //current pixel
  1062. lpData[cur] = (unsigned char)spOriginData[biHeight - 1- y][x];
  1063. lpData[cur+1]= (unsigned char)spOriginData[biHeight - 1 - y][x];
  1064. lpData[cur+2]= (unsigned char)spOriginData[biHeight - 1 - y][x];
  1065. }
  1066. }
  1067. SetModifiedFlag(TRUE);
  1068. //显示图像
  1069. UpdateAllViews(NULL);
  1070. ::GlobalUnlock((HGLOBAL)GetHDIB());
  1071. //删除临时的数据内存空间
  1072. delete spOriginData;
  1073. delete spTransData0;
  1074. //delete spTransData1;
  1075. }
  1076. void CMyDoc::OnFilterBlur() 
  1077. {
  1078. // TODO: Add your command handler code here
  1079. //读取数字图像的文件头,获取图像的属性参数
  1080. LPSTR lpDIB;
  1081. // 指向DIB象素指针
  1082. LPSTR    lpDIBBits;
  1083. // 锁定DIB
  1084. lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)GetHDIB());
  1085. // 找到DIB图像象素起始位置
  1086. lpDIBBits = ::FindDIBBits(lpDIB);
  1087. unsigned long biWidth =::DIBWidth(lpDIB);
  1088. unsigned long biHeight = ::DIBHeight(lpDIB);
  1089. unsigned long biAlign = (biWidth*3+3)/4 *4;
  1090. unsigned long bmSize = biHeight * biAlign;
  1091. unsigned char *lpData = (unsigned char*)lpDIBBits ;
  1092. //图像小波系数的低通滤波层数为3层
  1093. int MaxLayer = 3;
  1094. short **ImgData;
  1095. float fTempBufforDisp;
  1096. //图像矩阵坐标与图像数据
  1097. int tempR, tempG, tempB, x, y, cur;
  1098. //分配图像数据的内存空间
  1099. ImgData = new short * [biHeight];
  1100. for(int i = 0; i < biHeight; i ++)
  1101. {
  1102. ImgData[i] = new short [biWidth];
  1103. }
  1104. //获取显示缓存中的原始图像数据
  1105. for(y=0; y<(int)biHeight; y++)
  1106. {
  1107. for(x=0; x<(int)biWidth; x++)
  1108. {
  1109. cur = y*biAlign+3*x;
  1110. tempB=lpData[cur];
  1111. tempG=lpData[cur+1];
  1112. tempR=lpData[cur+2];
  1113. ImgData[biHeight-1-y][x]=(short)(0.3*tempR+0.59*tempG+0.11*tempB);  //no problem
  1114. }
  1115. }
  1116. //创建小波滤波器类
  1117. CWFilter Filter;
  1118. //小波低通滤波处理
  1119. Filter.LPass_Filter(ImgData, biHeight, biWidth, MaxLayer, 1);
  1120. //屏蔽图像复原操作标志
  1121. m_bFilter = TRUE;
  1122. //将处理后的图像数据放入显示缓存中
  1123. for(y=0; y<(int)biHeight; y++)
  1124. {
  1125. for(x=0; x<(int)biWidth; x++)
  1126. {
  1127. cur= y*biAlign+3*x; //当前像素的位置
  1128. lpData[cur] = (unsigned char)Filter.m_FilterData[biHeight - 1- y][x];
  1129. lpData[cur+1]= (unsigned char)Filter.m_FilterData[biHeight - 1 - y][x];
  1130. lpData[cur+2]= (unsigned char)Filter.m_FilterData[biHeight - 1 - y][x];
  1131. }
  1132. }
  1133. SetModifiedFlag(TRUE);
  1134. //显示图像
  1135. UpdateAllViews(NULL);
  1136. //删除临时的图像数据空间
  1137. ::GlobalUnlock((HGLOBAL)GetHDIB());
  1138. //删除临时的图像数据空间
  1139. delete ImgData;
  1140. }
  1141. void CMyDoc::OnFilterBlur2() 
  1142. {
  1143. // TODO: Add your command handler code here
  1144. //读取数字图像的文件头,获取图像的属性参数
  1145. LPSTR lpDIB;
  1146. // 指向DIB象素指针
  1147. LPSTR    lpDIBBits;
  1148. // 锁定DIB
  1149. lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)GetHDIB());
  1150. // 找到DIB图像象素起始位置
  1151. lpDIBBits = ::FindDIBBits(lpDIB);
  1152. unsigned long biWidth =::DIBWidth(lpDIB);
  1153. unsigned long biHeight = ::DIBHeight(lpDIB);
  1154. unsigned long biAlign = (biWidth*3+3)/4 *4;
  1155. unsigned long bmSize = biHeight * biAlign;
  1156. unsigned char *lpData = (unsigned char*)lpDIBBits ;
  1157. //图像小波系数的低通滤波层数为3层
  1158. int MaxLayer = 3;
  1159. short **ImgData;
  1160. float fTempBufforDisp;
  1161. //图像矩阵坐标与图像数据
  1162. int tempR, tempG, tempB, x, y, cur;
  1163. //分配图像数据的内存空间
  1164. ImgData = new short * [biHeight];
  1165. for(int i = 0; i < biHeight; i ++)
  1166. {
  1167. ImgData[i] = new short [biWidth];
  1168. }
  1169. //获取显示缓存中的原始图像数据
  1170. for(y=0; y<(int)biHeight; y++)
  1171. {
  1172. for(x=0; x<(int)biWidth; x++)
  1173. {
  1174. cur = y*biAlign+3*x;
  1175. tempB=lpData[cur];
  1176. tempG=lpData[cur+1];
  1177. tempR=lpData[cur+2];
  1178. ImgData[biHeight-1-y][x]=(short)(0.3*tempR+0.59*tempG+0.11*tempB);  //no problem
  1179. }
  1180. }
  1181. //创建小波滤波器类
  1182. CWFilter Filter;
  1183. //小波低通滤波处理
  1184. Filter.LPass_Filter(ImgData, biHeight, biWidth, MaxLayer, 2);
  1185. //屏蔽图像复原操作标志
  1186. m_bFilter = TRUE;
  1187. //将处理后的图像数据放入显示缓存中
  1188. for(y=0; y<(int)biHeight; y++)
  1189. {
  1190. for(x=0; x<(int)biWidth; x++)
  1191. {
  1192. cur= y*biAlign+3*x; //当前像素的位置
  1193. lpData[cur] = (unsigned char)Filter.m_FilterData[biHeight - 1- y][x];
  1194. lpData[cur+1]= (unsigned char)Filter.m_FilterData[biHeight - 1 - y][x];
  1195. lpData[cur+2]= (unsigned char)Filter.m_FilterData[biHeight - 1 - y][x];
  1196. }
  1197. }
  1198. SetModifiedFlag(TRUE);
  1199. //显示图像
  1200. UpdateAllViews(NULL);
  1201. //删除临时的图像数据空间
  1202. ::GlobalUnlock((HGLOBAL)GetHDIB());
  1203. delete ImgData;
  1204. }
  1205. void CMyDoc::OnFilterSharpness() 
  1206. {
  1207. // TODO: Add your command handler code here
  1208. //读取数字图像的文件头,获取图像的属性参数
  1209. LPSTR lpDIB;
  1210. // 指向DIB象素指针
  1211. LPSTR    lpDIBBits;
  1212. // 锁定DIB
  1213. lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)GetHDIB());
  1214. // 找到DIB图像象素起始位置
  1215. lpDIBBits = ::FindDIBBits(lpDIB);
  1216. unsigned long biWidth =::DIBWidth(lpDIB);
  1217. unsigned long biHeight = ::DIBHeight(lpDIB);
  1218. unsigned long biAlign = (biWidth*3+3)/4 *4;
  1219. unsigned long bmSize = biHeight * biAlign;
  1220. unsigned char *lpData = (unsigned char*)lpDIBBits ;
  1221. //图像小波系数的高通滤波层数为3层
  1222. int MaxLayer = 3;
  1223. short **ImgData;
  1224. float fTempBufforDisp;
  1225. //图像矩阵坐标与图像数据
  1226. int tempR, tempG, tempB, x, y, cur;
  1227. //分配图像数据的内存空间
  1228. ImgData = new short * [biHeight];
  1229. for(int i = 0; i < biHeight; i ++)
  1230. {
  1231. ImgData[i] = new short [biWidth];
  1232. }
  1233. //获取显示缓存中的原始图像数据
  1234. for(y=0; y<(int)biHeight; y++)
  1235. {
  1236. for(x=0; x<(int)biWidth; x++)
  1237. {
  1238. cur = y*biAlign+3*x;
  1239. tempB=lpData[cur];
  1240. tempG=lpData[cur+1];
  1241. tempR=lpData[cur+2];
  1242. ImgData[biHeight-1-y][x]=(short)(0.3*tempR+0.59*tempG+0.11*tempB);  //no problem
  1243. }
  1244. }
  1245. //创建小波滤波器类
  1246. CWFilter Filter;
  1247. //小波高通滤波处理
  1248. Filter.HPass_Filter(ImgData, biHeight, biWidth, MaxLayer);
  1249. //屏蔽图像复原操作标志
  1250. m_bFilter = TRUE;
  1251. //将处理后的图像数据放入显示缓存中
  1252. for(y=0; y<(int)biHeight; y++)
  1253. {
  1254. for(x=0; x<(int)biWidth; x++)
  1255. {
  1256. cur= y*biAlign+3*x; //当前像素的位置
  1257. lpData[cur] = (unsigned char)Filter.m_FilterData[biHeight - 1- y][x];
  1258. lpData[cur+1]= (unsigned char)Filter.m_FilterData[biHeight - 1 - y][x];
  1259. lpData[cur+2]= (unsigned char)Filter.m_FilterData[biHeight - 1 - y][x];
  1260. }
  1261. }
  1262. SetModifiedFlag(TRUE);
  1263. //显示图像
  1264. UpdateAllViews(NULL);
  1265. //删除临时的图像数据空间
  1266. ::GlobalUnlock((HGLOBAL)GetHDIB());
  1267. //删除临时的图像数据空间
  1268. delete ImgData;
  1269. }
  1270. void CMyDoc::OnFilterSharpness2() 
  1271. {
  1272. // TODO: Add your command handler code here
  1273. //读取数字图像的文件头,获取图像的属性参数
  1274. LPSTR lpDIB;
  1275. // 指向DIB象素指针
  1276. LPSTR    lpDIBBits;
  1277. // 锁定DIB
  1278. lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)GetHDIB());
  1279. // 找到DIB图像象素起始位置
  1280. lpDIBBits = ::FindDIBBits(lpDIB);
  1281. unsigned long biWidth =::DIBWidth(lpDIB);
  1282. unsigned long biHeight = ::DIBHeight(lpDIB);
  1283. unsigned long biAlign = (biWidth*3+3)/4 *4;
  1284. unsigned long bmSize = biHeight * biAlign;
  1285. unsigned char *lpData = (unsigned char*)lpDIBBits ;
  1286.     //图像小波系数的高通滤波层数为3层
  1287. int MaxLayer = 3;
  1288. short **ImgData;
  1289. float fTempBufforDisp;
  1290. //图像矩阵坐标与图像数据
  1291. int tempR, tempG, tempB, x, y, cur;
  1292. //分配图像数据的内存空间
  1293. ImgData = new short * [biHeight];
  1294. for(int i = 0; i < biHeight; i ++)
  1295. {
  1296. ImgData[i] = new short [biWidth];
  1297. }
  1298. //获取显示缓存中的原始图像数据
  1299. for(y=0; y<(int)biHeight; y++)
  1300. {
  1301. for(x=0; x<(int)biWidth; x++)
  1302. {
  1303. cur = y*biAlign+3*x;
  1304. tempB=lpData[cur];
  1305. tempG=lpData[cur+1];
  1306. tempR=lpData[cur+2];
  1307. ImgData[biHeight-1-y][x]=(short)(0.3*tempR+0.59*tempG+0.11*tempB);  //no problem
  1308. }
  1309. }
  1310. //创建小波滤波器类
  1311. CWFilter Filter;
  1312. //小波高通滤波处理
  1313. Filter.HPass_Filter2(ImgData, biHeight, biWidth, MaxLayer);
  1314. //屏蔽图像复原操作标志
  1315. m_bFilter = TRUE;
  1316. //将处理后的图像数据放入显示缓存中
  1317. for(y=0; y<(int)biHeight; y++)
  1318. {
  1319. for(x=0; x<(int)biWidth; x++)
  1320. {
  1321. cur= y*biAlign+3*x; //当前像素的位置
  1322. lpData[cur] = (unsigned char)Filter.m_FilterData[biHeight - 1- y][x];
  1323. lpData[cur+1]= (unsigned char)Filter.m_FilterData[biHeight - 1 - y][x];
  1324. lpData[cur+2]= (unsigned char)Filter.m_FilterData[biHeight - 1 - y][x];
  1325. }
  1326. }
  1327. SetModifiedFlag(TRUE);
  1328. //显示图像
  1329. UpdateAllViews(NULL);
  1330. //删除临时的图像数据空间
  1331. ::GlobalUnlock((HGLOBAL)GetHDIB());
  1332. delete ImgData;
  1333. }
  1334. void CMyDoc::Openanother()
  1335. {CString cstrFileName = m_strFileFusion;
  1336. //释放设备占用的显示缓存
  1337. ::GlobalUnlock((HGLOBAL)GetHDIB());
  1338. //打开另外一幅用于融合的图像文件
  1339. MessageBoxA(NULL,_T("请在WvltDip\Fusion目录中打开另外一幅图像,进行图像融合"),_T("Message"),MB_ICONEXCLAMATION|MB_OK);
  1340. while(!abs((int)strcmp(m_strFileFusion, cstrFileName)))
  1341. {
  1342. CFileDialog dlg( TRUE,NULL,NULL,
  1343.                  OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
  1344.                  _T("Bitmap (*.BMP)|*.BMP|"));
  1345. if( dlg.DoModal()==IDOK )
  1346. cstrFileName = dlg.GetPathName();
  1347. //如果文件重名,提示重新打开文件
  1348.     
  1349. if(!abs((int)strcmp(m_strFileFusion, cstrFileName))) 
  1350. MessageBoxA(NULL,_T("文件"+m_strFileFusion+"已打开,请打开该目录中另外一个文件"),_T("Message"),MB_ICONEXCLAMATION|MB_OK);
  1351. else
  1352. MessageBoxA(NULL,_T("用于图像融合的文件是:n"+m_strFileFusion+"n"+cstrFileName),_T("Message"),MB_ICONEXCLAMATION|MB_OK);
  1353. }
  1354. CFile file;
  1355.     CFileException fe;
  1356. if (!file.Open(cstrFileName, CFile::modeRead | CFile::shareDenyWrite, &fe))
  1357.   {
  1358.   // 失败
  1359.   ReportSaveLoadException(cstrFileName, &fe,
  1360.   FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
  1361.   }
  1362.  
  1363.   // 更改光标形状
  1364.   BeginWaitCursor();
  1365.  
  1366.   // 尝试调用ReadDIBFile()读取图像,读取位图数据,载入显示缓存中
  1367.   TRY
  1368.   {
  1369.   m_hMulDIB = ::ReadDIBFile(file);
  1370.   }
  1371.   CATCH (CFileException, eLoad)
  1372.   {
  1373.   // 读取失败
  1374.   file.Abort();
  1375.  
  1376.   // 恢复光标形状
  1377.   EndWaitCursor();
  1378.  
  1379.   // 报告失败
  1380.         ReportSaveLoadException(cstrFileName, eLoad,
  1381.   FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
  1382.  
  1383.   // 设置DIB为空
  1384.   m_hMulDIB = NULL;
  1385.  
  1386.   }
  1387.   END_CATCH
  1388.  
  1389.   // 初始化DIB
  1390.   InitDIBData();
  1391.  
  1392.   // 判断读取文件是否成功
  1393.   if (m_hMulDIB == NULL)
  1394.   {
  1395.   // 失败,可能非BMP格式
  1396.   CString strMsg;
  1397.   strMsg = "读取图像时出错!可能是不支持该类型的图像文件!";
  1398.  
  1399.   // 提示出错
  1400.   MessageBox(NULL, strMsg, "系统提示", MB_ICONINFORMATION | MB_OK);
  1401.   
  1402.   // 恢复光标形状
  1403.   EndWaitCursor();
  1404.   }
  1405. }