下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、用VC+實現(xiàn)直方圖均衡化一試驗目地:(1)、學會了解 C+ 是使用;(2)、學會用 C+ 解決圖像處理問題(3)、學會使用 C+ 實現(xiàn)直方圖均衡化 二、實驗內容:用 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 ”面板中刪掉【隱藏工具欄】和【打印和打印預覽】兩個選項,之后的全部選擇默認,單擊 finish ,出現(xiàn)一個“ New Project Information ”窗 口,單擊【ok】。一個簡單的工程框架就建好了。2、現(xiàn)在我們正式開始在新建工程 Zhifangtujunhenghua 中進行編程實現(xiàn) bmp 位圖的直方圖均 衡化。點擊左邊框中的【ResourceView】框找到【Menu】點開,雙擊 Menu 下的圖標,在右 面的顯示框中創(chuàng)建兩個菜單:打開ID:ID_FILE_OPEN直方圖均衡化ID: ID_ZHIFANGTU顯示原圖ID:IDM_YUANTU3、給
3、這兩個菜單建立類向導。在右邊的窗口中右擊“打開”,選擇“建立類向導” ,然后在打開的對話框中操作, “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 類的頭文件,輸入以下代碼, 注意變量可以直接復制, 聲明的函數(shù)不要直接復制 (在 CDib 類右擊選擇 “Add
7、memberfunction ”,輸入函數(shù)類型和函數(shù)名) 。class CDib: public CObjectpublic:RGBQUAD * m_pRGB;BYTE * m_pData;UINT m_numberOfColors;bool m_valid;BITMAPFILEHEADER bitmapFileHeader;/ 定義了一個文件頭結構體的對象BITMAPINFOHEADER * m_pBitmapInfoHeader;/ 定義了一個指向信息頭的結構體指針 BITMAPINFO *m_pBitmapInfo;/ 定義了一個結構體指針, BITMAPINFO 是一個包含有 信息頭,
8、和調色板的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);/ 讀取文件頭的 內容if(bitmapFileHeader.bfType = 0 x4d42)/ 判斷是否為 bmp 格式, 單步調試你會發(fā)現(xiàn), 此時 的bfType 值DWORD fileLength = dibFile.G
15、etLength();/ 讀取文件的大小,你可以試試跟蹤此值 來看看它是否和你要打開的圖片大小一致size = fileLength - sizeof(BITMAPFILEHEADER);/ 文件大小 -文件頭結構體的大小,此時你會發(fā)現(xiàn),文件頭的大小的確是 14 字節(jié)pDib = (BYTE *)GlobalAllocPtr(GMEM_MOVEABLE,size);/ 詳見說明( 2)dibFile.Read(void *)pDib,size);/ 通過讀取,把讀出的數(shù)據(jù)存入剛才分配的內存之中dibFile.Close();/ 文件操作完成之后關閉文件m_pBitmapInfo=(BITMAP
16、INFO *)pDib;/BITMAPINFO 結構體指針指向該內存m_pBitmapInfoHeader = (BITMAPINFOHEADER *)pDib;/ 信息頭指向該內存 m_pRGB = (RGBQUAD*)(pDib + m_pBitmapInfoHeader-biSize);/ 調色板指針指向 該內存的調色板部分。因為 pDib 原本指向信息頭, 偏移 40 字節(jié)(信息頭結構體的大小) 之 后便到了調色板部分,因此用加法來實現(xiàn)指針的偏移int m_numberOfColors = GetNumberOfColors();/ 調用 GetNumberOfColors 函數(shù)來得
17、到顏色數(shù)if(m_pBitmapInfoHeader-biClrUsed = 0)m_pBitmapInfoHeader-biClrUsed=m_numberOfColors;/ 把 顏 色 數(shù) 賦 予 biClrUsed之中DWORD colorTableSize=m_numberOfColors * sizeof(RGBQUAD);/ 用每個調色板結 構體大小乘以顏色數(shù)量,得到調色板的大小m_pData = pDib + m_pBitmapInfoHeader-biSize+ colorTableSize;/ 這時候代表把m_pData 指針指向實際圖像數(shù)據(jù)了if (m_pRGB = (R
18、GBQUAD *)m_pData) / 如果調色板指針位置和實際圖像位置 指針指向位置相同,那就代表沒有調色板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ū)/復制原圖像到緩存 圖像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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年紹興市中等專業(yè)學校合同制工作人員(融媒體工作技術員)招聘備考題庫及完整答案詳解一套
- 昆明市官渡區(qū)云南大學附屬中學星耀學校2026年校園招聘備考題庫完整答案詳解
- 2025年湘科研究院招聘專業(yè)技術人員5名備考題庫完整參考答案詳解
- 盤活資產經(jīng)驗交流材料范文
- 新疆維吾爾自治區(qū)氣象局2026年度事業(yè)單位公開招聘應屆畢業(yè)生備考題庫(第二批第1號)及一套參考答案詳解
- 2025年湖南省中西醫(yī)結合醫(yī)院湖南省中醫(yī)藥研究院附屬醫(yī)院高層次人才公開招聘13人備考題庫及一套完整答案詳解
- 2025年大連市皮膚病醫(yī)院招聘合同制工作人員36人備考題庫及答案詳解1套
- 2025年中國科學院東北地理與農業(yè)生態(tài)研究所學術期刊中心工作人員招聘備考題庫及答案詳解一套
- 中國信息通信研究院2026屆校園招聘80人備考題庫完整參考答案詳解
- 總量聯(lián)合行業(yè)《“十五五”規(guī)劃建議》解讀:“十五五”規(guī)劃引領資本市場譜寫創(chuàng)新升級新機遇
- 2025至2030中國船用防凍劑行業(yè)發(fā)展趨勢分析與未來投資戰(zhàn)略咨詢研究報告
- 實施“十五五”規(guī)劃的發(fā)展思路
- 東航心理測試題及答案
- 2025年度交通運輸安全生產費用使用計劃
- 自由職業(yè)者合作協(xié)議樣本
- 《四川省信息化項目費用測算標準》
- 教育數(shù)字化應用案例
- QB/T 2660-2024 化妝水(正式版)
- DCS集散控制系統(tǒng)課件
- JJG 443-2023燃油加油機(試行)
- 國家開放大學-傳感器與測試技術實驗報告(實驗成績)
評論
0/150
提交評論