圖像處理的開閉運算_第1頁
圖像處理的開閉運算_第2頁
圖像處理的開閉運算_第3頁
圖像處理的開閉運算_第4頁
圖像處理的開閉運算_第5頁
已閱讀5頁,還剩16頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

圖像處理的開運算與閉運算0.前言腐蝕和膨脹是依據(jù)數(shù)學形態(tài)學集合論方法開展起來的圖像處理方法,起源于巖相對巖石結構的定量描述工作,在數(shù)字圖像處理和機器視覺領域中得到了廣泛的應用,形成了一種獨特的數(shù)字圖像分析方法和理論。數(shù)學形態(tài)學是圖像處理和模式識領域的新方法,其根本思想是:用具有一定形態(tài)的結構元素去量度和提取圖像中的對應形狀,以到達圖像分析和識別的目的。優(yōu)勢有以下幾點:有效濾除噪聲,保存圖像中原有信息,算法易于用并行處理方法有效實現(xiàn),基于數(shù)學形態(tài)學的邊緣信息提取處理優(yōu)于基于微分運算的邊緣提取算法,提取的邊緣比擬平滑,提取的圖像骨架也比擬連續(xù),斷點少腐蝕:是一種消除邊界點,使邊界向內部收縮的過程??梢杂脕硐∏覠o意義的物體。膨脹:是將與物體接觸的所有背景點合并到該物體中,使邊界向外部擴張的過程??梢杂脕硖钛a物體中的空洞。開運算:先腐蝕后膨脹的過程開運算。用來消除小物體、在纖細點處別離物體、平滑較大物體的邊界的同時并不明顯改變其面積。開運算通常是在需要去除小顆粒噪聲,以及斷開目標物之間粘連時使用。其主要作用與腐蝕相似,與腐蝕操作相比,具有可以根本保持目標原有大小不變的優(yōu)點。閉運算:先膨脹后腐蝕的過程稱為閉運算。用來填充物體內細小空洞、連接鄰近物體、平滑其邊界的同時并不明顯改變其面積。原因:雖然腐蝕處理可以將粘連的目標物進行別離,膨脹處理可以將斷開的目標物進行接續(xù),但同時都存在一個問題,就是經過腐蝕處理后,目標物的面積小于原有面積,而經過膨脹處理之后,目標物的面積大于原有面積。開、閉運算就是為了解決這個問題而被提出的。數(shù)學形態(tài)學中二值圖像的形態(tài)變換是一種針對集合的處理過程。其形態(tài)算子的實質是表達物體或形狀的集合與結構元素間的相互作用,結構元素的形狀就決定了這種運算所提取的信號的形狀信息。形態(tài)學圖像處理是在圖像中移動一個結構元素,然后將結構元素與下面的二值圖像進行交、并等集合運算。1.系統(tǒng)分析系統(tǒng)功能需求〔1〕位圖圖像文件的導入、轉換、顯示、保存、關閉模塊在該功能模塊中提供:位圖圖像文件的導入功能;把32位或8位位圖文件轉換為24位位圖文件的功能;顯示經過導入和轉換后的24位位圖文件的功能;圖像保存〔提供保存為8位和24位位圖的功能〕和關閉圖像的功能。這一模塊主要對圖像進行后續(xù)處理及其操作的根底?!?〕基于膨脹和腐蝕的圖像處理模塊該模塊主要的功能是用膨脹和腐蝕算法,得到對應的參數(shù)圖像〔圖像增強〕,結合膨脹和腐蝕,做出開閉運算的圖像〔3〕圖像控制模塊該模塊主要功能是實現(xiàn)對原始圖像另存;分形圖像、分割結果圖像保存的操作場景分析和開發(fā)場景名稱參與執(zhí)行者前置條件事件流后置條件圖像信息導入用戶系統(tǒng)已翻開1、翻開系統(tǒng)主界面2、選擇文件菜單中的“翻開〞命令,選擇文件3、對圖像類型進行合法性檢查,合那么4,否那么24、去除上一次數(shù)據(jù)5、把圖像轉換為24位位圖文件6、提取圖像像素數(shù)據(jù),并保存三份7、將用戶所要處理的圖像導入系統(tǒng)中1、圖像導入2、在圖像顯示界面上顯示〔三組圖像及其直方圖〕3、用戶可以作其他的處理基于腐蝕和膨脹圖像的開閉處理用戶系統(tǒng)已翻開圖像已導入1、選擇“圖像處理〞菜單2、根據(jù)用戶需要選擇需要的處理類型3、系統(tǒng)對圖像作相應的處理4、將處理后圖像保存并顯示給用戶〔中間組和右邊組:包括圖像、直方圖〕1、得到處理后圖像〔增強〕;2、在圖像顯示界面上顯示〔中間組和右邊組〕;3、用戶可以作其他的處理處理結果圖像保存場景用戶系統(tǒng)已翻開,圖像已導入,并作相應的處理1、選擇“文件〞菜單2、選擇“另保存〞菜單,路徑+文件名3、將分形結果圖像保存。1、得到分形結果圖像;2、用戶可以作其他的處理抽象用例對應活動圖用例圖根據(jù)功能分析和用例分析,我們得到“圖像處理開閉運算〞的用例圖?!?〕圖像信息的導入用例圖〔2〕基于腐蝕膨脹圖像處理用例圖〔3〕原始圖像另存用例〔4〕處理結果圖像保存用例〔5〕總的用例圖建立系統(tǒng)總體架構及領域概念模型系統(tǒng)總體架構系統(tǒng)總體架構用于描述整個軟件的體系結構,包括對各個功能模塊的劃分、功能定義、軟件的層次結構等。根據(jù)前面建立的系統(tǒng)用例圖,我們選用分層架構模式。下面我們用包圖來描述總體結構。系統(tǒng)領域概念模型領域概念模型用于描述用戶需求和相關業(yè)務領域中全局性的概念及其相互之間的關系。它在系統(tǒng)總體架構的根底上,進一步從概念上幫助開發(fā)人員理清系統(tǒng)結構及系統(tǒng)各組成局部之間的相互作用。領域概念模型使用UML的類圖來表示,但不需要標出每個類的屬性和方法,只需根據(jù)以上所作的場景開發(fā)和建立的用例,提取關鍵的概念并以類的形式表示出來即可。領域概念模型可以理解為類圖的草圖本系統(tǒng)擬采用MFC支持的文檔視圖結構中的單文檔界面〔SDI〕結構。大局部Windows應用程序都相當復雜。典型的情況是,它們均包含業(yè)務邏輯處理層和界面層〔程序框架〕,在MFC中對應于兩個代表性的類:“文檔〞和“視圖〞。MFC將文檔和視圖有機地組成一個整體的框架,提供應程序編寫者,這就是我們通常所說的文檔/視圖結構。通常,當創(chuàng)立一個SDI應用程序時,如果不考慮About對話框窗口類的話,SDI應用程序將創(chuàng)立4個特定的類,即CC***APP類、CMainFrame類、CC***DOC類、CC***VIEW類,每個類在程序運行時都有自己的特殊用途。其中:CC***APP類:創(chuàng)立所有其它組件。該類接收所有的事件消息,然后將這些消息傳遞給CMainFrame類、CC***DOC類、CC***VIEW。在編程中幾乎不需要修改和添加代碼。。CMainFrame類:它包括菜單、工具欄、滾動條、狀態(tài)欄、和所有其他與該框架相關聯(lián)的顯示對象。在編程中幾乎不需要修改和添加代碼。CC***DOC類:它是關于文檔存儲的類??梢栽谶@個類中創(chuàng)立數(shù)據(jù)結構,并利用這些數(shù)據(jù)結構存儲和處理構成文檔的數(shù)據(jù)?!沧⒁猓阂话阃ㄟ^在該類中定義一個用戶類的對象作為該類的成員變量,以此來創(chuàng)立數(shù)據(jù)結構,在程序中通過該成員變量來調用用戶類的各種成員函數(shù)【方法】〕。該類從用戶自己定義的類或CC***VIEW類得到輸入并將要顯示的信息輸出到CC***VIEW類。該類還負責存盤和從文件中檢索文檔數(shù)據(jù)的工作。CC***VIEW類:它用于向用戶顯示可視化文檔,并將用戶輸入的信息傳送到CC***DOC類,然后從CC***DOC類接收顯示信息。在該類中所需要的大局部代碼工作包括繪制用戶的文檔、處理用戶的輸入、調用用戶自定義類中的方法〔通過CC***DOC類的指針〕。CC***DOC類有幾個子類,包括CEditView、CFormView、CHtmlView、CListView、CRichEditView、CScrollView、CTreeView等,但大局部子類和CC***VIEW類的屬性和使用方法區(qū)別不大。2系統(tǒng)設計在系統(tǒng)需求分析階段,通過建立系統(tǒng)總體結構、領域概念模型,已經確定了系統(tǒng)的根本結構。在系統(tǒng)設計階段主要內容有:設計用例實現(xiàn)方案、數(shù)據(jù)設計、用戶界面設計,建立組件圖、配置圖、生成系統(tǒng)代碼框架等幾局部工作提取邊界類、實體類、控制類〔1〕提取邊界類邊界類主要描述目標軟件系統(tǒng)和外部環(huán)境的交互,復雜界面控制、外部接口和環(huán)境隔離,處理目標軟件系統(tǒng)與用戶、其他軟件系統(tǒng)及操作系統(tǒng)和其他設備之間的交互。根據(jù)已建立系統(tǒng)總體結構、領域概念模型,可以提取以下邊界類:1〕CMainFrame類、CC***VIEW類、CC***APP類、CC***DOC類中的涉及數(shù)據(jù)輸入以及界面變化的方法〔成員函數(shù)〕2〕CDlg***類3〕CImg類中的涉及數(shù)據(jù)輸入以及顯示的方法〔成員函數(shù)〕〔2〕提取實體類實體類表示目標軟件系統(tǒng)中具有持久意義的信息項和操作,它向目標軟件系統(tǒng)的其他局部提供讀取信息項內容的必要接口,不涉及業(yè)務邏輯處理。根據(jù)已建立系統(tǒng)總體結構、領域概念模型,可以提取以下邊界類:1〕CC***DOC類中的涉及數(shù)據(jù)保存的方法〔成員函數(shù)〕2〕CImg類中的涉及數(shù)據(jù)保存的方法〔成員函數(shù)〕〔3〕提取控制類和輔助類控制類作為完成用例任務的責任承當者,主要用于協(xié)調、控制其他類共同完成用例規(guī)定的功能或行為。它一般不處理具體的任務細節(jié),但它應該能夠分解任務并將子任務分派給適當?shù)妮o助類,同時在輔助類之間進行消息傳遞和協(xié)調。MFC中采用消息映射機制實現(xiàn)處理來自操作面板接收的各種用戶指令,并將這些命令分派給適當?shù)妮o助類。輔助類用于輔助控制類完成用例規(guī)定的功能或行為。可提取以下的輔助類:1〕CImg類中的用于完成用例規(guī)定的功能或行為的各種方法〔成員函數(shù)〕2〕CC***VIEW類、CC***DOC類、CDlg***類中的用于完成用例規(guī)定的功能或行為的各種方法〔成員函數(shù)〕或消息響應函數(shù)?;谒崛〉倪吔珙?、實體類和構建的控制類和輔助類,我們將在已提取的各種類的根底上,構造系統(tǒng)的交互圖、協(xié)作圖等動態(tài)視圖,為設計生成系統(tǒng)類圖做準備。通過建立系統(tǒng)的順序圖和協(xié)作圖---構造交互圖順序圖和協(xié)作圖是反映用戶和系統(tǒng)動態(tài)交互的兩種視圖。順序圖按時間順序描述系統(tǒng)元素之間的交互,而協(xié)作圖那么按照時間和空間順序描述系統(tǒng)元素〔包括系統(tǒng)用戶〕之間的交互和它們之間的動態(tài)關系。二者都是表示對象間的交互作用,前者強調時間順序,但沒有明確的表達對象間的關系;后者描述對象之間的關系,但時間順序必須從序號獲得。順序圖和協(xié)作圖都是來自UML模型的相同信息,語義上是等價的,二者可以相互轉換而不喪失任何信息。實際使用中,常用時序圖,即在順序圖的根底上,參加表示時間順序的序號?!?〕圖像導入時序圖〔2〕開閉運算計算時序圖〔3〕原始圖像另存時序圖〔4〕開閉處理后圖像保存時序圖類圖的生成類圖〔ClassDiagram〕是在系統(tǒng)的領域概念模型根底上進一步添加對象的屬性和方法生成的,它描述類、接口、協(xié)作、以及它們之間的關系,是系統(tǒng)設計的核心局部。類圖是系統(tǒng)靜態(tài)視圖的一局部,主要用于描述軟件系統(tǒng)的靜態(tài)結構,主要支持系統(tǒng)的功能需求,也即系統(tǒng)要提供應最終用戶的效勞。類圖也是面向對象系統(tǒng)建模中最常用的圖,是定義其他圖的根底。在類圖根底上,我們可以定義組件圖、配置圖,為代碼生成做好準備。在系統(tǒng)實現(xiàn)局部,表述,參加!類名:CImg-----------Img.h和Img.cpppublic: voidClose(); voidOpen(); voidDilate(); voidGrayDilate(BYTE*pData); voidErosion(); voidGrayErosion(BYTE*pData); voidSort(int*pBuf,intl,intr); voidMidFilter(intnWidth,intnHeight); voidGrayErosion(intD); voidSave8(LPCTSTRlpszPathName); voidSave24(LPCTSTRlpszPathName); voidSave(LPCTSTRlpszPathName,intnType); voidDrawIntensity(CDC*pDC,BYTE*lpSrc,intnType); voidShow(CDC*pDC,intx=0,inty=0,char*pStr=NULL); voidF24to8(constBYTE*pSrc,BYTE*pDest); voidF32to24(BYTE*lpBit); voidF8To24(BYTE*lpBit); BOOLInitial(LPCTSTRlpszPathName); voidClean(); CImageProcess(); virtual~CImageProcess();private: BYTE*m_lpSrcBit;//圖像像素數(shù)據(jù)〔原始圖像,左邊圖像〕 BYTE*m_lpModifyBit1;//處理后的圖像像素數(shù)據(jù)〔中間圖像〕 BYTE*m_lpModifyBit2;//處理后的圖像像素數(shù)據(jù)〔右邊圖像〕 BITMAPINFO*m_lpBmif;//圖像信息頭文件 char*m_sImgPath;//圖像的路徑 intm_nWidth;//圖像寬度 intm_nHeight;//圖像高度 BOOLm_bGray; intm_nLineByte;//圖像每行占的字節(jié)數(shù)〔24位圖像〕 intm_nLineByte8;//圖像每行占的字節(jié)數(shù)〔8位圖像〕 intm_nImgByteSize;//圖像的所占的字節(jié)大小 BYTE*m_lpSrcBit8;//8位位圖數(shù)據(jù) BYTE*m_lpModifyBit8;//8位位圖數(shù)據(jù)總體框架和界面設計人機界面也稱為用戶界面,它是交互式應用軟件系統(tǒng)的門面?!?〕用戶翻開系統(tǒng)主界面---系統(tǒng)功能的外部模型運行可執(zhí)行程序后,首先進入系統(tǒng)的主界面。界面要求簡單,符合用戶習慣〔2〕用戶導入圖像界面〔3〕基于腐蝕膨脹的開閉圖像處理界面腐蝕膨脹開運算閉運算數(shù)據(jù)存儲設計設計數(shù)據(jù)存儲的目的是將目標軟件系統(tǒng)中依賴于系統(tǒng)運行環(huán)境的數(shù)據(jù)存取局部與其他局部相別離。在本軟件中,需要將處理后的圖像保存到指定位置、指定格式、指定文件名。3.系統(tǒng)設計3.1建立工程〔1〕New---Projects---MfcAppwizard---工程名〔2〕SingleDocument…〔3〕CScrollView…Finish.3.2建立用戶類CImg〔1〕NewClass… 1〕右擊“工程名〞… 2〕雙擊C***Doc類,添加頭文件#include"ImageProcess.h"〔2〕添加成員變量…private: BYTE*m_lpSrcBit;//圖像像素數(shù)據(jù)〔原始圖像,左邊圖像〕 BYTE*m_lpModifyBit1;//處理后的圖像像素數(shù)據(jù)〔中間圖像〕〔處理后為分形圖像〕 BYTE*m_lpModifyBit2;//處理后的圖像像素數(shù)據(jù)〔右邊圖像〕〔處理后為分割圖像〕 BITMAPINFO*m_lpBmif;//圖像信息頭文件 char*m_sImgPath;//圖像的路徑 intm_nWidth;//圖像寬度 intm_nHeight;//圖像高度 intm_nLineByte;//圖像每行占的字節(jié)數(shù)〔24位圖像〕 intm_nLineByte8;//圖像每行占的字節(jié)數(shù)〔8位圖像〕 intm_nImgByteSize;//圖像的所占的字節(jié)大小 intm_nMse;//圖像方差〔計算圖像直方圖時使用〕BOOLm_bGray;〔3〕依次添加成員函數(shù)并完成代碼 1〕CImg::CImgeProcess()//構造函數(shù):用于對成員變量進行初始化; m_lpSrcBit=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=""; 2〕CImageProcess::~CImageProcess()//析構函數(shù);用于釋放內存,防止內存泄露!Clean(); 3〕voidCImageProcess::Clean()//實際的釋放內存函數(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;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!=NULL){delete[]m_lpSrcBit8;m_lpSrcBit8=NULL;} if(m_lpModifyBit8!=NULL){ delete[]m_lpModifyBit8; m_lpModifyBit8=NULL;}4〕BOOLInitial(LPCTSTRlpszPathName);//翻開圖像及其初始化工作/*******************************************************初始化函數(shù)功能:進行一系列的初始化操作,初始化位圖的根本數(shù)據(jù),如長、寬,信息頭等。*******************************************************/BOOLCImageProcess::Initial(LPCTSTRlpszPathName){ //讀取圖像文件數(shù)據(jù) CFilefile(lpszPathName,CFile::modeRead);//使用MSDN講解 DWORDlen=file.GetLength(); BYTE*pTemp=newBYTE[len]; if((file.ReadHuge(pTemp,len))!=len) { AfxMessageBox("文件讀取失??!"); delete[]pTemp; returnFALSE; } if(((BITMAPFILEHEADER*)pTemp)->bfType!=*(WORD*)"BM") { AfxMessageBox("目前只支持BMP格式!"); delete[]pTemp; returnFALSE; }//去除上一次數(shù)據(jù) Clean();//取得文件頭指針 BITMAPFILEHEADER*lpbmfh=(BITMAPFILEHEADER*)pTemp;//取得信息頭指針 BITMAPINFO*lpBMheader=(BITMAPINFO*)(lpbmfh+1);//取得像素指針 BYTE*lpBit=(BYTE*)lpbmfh+lpbmfh->bfOffBits;;/初始化圖像信息 intnBitNum=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_nImgByteSize=m_nLineByte*m_nHeight;//為像素數(shù)據(jù)申請存儲空間 m_lpSrcBit=newBYTE[m_nHeight*m_nLineByte]; m_lpSrcBit8=newBYTE[m_nLineByte8*m_nLineByte]; m_lpModifyBit8=newBYTE[m_nLineByte8*m_nLineByte];//顏色數(shù)轉換 if(nBitNum==8) { F8To24(lpBit); } elseif(nBitNum==32) { F32to24(lpBit); } elseif(nBitNum==24) { memcpy(m_lpSrcBit,lpBit,m_nHeight*m_nLineByte);} else { AfxMessageBox("不支持的BMP格式!"); delete[]pTemp; Clean(); returnFALSE; }//保存圖像文件的路徑 m_sImgPath=newchar[MAX_PATH]; strcpy(m_sImgPath,lpszPathName);//把信息頭該為24位,8,32位統(tǒng)一按24位處理 lpBMheader->bmiHeader.biBitCount=24; m_lpBmif=newBITMAPINFO; memcpy(m_lpBmif,lpBMheader,sizeof(BITMAPINFO)); delete[]pTemp; m_lpModifyBit1=newBYTE[m_nHeight*m_nLineByte]; memcpy(m_lpModifyBit1,m_lpSrcBit,m_nHeight*m_nLineByte); m_lpModifyBit2=newBYTE[m_nHeight*m_nLineByte]; memcpy(m_lpModifyBit2,m_lpSrcBit,m_nHeight*m_nLineByte); F24to8(m_lpSrcBit,m_lpSrcBit8); returnTRUE;}5〕//8位灰度圖像轉24位voidCImageProcess::F8To24(BYTE*lpBit){ intnLineByte=(8*m_nWidth+31)/32*4; for(inti=0;i<m_nHeight;i++) { for(intj=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位灰度圖像轉24位voidCImageProcess::F32to24(BYTE*lpBit){ intnLineByte=m_nWidth*4; for(inti=0;i<m_nHeight;i++) { for(intj=0;j<m_nWidth;j++) { BYTE*pTemp=m_lpSrcBit+i*m_nLineByte+j*3; BYTE*pTemp2=lpBit+i*nLineByte+j*4; *pTemp=*pTemp2; *(pTemp+1)=*(pTemp2+1); *(pTemp+2)=*(pTemp2+2); } }}7〕//畫直方圖voidCImageProcess::DrawIntensity(CDC*pDC,BYTE*lpSrc,intnType){if(m_lpSrcBit==NULL||lpSrc==NULL) { return; }intanCount[256]; for(intk=0;k<256;k++) { anCount[k]=0; } //統(tǒng)計直方圖 for(inti=0;i<m_nHeight;i++) { for(intj=0;j<m_nWidth;j++) { BYTE*pTemp=lpSrc+i*m_nLineByte+j*3; anCount[*pTemp]++; } } //字符串 CStringstr; //最大計數(shù) LONGlMaxCount=0; //計算最大計數(shù)值 for(i=0;i<=255;i++) { //判斷是否大于當前最大值 if(anCount[i]>lMaxCount) { //更新最大值 lMaxCount=anCount[i]; } } pDC->Rectangle(10+310*nType,m_nHeight+20,310+310*nType,m_nHeight+350); //創(chuàng)立畫筆對象 CPen*pPenRed=newCPen; //紅色畫筆 pPenRed->CreatePen(PS_SOLID,1,RGB(255,0,0)); //創(chuàng)立畫筆對象 CPen*pPenBlue=newCPen; //藍色畫筆 pPenBlue->CreatePen(PS_SOLID,1,RGB(0,0,255)); //創(chuàng)立畫筆對象 CPen*pPenGreen=newCPen; //綠色畫筆 pPenGreen->CreatePen(PS_DOT,1,RGB(0,255,0)); //選中當前紅色畫筆,并保存以前的畫筆 CGdiObject*pOldPen=pDC->SelectObject(pPenRed); //繪制坐標軸 pDC->MoveTo(20+310*nType,m_nHeight+30); //垂直軸 pDC->LineTo(20+310*nType,m_nHeight+320); //水平軸 pDC->LineTo(300+310*nType,m_nHeight+320) //繪制Y軸箭頭 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*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); pDC->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); } } //輸出最大計數(shù)值 pDC->MoveTo(20+310*nType,m_nHeight+45); pDC->LineTo(25+310*nType,m_nHeight+45); str.Format("%d",lMaxCount); pDC->TextOut(22+310*nType,m_nHeight+50,str); //更改成藍色畫筆 pDC->SelectObject(pPenBlue); //判斷是否有計數(shù) if(lMaxCount>0) { //繪制直方圖 for(i=0;i<=255;i++) { pDC->MoveTo(i+20+310*nType,m_nHeight+320); pDC->LineTo(i+20+310*nType,m_nHeight+320-(int)(anCount[i]*260/lMaxCount)); } } //恢復以前的畫筆 pDC->SelectObject(pOldPen); //刪除新的畫筆 deletepPenRed; deletepPenBlue; deletepPenGreen;}8〕/*******************************************************顯示函數(shù)功能:顯示原圖像和處理后的圖像*******************************************************/voidCImageProcess::Show(CDC*pDC,intx,inty,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); //畫直方圖 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_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);}9〕//保存處理后的圖像voidCImageProcess::Save(LPCTSTRlpszPathName,intnType){/* if(m_lpModifyBit1==NULL) { AfxMessageBox("圖像還沒有處理過不需要保存"); return; }*/ //根據(jù)選擇的文件類型來保存 switch(nType){ case1: Save24(lpszPathName); break; case2: Save8(lpszPathName); break; default:// MessageBox("未知的文件類型!"); break; }}10〕voidCImageProcess::Save24(LPCTSTRlpszPathName){ //構造24位文件頭并保存數(shù)據(jù) CFilefile(lpszPathName,CFile::modeCreate|CFile::modeWrite); BITMAPFILEHEADERbmheader; bmheader.bfSize=sizeof(BITMAPFILEHEADER); bmheader.bfType=*(WORD*)"BM"; bmheader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFO); bmheader.bfReserved1=0; bmheader.bfReserved2=0; file.Write((constvoid*)&bmheader,sizeof(BITMAPFILEHEADER)); file.Write((constvoid*)m_lpBmif,sizeof(BITMAPINFO)); file.WriteHuge((constvoid*)m_lpModifyBit1,m_nHeight*m_nLineByte); file.Close();}voidCImg::Save8(LPCTSTRlpszPathName){ //構造8位文件頭 BITMAPFILEHEADERbmfd; bmfd.bfSize=sizeof(BITMAPFILEHEADER); bmfd.bfType=*(WORD*)"BM"; bmfd.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER) +256*sizeof(RGBQUAD); bmfd.bfReserved1=0; bmfd.bfReserved2=0; BITMAPINFOHEADERbmif=m_lpBmif->bmiHeader; //構造信息頭 intnWidth=bmif.biWidth; intnHeight=bmif.biHeight; intnLineBytes=(nWidth*8+31)/32*4; intcbImage=nLineBytes*nHeight; bmif.biBitCount=8; bmif.biSizeImage=cbImage; BYTE*lp8Bit=newBYTE[cbImage]; memset(lp8Bit,255,cbImage); BYTE*pTemp=NULL; //把24位轉化為8位 for(inti=0;i<nHeight;i++) { for(intj=0;j<nWidth;j++) { pTemp=m_lpModifyBit1+i*m_nLineByte+j*3; *(lp8Bit+i*nLineBytes+j)=*pTemp; } } //構造灰度調色板 RGBQUAD*pPalette=newRGBQUAD[256]; for(intk=0;k<256;k++) { pPalette[k].rgbBlue=k; pPalette[k].rgbGreen=k; pPalette[k].rgbRed=k; pPalette[k].rgbReserved=0; } //寫數(shù)據(jù) TRY { CFilefile(lpszPathName,CFile::modeCreate|CFile::modeWrite); file.Write((constvoid*)&bmfd,sizeof(BITMAPFILEHEADER)); file.Write((constvoid*)&bmif,sizeof(BITMAPINFOHEADER)); file.Write((constvoid*)pPalette,256*sizeof(RGBQUAD)); file.WriteHuge((constvoid*)lp8Bit,cbImage); file.Close(); } CATCH(CFileException,e) { switch(e->m_cause) { caseCFileException::badPath: AfxMessageBox("無效的路徑!"); break; caseCFileException::invalidFile: AfxMessageBox("invalidFile!"); break; default: AfxMessageBox("othererror!"); break; } } END_CATCH delete[]lp8Bit; delete[]pPalette;}灰度腐蝕:voidCImageProcess::GrayErosion(BYTE*pData){if(pData==NULL||m_lpSrcBit==NULL) { return; } for(inti=1;i<m_nHeight-1;i++) { for(intj=1;j<m_nWidth-1;j++) { intmin=255; for(intm=-1;m<=1;m++) { for(intn=-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+i*m_nLineByte+j*3+1)=min; *(m_lpModifyBit1+i*m_nLineByte+j*3+2)=min; } }}腐蝕voidCImageProcess::Erosion(){if(m_lpSrcBit==NULL||m_lpModifyBit1==NULL) { return; } if(m_bGray) { GrayErosion(m_lpSrcBit); } else { }}灰度膨脹voidCImageProcess::GrayDilate(BYTE*pData){if(pData==NULL|

溫馨提示

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

評論

0/150

提交評論