

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、用VC+實(shí)現(xiàn)直方圖均衡化一試驗(yàn)?zāi)康兀海?)、學(xué)會了解 C+ 是使用;(2)、學(xué)會用 C+ 解決圖像處理問題(3)、學(xué)會使用 C+ 實(shí)現(xiàn)直方圖均衡化 二、實(shí)驗(yàn)內(nèi)容:用 VC+ 實(shí)現(xiàn)直方圖均衡化 ;三、實(shí)驗(yàn)步驟:1 首先建立一個(gè)工程。打開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ù)覽】兩個(gè)選項(xiàng),之后的全部選擇默認(rèn),單擊 finish ,出現(xiàn)一個(gè)“ New Project Information ”窗 口,單擊【ok】。一個(gè)簡單的工程框架就建好了。2、現(xiàn)在我們正式開始在新建工程 Zhifangtujunhenghua 中進(jìn)行編程實(shí)現(xiàn) bmp 位圖的直方圖均 衡化。點(diǎn)擊左邊框中的【ResourceView】框找到【Menu】點(diǎn)開,雙擊 Menu 下的圖標(biāo),在右 面的顯示框中創(chuàng)建兩個(gè)菜單:打開ID:ID_FILE_OPEN直方圖均衡化ID: ID_ZHIFANGTU顯示原圖ID:IDM_YUANTU3、給
3、這兩個(gè)菜單建立類向?qū)АT谟疫叺拇翱谥杏覔簟按蜷_”,選擇“建立類向?qū)А?,然后在打開的對話框中操作, “Class name選擇CZhifangtujunhenghuaView ” Object IDs 中選 擇“ ID_FILE_OPEN ”Message中選擇“ COMMAND ”,點(diǎn)擊“ Add Function ” 鍵就會在Member fun ctio ns 中如下圖 1 顯示,然后點(diǎn)擊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。點(diǎn)擊“Edit Code
5、在自動生 成的“OnYuantu”函數(shù)中編寫代碼:Void CZhifangtujunhenghuaView:OnYuantu()/ TODO: Add your command handler code here m_Dib.LoadFile(m_fileName);Invalidate();4、同理, 操作 “直方圖均衡化” 選擇“ CZhifangtujunhenghuaView ”。點(diǎn)擊 “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)建一個(gè)處理位圖的類CDib ,且 CDib 類是由 CObject 類派生出來的。點(diǎn)擊工程菜單欄中的插入【in sert】宀【insert classic類類型選Generic Class”,宀類名稱填CDib ” 宀【ok】。可以看見工程窗口的 Class View 中多了一個(gè) CDib 類;點(diǎn)開 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;/ 定義了一個(gè)文件頭結(jié)構(gòu)體的對象BITMAPINFOHEADER * m_pBitmapInfoHeader;/ 定義了一個(gè)指向信息頭的結(jié)構(gòu)體指針 BITMAPINFO *m_pBitmapInfo;/ 定義了一個(gè)結(jié)構(gòu)體指針, BITMAPINFO 是一個(gè)包含有 信息頭,
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), 此時(shí) 的bfType 值DWORD fileLength = dibFile.G
15、etLength();/ 讀取文件的大小,你可以試試跟蹤此值 來看看它是否和你要打開的圖片大小一致size = fileLength - sizeof(BITMAPFILEHEADER);/ 文件大小 -文件頭結(jié)構(gòu)體的大小,此時(shí)你會發(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)色板部分。因?yàn)?pDib 原本指向信息頭, 偏移 40 字節(jié)(信息頭結(jié)構(gòu)體的大小) 之 后便到了調(diào)色板部分,因此用加法來實(shí)現(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);/ 用每個(gè)調(diào)色板結(jié) 構(gòu)體大小乘以顏色數(shù)量,得到調(diào)色板的大小m_pData = pDib + m_pBitmapInfoHeader-biSize+ colorTableSize;/ 這時(shí)候代表把m_pData 指針指向?qū)嶋H圖像數(shù)據(jù)了if (m_pRGB = (R
18、GBQUAD *)m_pData) / 如果調(diào)色板指針位置和實(shí)際圖像位置 指針指向位置相同,那就代表沒有調(diào)色板m_pRGB = NULL;/ 指針賦予空m_pBitmapInfoHeader-biSizeImage = GetSize();/ 賦予實(shí)際位圖的大小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; /灰度計(jì)數(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)計(jì)計(jì)數(shù)huidutemp+;/計(jì)算灰度分布密度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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 足球賽事的跨文化營銷策略研究
- 音樂產(chǎn)業(yè)發(fā)展趨勢及聽眾消費(fèi)行為分析
- 2025年新能源項(xiàng)目投資合同
- 大學(xué)生就業(yè)準(zhǔn)備中的自主學(xué)習(xí)能力培養(yǎng)研究
- 學(xué)生創(chuàng)業(yè)項(xiàng)目的市場調(diào)研與分析方法
- 2025年農(nóng)產(chǎn)品采購合同模板
- 2025年運(yùn)動品牌代理商加盟合同范本
- 大數(shù)據(jù)驅(qū)動的保險(xiǎn)業(yè)務(wù)創(chuàng)新研究
- 2025華泰保險(xiǎn)代理合同
- 學(xué)生社團(tuán)活動與學(xué)校課程的互動關(guān)系
- 肺栓塞治療及護(hù)理
- 2025年陜西工商職業(yè)學(xué)院單招職業(yè)傾向性測試題庫含答案
- 2025年鐘山職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性考試題庫必考題
- 綜合與實(shí)踐 低碳生活 教學(xué)設(shè)計(jì) 2024-2025學(xué)年人教版七年級數(shù)學(xué)下冊
- 肺結(jié)核預(yù)防健康知識講座
- 2025年南京信息職業(yè)技術(shù)學(xué)院單招職業(yè)傾向性測試題庫參考答案
- 2025年浙江名校協(xié)作體高三語文2月聯(lián)考作文題目解析及范文:“向往”的“苦處”與“樂處”
- 新高考背景下混合式教學(xué)模式在物理教學(xué)中的實(shí)踐與研究
- 醫(yī)院感染的感染風(fēng)險(xiǎn)評估
- 火災(zāi)事故應(yīng)急處置與救援
- 智慧信息化平臺系統(tǒng)開發(fā)項(xiàng)目數(shù)據(jù)遷移方案
評論
0/150
提交評論