(完整word版)用VC++實現(xiàn)直方圖均衡化_第1頁
(完整word版)用VC++實現(xiàn)直方圖均衡化_第2頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、用VC+實現(xiàn)直方圖均衡化一試驗?zāi)康兀海?)、學(xué)會了解 C+ 是使用;(2)、學(xué)會用 C+ 解決圖像處理問題(3)、學(xué)會使用 C+ 實現(xiàn)直方圖均衡化 二、實驗內(nèi)容:用 VC+ 實現(xiàn)直方圖均衡化 ;三、實驗步驟:1 首先建立一個工程。打開VC+6.0,單擊 文件【files 新建【new】f工程【projects】在打開的 projects 下選擇 MFC App Wizard exe宀在 project name 下輸入自己的工程名例如(Zhifangtujunhenghua )宀單擊【ok】宀在打開的對話框中選擇基于單文檔【single document】T在第四步“ MFC App Wiza

2、rd step 4 of 6 ”面板中刪掉【隱藏工具欄】和【打印和打印預(yù)覽】兩個選項,之后的全部選擇默認(rèn),單擊 finish ,出現(xiàn)一個“ New Project Information ”窗 口,單擊【ok】。一個簡單的工程框架就建好了。2、現(xiàn)在我們正式開始在新建工程 Zhifangtujunhenghua 中進(jìn)行編程實現(xiàn) bmp 位圖的直方圖均 衡化。點擊左邊框中的【ResourceView】框找到【Menu】點開,雙擊 Menu 下的圖標(biāo),在右 面的顯示框中創(chuàng)建兩個菜單:打開ID:ID_FILE_OPEN直方圖均衡化ID: ID_ZHIFANGTU顯示原圖ID:IDM_YUANTU3、給

3、這兩個菜單建立類向?qū)?。在右邊的窗口中右擊“打開”,選擇“建立類向?qū)А?,然后在打開的對話框中操作, “Class name選擇CZhifangtujunhenghuaView ” Object IDs 中選 擇“ ID_FILE_OPEN ”Message中選擇“ COMMAND ”,點擊“ Add Function ” 鍵就會在Member fun ctio ns 中如下圖 1 顯示,然后點擊Edit Code ”,在自動生成的 On FileOpen 函數(shù)中編寫代碼:void CZhifangtujunhenghuaView:OnFileOpen()/ TODO: Add your com

