




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、圖像處理的開運(yùn)算與閉運(yùn)算0.前言腐蝕和膨脹是依據(jù)數(shù)學(xué)形態(tài)學(xué)集合論方法發(fā)展起來的圖像處理方法,起源于巖相對巖石結(jié)構(gòu) 的定量描述工作,在數(shù)字圖像處理和機(jī)器視覺領(lǐng)域中得到了廣泛的應(yīng)用,形成了一種獨(dú)特的 數(shù)字圖像分析方法和理論。數(shù)學(xué)形態(tài)學(xué)是圖像處理和模式識領(lǐng)域的新方法,其基本思想是: 用具有一定形態(tài)的結(jié)構(gòu)元素去量度和提取圖像中的對應(yīng)形狀,以達(dá)到圖像分析和識別的目的。 優(yōu)勢有以下幾點(diǎn):有效濾除噪聲,保留圖像中原有信息,算法易于用并行處理方法有效實(shí)現(xiàn), 基于數(shù)學(xué)形態(tài)學(xué)的邊緣信息提取處理優(yōu)于基于微分運(yùn)算的邊緣提取算法,提取的邊緣比較平 滑,提取的圖像骨架也比較連續(xù),斷點(diǎn)少腐蝕:是一種消除邊界點(diǎn),使邊界向內(nèi)部
2、收縮的過程??梢杂脕硐∏覠o意義的物體。膨脹:是將與物體接觸的所有背景點(diǎn)合并到該物體中,使邊界向外部擴(kuò)張的過程。可以用來 填補(bǔ)物體中的空洞。開運(yùn)算:先腐蝕后膨脹的過程開運(yùn)算。用來消除小物體、在纖細(xì)點(diǎn)處分離物體、平滑較大物 體的邊界的同時(shí)并不明顯改變其面積。開運(yùn)算通常是在需要去除小顆粒噪聲,以及斷開目標(biāo) 物之間粘連時(shí)使用。其主要作用與腐蝕相似,與腐蝕操作相比,具有可以基本保持目標(biāo)原有 大小不變的優(yōu)點(diǎn)。閉運(yùn)算:先膨脹后腐蝕的過程稱為閉運(yùn)算。用來填充物體內(nèi)細(xì)小空洞、連接鄰近物體、平滑 其邊界的同時(shí)并不明顯改變其面積。原因:雖然腐蝕處理可以將粘連的目標(biāo)物進(jìn)行分離,膨脹處理可以將斷開的目標(biāo)物進(jìn)行接續(xù),
3、但同時(shí)都存在一個(gè)問題,就是經(jīng)過腐蝕處理后,目標(biāo)物的面積小于原有面積,而經(jīng)過 膨脹處理之后,目標(biāo)物的面積大于原有面積。開、閉運(yùn)算就是為了解決這個(gè)問題而被提出的。 數(shù)學(xué)形態(tài)學(xué)中二值圖像的形態(tài)變換是一種針對集合的處理過程。其形態(tài)算子的實(shí)質(zhì)是表達(dá)物 體或形狀的集合與結(jié)構(gòu)元素間的相互作用,結(jié)構(gòu)元素的形狀就決定了這種運(yùn)算所提取的信號 的形狀信息。形態(tài)學(xué)圖像處理是在圖像中移動一個(gè)結(jié)構(gòu)元素,然后將結(jié)構(gòu)元素與下面的二值 圖像進(jìn)行交、并等集合運(yùn)算。1 .系統(tǒng)分析系統(tǒng)功能需求(1)位圖圖像文件的導(dǎo)入、轉(zhuǎn)換、顯示、保存、關(guān)閉模塊在該功能模塊中提供:位圖圖像文件的導(dǎo)入功能;把32位或8位位圖文件轉(zhuǎn)換為24 位位圖文件的
4、功能;顯示經(jīng)過導(dǎo)入和轉(zhuǎn)換后的24位位圖文件的功能;圖像保存(提供保存 為8位和24位位圖的功能)和關(guān)閉圖像的功能。這一模塊主要對圖像進(jìn)行后續(xù)處理及其操 作的基礎(chǔ)。(2)基于膨脹和腐蝕的圖像處理模塊該模塊主要的功能是用膨脹和腐蝕算法,得到對應(yīng)的參數(shù)圖像(圖像增強(qiáng)), 結(jié)合膨脹和腐蝕,做出開閉運(yùn)算的圖像(3)圖像控制模塊該模塊主要功能是實(shí)現(xiàn)對原始圖像另存;分形圖像、分割結(jié)果圖像保存的操作 場景分析和開發(fā)場景 名稱參與 執(zhí)行者前置 條件事件流后置條件1、打開系統(tǒng)主界面2、選擇文件菜單中的“打開”命令,選擇文件1、圖像導(dǎo)入2、在圖像顯示圖像系統(tǒng)3、對圖像類型進(jìn)行合法性檢查,合則4,否則2界面上顯示(三
5、信息用戶已4、清除上一次數(shù)據(jù)組圖像及其直導(dǎo)入打開5、把圖像轉(zhuǎn)換為24位位圖文件6、提取圖像像素?cái)?shù)據(jù),并保存三份7、將用戶所要處理的圖像導(dǎo)入系統(tǒng)中方圖)3、用戶可以作其他的處理基于用戶系統(tǒng)1、選擇“圖像處理”菜單1、得到處理后腐蝕已打2、根據(jù)用戶需要選擇需要的處理類型圖像(增強(qiáng));和膨開圖3、系統(tǒng)對圖像作相應(yīng)的處理2、在圖像顯示脹圖像已4、將處理后圖像保存并顯示給用戶(中間組和右邊界面上顯示(中像的 開閉 處理導(dǎo)入組:包括圖像、直方圖)間組和右邊 組);3、用戶 可以作其他的 處理處理用戶系統(tǒng)1、選擇“文件”菜單1、得到分形結(jié)結(jié)果已打2、選擇“另保存”菜單,路徑+文件名果圖像;2、用圖像 保存
6、場景開,圖 像已 導(dǎo)入, 并作 相應(yīng) 的處 理3、將分形結(jié)果圖像保存。戶可以作其他 的處理抽象用例對應(yīng)活動圖用例圖根據(jù)功能分析和用例分析,我們得到“圖像處理開閉運(yùn)算”的用例圖。(1)圖像信息的導(dǎo)入用例圖(2)基于腐蝕膨脹圖像處理用例圖(3)原始圖像另存用例(4)處理結(jié)果圖像保存用例(5)總的用例圖用戶退出系統(tǒng)匕原始圖像另存圖像導(dǎo)入圖像開閉處理CD 處理后圖像保存建立系統(tǒng)總體架構(gòu)及領(lǐng)域概念模型系統(tǒng)總體架構(gòu)系統(tǒng)總體架構(gòu)用于描述整個(gè)軟件的體系結(jié)構(gòu),包括對各個(gè)功能模塊的劃分、功能定義、軟件的層次結(jié)構(gòu)等。根據(jù)前面建立的系統(tǒng)用例圖,我們選用分層架構(gòu)模式。下面我們用包圖來描界面層各種操作界面I圖像基本操 作
7、模塊圖像開閉處理模塊業(yè)務(wù)邏慢處理層數(shù)據(jù)服務(wù)層、述總體結(jié)構(gòu)。系統(tǒng)領(lǐng)域概念模型領(lǐng)域概念模型用于描述用戶需求和相關(guān)業(yè)務(wù)領(lǐng)域中全局性的概念及其相互之間的關(guān)系。 它在系統(tǒng)總體架構(gòu)的基礎(chǔ)上,進(jìn)一步從概念上幫助開發(fā)人員理清系統(tǒng)結(jié)構(gòu)及系統(tǒng)各組成部分 之間的相互作用。領(lǐng)域概念模型使用UML的類圖來表示,但不需要標(biāo)出每個(gè)類的屬性和方 法,只需根據(jù)以上所作的場景開發(fā)和建立的用例,提取關(guān)鍵的概念并以類的形式表示出來即 可。領(lǐng)域概念模型可以理解為類圖的草圖本系統(tǒng)擬采用MFC支持的文檔視圖結(jié)構(gòu)中的單文檔界面(SDI)結(jié)構(gòu)。大部分Windows應(yīng)用程序都相當(dāng)復(fù)雜。典型的情況是,它們均包含業(yè)務(wù)邏輯處理層和 界面層(程序框架)
8、,在MFC中對應(yīng)于兩個(gè)代表性的類:“文檔”和“視圖”。MFC將文檔 和視圖有機(jī)地組成一個(gè)整體的框架,提供給程序編寫者,這就是我們通常所說的文檔/視圖 結(jié)構(gòu)。通常,當(dāng)創(chuàng)建一個(gè)SDI應(yīng)用程序時(shí),如果不考慮About對話框窗口類的話,SDI應(yīng)用程 序?qū)?chuàng)建 4 個(gè)特定的類,即 CC*APP 類、CMainFrame 類、CC*DOC 類、CC*VIEW 類,每個(gè)類在程序運(yùn)行時(shí)都有自己的特殊用途。其中:(1) CC*APP類:創(chuàng)建所有其它組件。該類接收所有的事件消息,然后將這些消息傳遞給CMainFrame類、CC*DOC類、CC*VIEW。在編程中幾乎 不需要修改和添加代碼。(2) CMainFra
9、me類:它包括菜單、工具欄、滾動條、狀態(tài)欄、和所有其他與該 框架相關(guān)聯(lián)的顯示對象。在編程中幾乎不需要修改和添加代碼。(3) CC*DOC類:它是關(guān)于文檔存儲的類。可以在這個(gè)類中創(chuàng)建數(shù)據(jù)結(jié)構(gòu),并利用這些數(shù)據(jù)結(jié)構(gòu)存儲和處理構(gòu)成文檔的數(shù)據(jù)。(注意:一般通過在該類中 定義一個(gè)用戶類的對象作為該類的成員變量,以此來創(chuàng)建數(shù)據(jù)結(jié)構(gòu),在程序 中通過該成員變量來調(diào)用用戶類的各種成員函數(shù)【方法】)。該類從用戶自己定義的類或CC*VIEW類得到輸入并將要顯示的信息輸出到CC*VIEW 類。該類還負(fù)責(zé)存盤和從文件中檢索文檔數(shù)據(jù)的工作。(4) CC*VIEW類:它用于向用戶顯示可視化文檔,并將用戶輸入的信息傳送 到CC
10、*DOC類,然后從CC*DOC類接收顯示信息。在該類中所需要的 大部分代碼工作包括繪制用戶的文檔、處理用戶的輸入、調(diào)用用戶自定義類 中的方法(通過CC*DOC類的指針)。CC*DOC類有幾個(gè)子類,包括 CEditView、CFormView、CHtmlView、CListView、CRichEditView、CScrollView、 CTreeView等,但大部分子類和CC*VIEW類的屬性和使用方法區(qū)別不大。在系統(tǒng)需求分析階段,通過建立系統(tǒng)總體結(jié)構(gòu)、領(lǐng)域概念模型,已經(jīng)確定了系 統(tǒng)的基本結(jié)構(gòu)。在系統(tǒng)設(shè)計(jì)階段主要內(nèi)容有:設(shè)計(jì)用例實(shí)現(xiàn)方案、數(shù)據(jù)設(shè)計(jì)、用戶界面設(shè)計(jì), 建立組件圖、配置圖、生成系統(tǒng)代碼
11、框架等幾部分工作提取邊界類、實(shí)體類、控制類(1)提取邊界類邊界類主要描述目標(biāo)軟件系統(tǒng)和外部環(huán)境的交互,復(fù)雜界面控制、外部接口和環(huán)境隔 離,處理目標(biāo)軟件系統(tǒng)與用戶、其他軟件系統(tǒng)及操作系統(tǒng)和其他設(shè)備之間的交互。根據(jù)已建 立系統(tǒng)總體結(jié)構(gòu)、領(lǐng)域概念模型,可以提取以下邊界類:1)CMainFrame 類、CC*VIEW 類、CC*APP 類、CC*DOC 類中的涉及數(shù)據(jù)輸入 以及界面變化的方法(成員函數(shù))2)CDlg*類3)CImg類中的涉及數(shù)據(jù)輸入以及顯示的方法(成員函數(shù))(2)提取實(shí)體類實(shí)體類表示目標(biāo)軟件系統(tǒng)中具有持久意義的信息項(xiàng)和操作,它向目標(biāo)軟件系統(tǒng)的其他 部分提供讀取信息項(xiàng)內(nèi)容的必要接口,不涉
12、及業(yè)務(wù)邏輯處理。根據(jù)已建立系統(tǒng)總體結(jié)構(gòu)、領(lǐng) 域概念模型,可以提取以下邊界類:1)CC*DOC類中的涉及數(shù)據(jù)保存的方法(成員函數(shù))2)CImg類中的涉及數(shù)據(jù)保存的方法(成員函數(shù))(3)提取控制類和輔助類控制類作為完成用例任務(wù)的責(zé)任承擔(dān)者,主要用于協(xié)調(diào)、控制其他類共同完成用例規(guī)定的功能或行為。它一般不處理具體的任務(wù)細(xì)節(jié),但它應(yīng)該能夠分解任務(wù)并將子任務(wù)分派給 適當(dāng)?shù)妮o助類,同時(shí)在輔助類之間進(jìn)行消息傳遞和協(xié)調(diào)。MFC中采用消息映射機(jī)制實(shí)現(xiàn)處 理來自操作面板接收的各種用戶指令,并將這些命令分派給適當(dāng)?shù)妮o助類。輔助類用于輔助控制類完成用例規(guī)定的功能或行為??商崛∫韵碌妮o助類:1)CImg類中的用于完成用例
13、規(guī)定的功能或行為的各種方法(成員函數(shù))2)CC*VIEW類、CC*DOC類、CDlg*類中的用于完成用例規(guī)定的功能或行為 的各種方法(成員函數(shù))或消息響應(yīng)函數(shù)。基于所提取的邊界類、實(shí)體類和構(gòu)建的控制類和輔助類,我們將在已提取的各種類的 基礎(chǔ)上,構(gòu)造系統(tǒng)的交互圖、協(xié)作圖等動態(tài)視圖,為設(shè)計(jì)生成系統(tǒng)類圖做準(zhǔn)備。通過建立系統(tǒng)的順序圖和協(xié)作圖-構(gòu)造交互圖順序圖和協(xié)作圖是反映用戶和系統(tǒng)動態(tài)交互的兩種視圖。順序圖按時(shí)間順序描述系統(tǒng) 元素之間的交互,而協(xié)作圖則按照時(shí)間和空間順序描述系統(tǒng)元素(包括系統(tǒng)用戶)之間的交 互和它們之間的動態(tài)關(guān)系。二者都是表示對象間的交互作用,前者強(qiáng)調(diào)時(shí)間順序,但沒有明 確的表達(dá)對象間
14、的關(guān)系;后者描述對象之間的關(guān)系,但時(shí)間順序必須從序號獲得。順序圖和 協(xié)作圖都是來自UML模型的相同信息,語義上是等價(jià)的,二者可以相互轉(zhuǎn)換而不丟失任何 信息。實(shí)際使用中,常用時(shí)序圖,即在順序圖的基礎(chǔ)上,加入表示時(shí)間順序的序號。(1)圖像導(dǎo)入時(shí)序圖:CMainFrame:CC*DOCm clsImg : CImg:CC*VIEWUser1.啟動1. CImg:CImg()2.“打開”3. OnOpenDocument()4. CImg:Initial()5. CImg:Clean()6. CImg:F8to24()7. CImg:F32to24()8. 復(fù)制三份圖像9. OnDraw()10. C
15、Img:Show()12.顯示圖像及宜方圖(2)開閉運(yùn)算計(jì)算時(shí)序圖11. CImg:DrawIntensity()(3)原始圖像另存時(shí)序圖類圖的生成類圖(Class Diagram)是在系統(tǒng)的領(lǐng)域概念模型基礎(chǔ)上進(jìn)一步添加對象的屬性和方法生成的,它描述類、接口、協(xié)作、以及它們之間的關(guān)系,是系統(tǒng)設(shè)計(jì)的核心部分。類圖是系統(tǒng) 靜態(tài)視圖的一部分,主要用于描述軟件系統(tǒng)的靜態(tài)結(jié)構(gòu),主要支持系統(tǒng)的功能需求,也即系 統(tǒng)要提供給最終用戶的服務(wù)。類圖也是面向?qū)ο笙到y(tǒng)建模中最常用的圖,是定義其他圖的基 礎(chǔ)。在類圖基礎(chǔ)上,我們可以定義組件圖、配置圖,為代碼生成做好準(zhǔn)備。在系統(tǒng)實(shí)現(xiàn)部分,表述,加入!類名: CImgImg
16、.h 和 Img.cpppublic:void Close();void Open();void Dilate();void GrayDilate(BYTE *pData);void Erosion();void GrayErosion(BYTE *pData);void Sort(int *pBuf, int l, int r);void MidFilter(int nWidth, int nHeight);void GrayErosion(int D);void Save8(LPCTSTR lpszPathName);void Save24(LPCTSTR lpszPathName);vo
17、id Save(LPCTSTR lpszPathName, int nType);void DrawIntensity(CDC *pDC, BYTE *lpSrc,血 nType);void Show(CDC *pDC, int x=0, int y=0, char *pStr=NULL);void F24to8(const BYTE *pSrc, BYTE *pDest);void F32to24(BYTE *lpBit);void F8To24(BYTE *lpBit);BOOL Initial(LPCTSTR lpszPathName);void Clean();CImageProces
18、s();virtual -CImageProcess();private:BYTE *m_lpSrcBit;BYTE *m_lpModifyBit1;BYTE *m_lpModifyBit2;圖像像素?cái)?shù)據(jù)(原始圖像,左邊圖像)處理后的圖像像素?cái)?shù)據(jù)(中間圖像)處理后的圖像像素?cái)?shù)據(jù)(右邊圖像)BITMAPINFO *m_lpBmif;圖像信息頭文件char *m_sImgPath;圖像的路徑int m_nWidth;圖像寬度int m_nHeight;圖像高度BOOL m_bGray;int m_nLineByte;/圖像每行占的字節(jié)數(shù)(24位圖像)int m_nLineByte8;/圖像每行占的
19、字節(jié)數(shù)(8位圖像)int m_nImgByteSize;圖像的所占的字節(jié)大小BYTE *m_lpSrcBit8;/8位位圖數(shù)據(jù)BYTE *m_lpModifyBit8;/8位位圖數(shù)據(jù)總體框架和界面設(shè)計(jì)人機(jī)界面也稱為用戶界面,它是交互式應(yīng)用軟件系統(tǒng)的門面。(1)用戶打開系統(tǒng)主界面-系統(tǒng)功能的外部模型運(yùn)行可執(zhí)行程序后,首先進(jìn)入系統(tǒng)的主界面。界面要求簡單,符合用戶習(xí)慣如 Untitled - Image文件此能看看業(yè)群助的圖蟋遁口能日甚甯噌|哥|(2)用戶導(dǎo)入圖像界面文件名mr查我范圍紅):匚卓面皿3西 c a9回二三2溺三望5總rRniszT文件翹j g . 而不177石FIM G_2014060
20、4.G&5 34E,jp gKanLan JPEG 能8OCYE2QD&Da3S_8ca 2 6993 5 c3dd 3 5.f *M"kan SMP若告293/打開蟲)取消(3)基于腐蝕膨脹的開閉圖像處理界面329312200腐蝕.292882020822585開運(yùn)算口onn2U2UB23263'1 1 I ' H I if1 i nri ieinnri Rri i mi inn ,圖像像素?cái)?shù)據(jù)(原始圖像,左邊圖像)處理后的圖像像素?cái)?shù)據(jù)(中間圖像)(處理后為分形處理后的圖像像素?cái)?shù)據(jù)(右邊圖像)(處理后為分割數(shù)據(jù)存儲設(shè)計(jì)設(shè)計(jì)數(shù)據(jù)存儲的目的是將目標(biāo)軟件系
21、統(tǒng)中依賴于系統(tǒng)運(yùn)行環(huán)境的數(shù)據(jù)存取部分與其他 部分相分離。在本軟件中,需要將處理后的圖像保存到指定位置、指定格式、指定文件名。3.系統(tǒng)設(shè)計(jì)3.1 建立工程(1)New-Projects-Mfc Appwizard-工程名(2)Single Document(3)CScrollView.Finish.3.2 建立用戶類CImg(1)New Class.1)右擊“工程名”2)雙擊 C*Doc 類,添加頭文件 #include "ImageProcess.h"(2)添加成員變量private:BYTE *m_lpSrcBit;BYTE *m_lpModifyBit1;圖像)BYTE
22、 *m_lpModifyBit2;圖像)BITMAPINFO *m_lpBmif; / 圖像信息頭文件char *m_sImgPath;int m_nWidth;int m_nHeight;int m_nLineByte;int m_nLineByte8;int m_nImgByteSize;int m_nMse;圖像的路徑圖像寬度圖像高度圖像每行占的字節(jié)數(shù)(24位圖像)圖像每行占的字節(jié)數(shù)(8位圖像)圖像的所占的字節(jié)大小圖像方差(計(jì)算圖像直方圖時(shí)使用)BOOL m_bGray;(3)依次添加成員函數(shù)并完成代碼1)CImg:CImgeProcess() 構(gòu)造函數(shù):用于對成員變量進(jìn)行初始化;m_l
23、pSrcBit = NULL;m_lpBmif = NULL;m_lpModifyBit1 = NULL;m_lpModifyBit2 = NULL;m_nLineByte =1;m_nLineByte8 =1;m_nHeight = 1;m_nWidth = 1;m_nImgByteSize = 1;m_sImgPath = NULL;m_nMse = 0;m_pD = NULL;m_pa = NULL;m_pe = NULL;m_Rmax = 0;m_Rmax2 = 0;m_lpSrcBit8 = NULL;m_lpModifyBit8 = NULL;m mes = m_sCodeTime
24、 =""2)CImageProcess: CImageProcess () 析構(gòu)函數(shù);用于釋放內(nèi)存,避免內(nèi)存泄露! Clean();3)void CImageProcess:Clean()實(shí)際的釋放內(nèi)存函數(shù)if ( m_lpSrcBit != NULL)(delete m_lpSrcBit;m_lpSrcBit = NULL;)if ( m_lpModifyBit1 != NULL)(delete m_lpModifyBit1;m_lpModifyBit1 = NULL;if ( m_lpModifyBit2 != NULL) (delete m_lpModifyBit2;
25、m_lpModifyBit2 = NULL; ) if ( m_lpBmif != NULL) (delete m_lpBmif;m_lpBmif = NULL;)if ( m_sImgPath != NULL) (delete m_sImgPath; m_sImgPath = NULL;)if ( m_pD != NULL)(delete m_pD;m_pD = NULL;) if ( m_pa != NULL) (delete m_pa;m_pa = NULL; )if ( m_pe != NULL) (delete m_pe;m_pe = NULL; ) if ( m_lpSrcBit8
26、 != NULL) (delete m_lpSrcBit8;m_lpSrcBit8 = NULL; ) if ( m_lpModifyBit8 != NULL) (delete m_lpModifyBit8; m_lpModifyBit8 = NULL;)打開圖像及其初始化工作4) BOOL Initial(LPCTSTR lpszPathName);初始化函數(shù)功能:進(jìn)行一系列的初始化操作,初始化位圖的基本數(shù)據(jù),如長、寬,信息頭等。/Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx
27、Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx /BOOL CImageProcess:Initial(LPCTSTR IpszPathName) (讀取圖像文件數(shù)據(jù)CFile file(lpszPathName, CFile:modeRead); 使用 MSDN 講解DWORD len = file.GetLength();BYTE *pTemp = new BYTElen;if ( (file.ReadHuge(pTemp, len) != len) (AfxMessag
28、eBox("文件讀取失敗!");delete pTemp;return FALSE;)if ( ( (BITMAPFILEHEADER *)pTemp )->bfType != *(WORD *)"BM")(AfxMessageBoxC'目前只支持BMP格式!)delete pTemp;return FALSE;)清除上一次數(shù)據(jù)Clean();取得文件頭指針BITMAPFILEHEADER *lpbmfh = (BITMAPFILEHEADER *)pTemp;取得信息頭指針BITMAPINFO *lpBMheader = (BITMAPI
29、NFO *)( lpbmfh + 1 );取得像素指針BYTE *lpBit = (BYTE *)lpbmfh+lpbmfh->bfOffBits;/初始化圖像信息int nBitNum = lpBMheader->bmiHeader.biBitCount;m_nWidth = lpBMheader->bmiHeader.biWidth;m_nHeight = lpBMheader->bmiHeader.biHeight;m_nLineByte = (m_nWidth*3*8+31)/32*4;m_nLineByte8 = (m_nWidth*8+31)/32*4;m_
30、nImgByteSize = m_nLineByte*m_nHeight;為像素?cái)?shù)據(jù)申請存儲空間m_lpSrcBit = new BYTEm_nHeight*m_nLineByte;m_lpSrcBit8 = new BYTEm_nLineByte8*m_nLineByte;m_lpModifyBit8 = new BYTEm_nLineByte8*m_nLineByte;/顏色數(shù)轉(zhuǎn)換 if ( nBitNum = 8)(F8To24(lpBit);)else if ( nBitNum = 32 )F32to24(lpBit);)else if (nBitNum = 24) (memcpy(m
31、_lpSrcBit, IpBit, m_nHeight*m_nLineByte); else (AfxMessageBox("不支持的 BMP 格式!)delete pTemp;Clean();return FALSE;保存圖像文件的路徑m_sImgPath = new charMAX_PATH;strcpy(m_sImgPath, lpszPathName);/把信息頭該為24位,8, 32位統(tǒng)一按24位處理lpBMheader->bmiHeader.biBitCount = 24;m_lpBmif = new BITMAPINFO;memcpy(m_lpBmif, lpBM
32、header, sizeof(BITMAPINFO);delete pTemp;m_lpModifyBit1 = new BYTEm_nHeight*m_nLineByte;memcpy(m_lpModifyBit1, m_lpSrcBit, m_nHeight*m_nLineByte);m_lpModifyBit2 = new BYTEm_nHeight*m_nLineByte;memcpy(m_lpModifyBit2, m_lpSrcBit, m_nHeight*m_nLineByte);F24to8(m_lpSrcBit, m_lpSrcBit8);return TRUE;5)/8位灰
33、度圖像轉(zhuǎn)24位void CImageProcess:F8To24(BYTE *lpBit) (int nLineByte = (8*m_nWidth+31)/32*4;for (int i=0; i<m_nHeight; i+) (for (int j=0; j<m_nWidth; j+)(BYTE *pTemp = m_lpSrcBit + i*m_nLineByte +j*3;* pTemp = *(lpBit + i*nLineByte + j);* (pTemp+1) = *pTemp;* (pTemp+2) = *pTemp;6)/32位灰度圖像轉(zhuǎn)24位void CIma
34、geProcess:F32to24(BYTE *lpBit) (int nLineByte = m_nWidth*4;for (int i=0; i<m_nHeight; i+) (for (int j=0; j<m_nWidth; j+)(BYTE *pTemp = m_lpSrcBit + i*m_nLineByte +j*3;BYTE *pTemp2 = IpBit + i*nLineByte + j*4;* pTemp = *pTemp2;* (pTemp+1) = *(pTemp2+1);* (pTemp+2) = *(pTemp2+2);)7) 畫直方圖void CIm
35、ageProcess:DrawIntensity(CDC *pDC, BYTE *lpSrc, int nType) (if ( m_lpSrcBit = NULL II IpSrc = NULL)(return;)int anCount256;for (int k=0; k<256; k+)(anCountk = 0;)統(tǒng)計(jì)直方圖for (int i=0; i<m_nHeight; i+) (for (int j=0; j<m_nWidth; j+)(BYTE *pTemp = lpSrc + i*m_nLineByte +j*3; anCount*pTemp+;)/字符串
36、CString str;/最大計(jì)數(shù)LONG lMaxCount = 0;/計(jì)算最大計(jì)數(shù)值for (i = 0; i <= 255; i +)(/判斷是否大于當(dāng)前最大值if (anCounti > IMaxCount) (/更新最大值IMaxCount = anCounti;)pDC->Rectangle(10+310*nType, m_nHeight+20, 310+310*nType, m_nHeight+350 );/創(chuàng)建畫筆對象CPen* pPenRed = new CPen;/紅色畫筆pPenRed->CreatePen(PS_SOLID,1,RGB(255,0
37、,0);/創(chuàng)建畫筆對象CPen* pPenBlue = new CPen;/藍(lán)色畫筆pPenBlue->CreatePen(PS_SOLID,1,RGB(0,0, 255);/創(chuàng)建畫筆對象CPen* pPenGreen = new CPen;/綠色畫筆pPenGreen->CreatePen(PS_DOT,1,RGB(0,255,0);/選中當(dāng)前紅色畫筆,并保存以前的畫筆CGdiObject* pOldPen = pDC->SelectObject(pPenRed);/繪制坐標(biāo)軸pDC->MoveTo(20+310*nType, m_nHeight+30);/垂直軸pD
38、C->LineTo(20+310*nType, m_nHeight+320);/水平軸pDC->LineTo(300+310*nType, m_nHeight+320)/繪制丫軸箭頭pDC->MoveTo(15+310*nType, m_nHeight+40);pDC->LineTo(20+310*nType, m_nHeight+30);pDC->LineTo(25+310*nType, m_nHeight+40);/繪制X軸箭頭pDC->MoveTo(290+310*nType, m_nHeight+315);pDC->LineTo(300+310
39、*nType, m_nHeight+320);pDC->LineTo(290+310*nType, m_nHeight+325);/寫X軸刻度值for (k=0; k<251; k+=50)(str.Format("%d", k);pDC->TextOut(12+310*nType+k, m_nHeight+330, str);)/繪制X軸刻度for (i = 0; i < 256; i += 5) (if (i & 1) = 0)(/ 10的倍數(shù)pDC->MoveTo(i+20+310*nType, m_nHeight+320);pD
40、C->LineTo(i+20+310*nType, m_nHeight+326);)else (/ 10的倍數(shù) pDC->MoveTo(i+20+310*nType, m_nHeight+320);pDC->LineTo(i+20+310*nType, m_nHeight+323);)if ( i%50 = 0)(pDC->MoveTo(i+20+310*nType, m_nHeight+320);pDC->LineTo(i+20+310*nType, m_nHeight+329);)/輸出最大計(jì)數(shù)值pDC->MoveTo(20+310*nType, m_n
41、Height+45);pDC->LineTo(25+310*nType, m_nHeight+45);str.Format("%d", lMaxCount);pDC->TextOut(22+310*nType, m_nHeight+50, str);/更改成藍(lán)色畫筆pDC->SelectObject(pPenBlue);/判斷是否有計(jì)數(shù)if (lMaxCount > 0)(/繪制直方圖 for (i = 0; i <= 255; i +) (pDC->MoveTo(i+20+310*nType, m_nHeight+320);pDC-&g
42、t;LineTo(i+20+310*nType, m_nHeight+320 - (int) (anCounti * 260 / lMaxCount);)/恢復(fù)以前的畫筆pDC->SelectObject(pOldPen);/刪除新的畫筆delete pPenRed;delete pPenBlue;delete pPenGreen;) 1 /顯示函數(shù)功能:顯示原圖像和處理后的圖像/Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx
43、Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx /void CImageProcess:Show(CDC *pDC, int x, int y, char *pStr) (if (m_lpSrcBit = NULL)(return;)if (m_lpSrcBit != NULL)(顯示位圖:SetDIBitsToDevice(pDC->m_hDC,10,10, m_nWidth, m_nHeight, 0, 0, 0, m_nHeight, m_lpSrcBit, m_lpBmif, DIB_RGB_COLORS);
44、 畫直方圖 DrawIntensity(pDC, m_lpSrcBit, 0);)if ( m_lpModifyBit1 != NULL)( :SetDIBitsToDevice(pDC->m_hDC, 20+m_nWidth, 10, m_nWidth, m_nHeight, 0, 0, 0, m_nHeight, m_lpModifyBit1, m_lpBmif,DIB_RGB_COLORS);DrawIntensity(pDC, m_lpModifyBit1, 1);if ( m_lpModifyBit2 != NULL)(:SetDIBitsToDevice(pDC->m_
45、hDC, 30+2*m_nWidth, 10, m_nWidth, m_nHeight, 0, 0, 0, m_nHeight, m_lpModifyBit2, m_lpBmif,DIB_RGB_COLORS);DrawIntensity(pDC, m_lpModifyBit2, 2);)if ( pStr != NULL) (pDC->TextOut(x, y, pStr);)pDC->TextOut(m_nWidth*3/2, m_nHeight+11, m_mes);pDC->TextOut(m_nWidth*3/2, m_nHeight+25, m_sCodeTime
46、); )9) 保存處理后的圖像void CImageProcess:Save(LPCTSTR lpszPathName, int nType) (/* if ( m_lpModifyBit1 = NULL)(AfxMessageBox("圖像還沒有處理過不需要保存) return ;)*/根據(jù)選擇的文件類型來保存switch(nType) case 1:Save24(lpszPathName);break;case 2:Save8(lpszPathName);break;default:/MessageBox("未知的文件類型!)break;)10) void CImage
47、Process:Save24(LPCTSTR IpszPathName) (構(gòu)造24位文件頭并保存數(shù)據(jù)CFile file(lpszPathName, CFile:modeCreate | CFile:modeWrite);BITMAPFILEHEADER bmheader;bmheader.bfSize = sizeof(BITMAPFILEHEADER);bmheader.bfType = *(WORD *)"BM"bmheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO);bmheader.bf
48、Reserved1 = 0;bmheader.bfReserved2 = 0;file.Write( (const void *)&bmheader, sizeof(BITMAPFILEHEADER);file.Write( (const void *)m_lpBmif, sizeof(BITMAPINFO);file.WriteHuge( (const void *)m_lpModifyBit1, m_nHeight*m_nLineByte); file.Close();)void CImg:Save8(LPCTSTR lpszPathName)(構(gòu)造8位文件頭BITMAPFILEH
49、EADER bmfd;bmfd.bfSize = sizeof(BITMAPFILEHEADER);bmfd.bfType = *(WORD *)"BM"bmfd.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER) + 256*sizeof(RGBQUAD);bmfd.bfReserved1 = 0;bmfd.bfReserved2 = 0;BITMAPINFOHEADER bmif = m_lpBmif->bmiHeader;構(gòu)造信息頭int nWidth = bmif.biWidth;int
50、nHeight = bmif.biHeight;int nLineBytes = (nWidth*8+31)/32*4;int cbImage = nLineBytes*nHeight;bmif.biBitCount = 8;bmif.biSizeImage = cbImage;BYTE *lp8Bit = new BYTE cbImage ;memset(lp8Bit , 255, cbImage);BYTE *pTemp = NULL;把24位轉(zhuǎn)化為8位for (int i=0; i<nHeight; i+) (for (int j=0; j<nWidth; j+) (pTem
51、p = m_lpModifyBit1 + i*m_nLineByte + j*3; *(lp8Bit + i*nLineBytes + j) = *pTemp;)構(gòu)造灰度調(diào)色板RGBQUAD *pPalette = new RGBQUAD256;for (int k=0; k<256; k+) (pPalettek.rgbBlue = k;pPalettek.rgbGreen = k;pPalettek.rgbRed = k;pPalettek.rgbReserved = 0;)/寫數(shù)據(jù)TRY(CFile file(lpszPathName, CFile:modeCreate | CFi
52、le:modeWrite); file.Write(const void*)&bmfd, sizeof(BITMAPFILEHEADER); file.Write( (const void*)&bmif, sizeof(BITMAPINFOHEADER); file.Write( (const void*)pPalette, 256*sizeof(RGBQUAD); file.WriteHuge( (const void*)lp8Bit, cbImage);file.Close();)CATCH(CFileException, e)(switch(e->m_cause)(
53、case CFileException:badPath:AfxMessageBox("無效的路徑!"); break;case CFileException:invalidFile:AfxMessageBox("invalid File!");break;default:AfxMessageBox("other error!"); break;)END_CATCHdelete lp8Bit;灰度腐蝕:delete pPalette; ) void CImageProcess:GrayErosion(BYTE *pData)(if (
54、pData = NULL II m_lpSrcBit = NULL)(return;)for (int i=1; i<m_nHeight-1; i+)(for (int j=1; j<m_nWidth-1; j+) (int min = 255;for (int m=-1; m<=1; m+) (for (int n=-1; n<=1; n+)(BYTE *pSrc = pData+(i+m)*m_nLineByte+(j+n)*3; if ( *pSrc < min ) (min = *pSrc;) )*(m_lpModifyBit1+i*m_nLineByte+j*3) = min;*(m_lpModifyBit1+
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 十五房子買賣合同范本
- 合同范本環(huán)氧樹脂地坪
- 產(chǎn)品獨(dú)家運(yùn)營合同范本
- 廠房樓房出售合同范本
- 同城肥豬出售合同范本
- 制作門窗就合同范本
- 加盟服裝正式合同范本
- 合租水電氣費(fèi)用 合同范本
- 勞保服購銷合同范本
- 合伙兌店合同范例
- 基于BIM的軸流通風(fēng)機(jī)施工工藝優(yōu)化
- 2024年大學(xué)生自我意識教學(xué)案
- 女生青春期知識講座(六年級)課件
- 在醫(yī)院新員工入職儀式上的講話
- 消化道出血講課課件
- 化工過程安全管理導(dǎo)則
- 建設(shè)工程管理畢業(yè)論文
- 《國歌法》、《國旗法》主題班會
- 新一代智能變電站二次系統(tǒng)技術(shù)問答
- 索膜結(jié)構(gòu)施工方案
- 首診負(fù)責(zé)制度課件
評論
0/150
提交評論