版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年中國城市公共汽車客運行業(yè)發(fā)展前景及投資規(guī)劃研究報告版
- 2024-2030年中國地毯行業(yè)競爭格局及未來投資趨勢分析報告
- 2024-2030年中國國際貨代行業(yè)未來發(fā)展趨勢及投資風(fēng)險分析報告
- 2024年度物聯(lián)網(wǎng)(IoT)設(shè)備控制系統(tǒng)軟件開發(fā)合同技術(shù)集成與擴(kuò)展2篇
- 茂名職業(yè)技術(shù)學(xué)院《國學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年深圳子女撫養(yǎng)權(quán)協(xié)議書樣本3篇
- 中國日報2019年9月25日
- 馬鞍山職業(yè)技術(shù)學(xué)院《美術(shù)基礎(chǔ)與欣賞》2023-2024學(xué)年第一學(xué)期期末試卷
- 呂梁學(xué)院《信息安全綜合》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年度醫(yī)院護(hù)工工作環(huán)境與職業(yè)健康保護(hù)協(xié)議下載3篇
- 2024年木屑貿(mào)易協(xié)議3篇
- 【MOOC】信息安全-復(fù)旦大學(xué) 中國大學(xué)慕課MOOC答案
- “希臘羅馬古典文化”歷史教學(xué)課件
- 泛光照明施工方案
- 附屬醫(yī)院物業(yè)保潔服務(wù)方案及報價
- 中國慢性阻塞性肺疾病基層診療指南(2024年)解讀
- 【MOOC】農(nóng)產(chǎn)品貿(mào)易-福建農(nóng)林大學(xué) 中國大學(xué)慕課MOOC答案
- 大米營銷策劃方案
- 智能制造數(shù)字化孿生模型構(gòu)建合同
- 體育賽事安全生產(chǎn)保障方案
- 安全生產(chǎn)責(zé)任制落實培訓(xùn)
評論
0/150
提交評論