4、mand handler code hereCFileDialog fileDlg(true); fileDlg.m_ofn.lpstrTitle= 圖片打開對話框 ;fileDlg.m_ofn.lpstrFilter=BMP Files(*.bmp)0*.bmp00; if(IDOK=fileDlg.DoModal()m_fileName.Format (%s,fileDlg.GetPathName();m_Dib.LoadFile(m_fileName);Invalidate();同理,操作 顯示原圖:Class name選擇 CShowpictureVie w。點擊“Edit Code

5、在自動生 成的“OnYuantu”函數(shù)中編寫代碼:Void CZhifangtujunhenghuaView:OnYuantu()/ TODO: Add your command handler code here m_Dib.LoadFile(m_fileName);Invalidate();4、同理, 操作 “直方圖均衡化” 選擇“ CZhifangtujunhenghuaView ”。點擊 “Edit Code ”,在自動生成的“ OnZhifangtu ”函數(shù)中編寫代碼:void CZhifangtujunhenghuaView:OnZhifangtu()/ TODO: Add you

6、r command handler code hereif (m_Dib.IsValid()m_Dib.fenbujunhenghua();Invalidate(); 5、創(chuàng)建一個處理位圖的類CDib ,且 CDib 類是由 CObject 類派生出來的。點擊工程菜單欄中的插入【in sert】宀【insert classic類類型選Generic Class”,宀類名稱填CDib ” 宀【ok】??梢钥匆姽こ檀翱诘?Class View 中多了一個 CDib 類;點開 CDib 類的頭文件,輸入以下代碼, 注意變量可以直接復(fù)制, 聲明的函數(shù)不要直接復(fù)制 (在 CDib 類右擊選擇 “Add

7、memberfunction ”,輸入函數(shù)類型和函數(shù)名) 。class CDib: public CObjectpublic:RGBQUAD * m_pRGB;BYTE * m_pData;UINT m_numberOfColors;bool m_valid;BITMAPFILEHEADER bitmapFileHeader;/ 定義了一個文件頭結(jié)構(gòu)體的對象BITMAPINFOHEADER * m_pBitmapInfoHeader;/ 定義了一個指向信息頭的結(jié)構(gòu)體指針 BITMAPINFO *m_pBitmapInfo;/ 定義了一個結(jié)構(gòu)體指針, BITMAPINFO 是一個包含有 信息頭,

8、和調(diào)色板的BYTE * pDib;DWORD size;char m_fileName256;public:int dwWidthBytes;int byBitCount;void fenbujunhenghua();void zhifangtu(float *tongji);void SaveFile(const CString filename);void LoadFile(const char * dibFileName);WORD PaletteSize(LPBYTE lpDIB);WORD DIBNumColors(LPBYTE lpDIB); BITMAPINFO * GetInf

9、o();BYTE * GetData();RGBQUAD * GetRGB();UINT GetWidth();UINT GetHeight();UINT GetNumberOfColors();DWORD GetSize(); bool IsValid(); char * GetFileName(); CDib(); virtual CDib();6、對 CDib 類中的函數(shù)定義,找到 Dib.cpp 輸入代碼: CDib:CDib()m_numberOfColors=0; size = 0; m_valid=0; byBitCount=0; dwWidthBytes=0;CDib:CDib

10、()GlobalFreePtr(m_pBitmapInfo);char * CDib:GetFileName()return m_fileName;bool CDib:IsValid()return m_valid;DWORD CDib:GetSize()if (m_pBitmapInfoHeader-biSizeImage!=0)return m_pBitmapInfoHeader-biSizeImage;elseDWORD height = (DWORD)GetHeight();DWORD width = (DWORD)GetWidth(); return height * width;U

11、INT CDib:GetNumberOfColors()int numberOfColors;if (m_pBitmapInfoHeader-biClrUsed=0)&(m_pBitmapInfoHeader-biBitCountbiBitCount)case 1: numberOfColors = 2;break;case 4: numberOfColors = 16;break; case 8: numberOfColors = 256;break;else/若不是上面的情況,則直接返回顏色數(shù)numberOfColors=(int)m_pBitmapInfoHeader-biClr

12、Used;return numberOfColors;UINT CDib:GetHeight()return (UINT)m_pBitmapInfoHeader-biHeight;UINT CDib:GetWidth()return (UINT)m_pBitmapInfoHeader-biWidth;RGBQUAD * CDib:GetRGB()return m_pRGB;256 色BYTE * CDib:GetData()return m_pData;BITMAPINFO * CDib:GetInfo()return m_pBitmapInfo;WORD CDib:DIBNumColors(

13、LPBYTE lpDIB)WORD wBitCount;/DIB bit countwBitCount = (LPBITMAPCOREHEADER)lpDIB)-bcBitCount; switch(wBitCount)case 1: return 2;case 4: return 16;case 8: return 256;default:return 0;WORD CDib:PaletteSize(LPBYTE lpDIB)return(DIBNumColors(lpDIB)*sizeof(RGBTRIPLE);void CDib:LoadFile(const char *dibFileN

14、ame)strcpy(m_fileName,dibFileName);/ 將路徑名稱拷貝到 m_fileName 之中 CFiledibFile(m_fileName,CFile:modeRead);/ 創(chuàng)建 CFile 類對象,只讀方式 dibFile.Read(void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER);/ 讀取文件頭的 內(nèi)容if(bitmapFileHeader.bfType = 0 x4d42)/ 判斷是否為 bmp 格式, 單步調(diào)試你會發(fā)現(xiàn), 此時 的bfType 值DWORD fileLength = dibFile.G

15、etLength();/ 讀取文件的大小,你可以試試跟蹤此值 來看看它是否和你要打開的圖片大小一致size = fileLength - sizeof(BITMAPFILEHEADER);/ 文件大小 -文件頭結(jié)構(gòu)體的大小,此時你會發(fā)現(xiàn),文件頭的大小的確是 14 字節(jié)pDib = (BYTE *)GlobalAllocPtr(GMEM_MOVEABLE,size);/ 詳見說明( 2)dibFile.Read(void *)pDib,size);/ 通過讀取,把讀出的數(shù)據(jù)存入剛才分配的內(nèi)存之中dibFile.Close();/ 文件操作完成之后關(guān)閉文件m_pBitmapInfo=(BITMAP

16、INFO *)pDib;/BITMAPINFO 結(jié)構(gòu)體指針指向該內(nèi)存m_pBitmapInfoHeader = (BITMAPINFOHEADER *)pDib;/ 信息頭指向該內(nèi)存 m_pRGB = (RGBQUAD*)(pDib + m_pBitmapInfoHeader-biSize);/ 調(diào)色板指針指向 該內(nèi)存的調(diào)色板部分。因為 pDib 原本指向信息頭, 偏移 40 字節(jié)(信息頭結(jié)構(gòu)體的大小) 之 后便到了調(diào)色板部分,因此用加法來實現(xiàn)指針的偏移int m_numberOfColors = GetNumberOfColors();/ 調(diào)用 GetNumberOfColors 函數(shù)來得

17、到顏色數(shù)if(m_pBitmapInfoHeader-biClrUsed = 0)m_pBitmapInfoHeader-biClrUsed=m_numberOfColors;/ 把 顏 色 數(shù) 賦 予 biClrUsed之中DWORD colorTableSize=m_numberOfColors * sizeof(RGBQUAD);/ 用每個調(diào)色板結(jié) 構(gòu)體大小乘以顏色數(shù)量,得到調(diào)色板的大小m_pData = pDib + m_pBitmapInfoHeader-biSize+ colorTableSize;/ 這時候代表把m_pData 指針指向?qū)嶋H圖像數(shù)據(jù)了if (m_pRGB = (R

18、GBQUAD *)m_pData) / 如果調(diào)色板指針位置和實際圖像位置 指針指向位置相同,那就代表沒有調(diào)色板m_pRGB = NULL;/ 指針賦予空m_pBitmapInfoHeader-biSizeImage = GetSize();/ 賦予實際位圖的大小m_valid = true;else/如果不是 bmp 位圖則失敗m_valid = false;AfxMessageBox(This isnt a bitmap file!);void CDib:SaveFile(const CString filename)strcpy(m_fileName,filename);CFile dib

19、File(m_fileName,CFile:modeCreate|CFile:modeWrite);dibFile.Write(void *)&bitmapFileHeader,sizeof(BITMAPFILEHEADER); dibFile.Write(void*)pDib,size);dibFile.Close();void CDib:zhifangtu(float *tongji)int i;int j;int huidu256; /灰度計數(shù)int wide,height;/原圖長、寬/變量初始化memset(huidu,0,sizeof(huidu);wide=this-Ge

20、tWidth();height=this-GetHeight();LPBYTE temp1=new BYTEwide*height;/新圖像緩沖區(qū)/復(fù)制原圖像到緩存 圖像memcpy(temp1,m_pData,wide*height);for(i=0;iheight;i+)for(j=0;jwide;j+)unsigned char temp=temp1wide*i+j;/灰度統(tǒng)計計數(shù)huidutemp+;/計算灰度分布密度for(i=0;iGetData();zhifangtu(fps_R);for(i=0;i256;i+)if(i=0)temp_r0=fps_R0;elsetemp_ri=temp_ri-1+fps_Ri;nNs_Ri=(int)(2

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論