圖像處理程序報(bào)告_第1頁(yè)
圖像處理程序報(bào)告_第2頁(yè)
圖像處理程序報(bào)告_第3頁(yè)
圖像處理程序報(bào)告_第4頁(yè)
圖像處理程序報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

武漢理工大學(xué)《圖像處理程序設(shè)計(jì)》課程考核說(shuō)明書(shū)PAGEPAGE1目錄1vc++簡(jiǎn)介…………………12圖像Sobel邊緣檢測(cè)…………22.1設(shè)計(jì)要求……………………22.2設(shè)計(jì)方案……………………22.3基本原理……………………22.3.1圖像Sobel邊緣檢測(cè)……………………22.4實(shí)現(xiàn)功能……………………33設(shè)計(jì)方案的實(shí)現(xiàn)………………33.1設(shè)計(jì)步驟……………………34程序代碼………………………45運(yùn)行結(jié)果………………………96心得體會(huì)………………………127參考資料………………………131VC++簡(jiǎn)介VC++是微軟公司開(kāi)發(fā)的一個(gè)IDE(集成開(kāi)發(fā)環(huán)境),換句話說(shuō),就是使用c++的一個(gè)開(kāi)發(fā)平臺(tái).有些軟件就是這個(gè)編出來(lái)的...另外還有VB,VF.只是使用不同語(yǔ)言...但是,vc++是Windows平臺(tái)上的C++編程環(huán)境,學(xué)習(xí)VC要了解很多Windows平臺(tái)的特性并且還要掌握MFC、ATL、COM等的知識(shí),難度比較大。Windows下編程需要了解Windows的消息機(jī)制以及回調(diào)(callback)函數(shù)的原理;MFC是Win32API的包裝類(lèi),需要理解文檔視圖類(lèi)的結(jié)構(gòu),窗口類(lèi)的結(jié)構(gòu),消息流向等等;COM是代碼共享的二進(jìn)制標(biāo)準(zhǔn),需要掌握其基本原理等等。VC作為一個(gè)主流的開(kāi)發(fā)平臺(tái)一直深受編程愛(ài)好者的喜愛(ài),但是很多人卻對(duì)它的入門(mén)感到難于上青天,究其原因主要是大家對(duì)他錯(cuò)誤的認(rèn)識(shí)造成的,嚴(yán)格的來(lái)說(shuō)VC++不是門(mén)語(yǔ)言,雖然它和C++之間有密切的關(guān)系,如果形象點(diǎn)比喻的話,可以把C++看作為一種“工業(yè)標(biāo)準(zhǔn)”,而VC++則是某種操作系統(tǒng)平臺(tái)下的“廠商標(biāo)準(zhǔn)”,而“廠商標(biāo)準(zhǔn)”是在遵循“工業(yè)標(biāo)準(zhǔn)”的前提下擴(kuò)展而來(lái)的。VC++應(yīng)用程序的開(kāi)發(fā)主要有兩種模式,一種是WINAPI方式,另一種則是MFC方式,傳統(tǒng)的WINAPI開(kāi)發(fā)方式比較繁瑣,而MFC則是對(duì)WINAPI再次封裝,所以MFC相對(duì)于WINAPI開(kāi)發(fā)更具備效率優(yōu)勢(shì),但為了對(duì)WINDOWS開(kāi)發(fā)有一個(gè)較為全面細(xì)致的認(rèn)識(shí),筆者在這里還是以講解WINAPI的相關(guān)內(nèi)容為主線。話說(shuō)到這里可能更多人關(guān)心的是學(xué)習(xí)VC++需要具備什么條件,為什么對(duì)于這扇門(mén)屢攻不破呢?要想學(xué)習(xí)好VC必須具備良好的C/C++的基礎(chǔ),必要的英語(yǔ)閱讀能力也是必不可少的,因?yàn)榇罅康募夹g(shù)文檔多以英文形式發(fā)布。VC基于C,C++語(yǔ)言,主要由是MFC組成,是與系統(tǒng)聯(lián)系非常緊密的編程工具,它兼有高級(jí),和低級(jí)語(yǔ)言的雙重性,功能強(qiáng)大,靈活,執(zhí)行效率高,幾乎可說(shuō)VC在Windows平臺(tái)無(wú)所不能。最大缺點(diǎn)是開(kāi)發(fā)效率不高。VC適用范圍1、VC主要是針對(duì)Windows系統(tǒng),適合一些系統(tǒng)級(jí)的開(kāi)發(fā),可以方便實(shí)現(xiàn)一些底層的調(diào)用。在VC里邊嵌入?yún)R編語(yǔ)言很簡(jiǎn)單。2、VC主要用在驅(qū)動(dòng)程序開(kāi)發(fā)3、VC執(zhí)行效率高,當(dāng)對(duì)系統(tǒng)性能要求很高的時(shí)候,可用VC開(kāi)發(fā)。4、VC主要適用于游戲開(kāi)發(fā)5、VC多用于單片機(jī),工業(yè)控制等軟件開(kāi)發(fā),如直接對(duì)I/O地址操作,就要用C++。6、VC適用開(kāi)發(fā)高效,短小,輕量級(jí)的COM組件,DLL。比如WEB上的控件。7、VC可以開(kāi)發(fā)優(yōu)秀的基于通信的程序。8、VC可以開(kāi)發(fā)高效靈活的文件操作程序。9、VC可以開(kāi)發(fā)靈活高效的數(shù)據(jù)庫(kù)操作程序。10、VC是編CAD軟件的唯一選擇?。?!包括AUTOCAD,UG的二次開(kāi)發(fā)。11、VC在多線程、網(wǎng)絡(luò)通信、分布應(yīng)用方面,VC++有不可比擬的優(yōu)勢(shì)。2圖像Sobel邊緣檢測(cè)2.1設(shè)計(jì)要求要求用VC++實(shí)現(xiàn)如下功能:(1)建立一個(gè)單文檔的應(yīng)用項(xiàng)目。(2)在主框架添加菜單“圖像處理”,并在此菜單下添加如下子菜單“顯示原圖像”、“Sobel邊緣檢測(cè)”、“顯示邊緣圖像”。(3)實(shí)現(xiàn)“顯示原圖像”功能,并以對(duì)話框的形式顯示。(4)實(shí)現(xiàn)任意一種“邊緣檢測(cè)”功能。(5)實(shí)現(xiàn)“Sobel邊緣檢測(cè)”功能、實(shí)現(xiàn)“顯示邊緣圖像”功能,并以對(duì)話框的形式顯示。2.2設(shè)計(jì)方案利用VisualC++中提供的MFC框架設(shè)計(jì)一個(gè)簡(jiǎn)單的應(yīng)用程序框架,具有顯示原圖像,Sobel邊緣檢測(cè),顯示邊緣圖像等菜單欄,再利用C++具有面向?qū)ο蟪绦蛟O(shè)計(jì)的性質(zhì),編寫(xiě)程序代碼實(shí)現(xiàn)MFC框架中對(duì)應(yīng)菜單欄中的圖像處理的功能,即可得到一個(gè)簡(jiǎn)易的圖像處理系統(tǒng),達(dá)到課程考核題目的要求。2.3基本原理1.3.1圖像Sobel邊緣檢測(cè)索貝爾算子(Sobeloperator)是圖像處理中的算子之一,主要用作邊緣檢測(cè)。在技術(shù)上,它是一離散性差分算子,用來(lái)運(yùn)算圖像亮度函數(shù)的梯度之近似值。在圖像的任何一點(diǎn)使用此算子,將會(huì)產(chǎn)生對(duì)應(yīng)的梯度矢量或是其法矢量.該算子包含兩組3x3的矩陣,分別為橫向及縱向,將之與圖像作平面卷積,即可分別得出橫向及縱向的亮度差分近似值。如果以A代表原始圖像,Gx及Gy分別代表經(jīng)橫向及縱向邊緣檢測(cè)的圖像,其公式如下:圖像的每一個(gè)像素的橫向及縱向梯度近似值可用以下的公式結(jié)合,來(lái)計(jì)算梯度的大小。然后可用以下公式計(jì)算梯度方向。在以上例子中,如果以上的角度Θ等于零,即代表圖像該處擁有縱向邊緣,左方較右方暗。在邊沿檢測(cè)中,常用的一種模板是Sobel算子。Sobel算子有兩個(gè),一個(gè)是檢測(cè)水平邊沿的;另一個(gè)是檢測(cè)垂直平邊沿的。與和相比,Sobel算子對(duì)于象素的位置的影響做了加權(quán),因此效果更好。Sobel算子另一種形式是各向同性Sobel(IsotropicSobel)算子,也有兩個(gè),一個(gè)是檢測(cè)水平邊沿的,另一個(gè)是檢測(cè)垂直平邊沿的。各向同性Sobel算子和普通Sobel算子相比,它的位置加權(quán)系數(shù)更為準(zhǔn)確,在檢測(cè)不同方向的邊沿時(shí)梯度的幅度一致。由于建筑物圖像的特殊性,我們可以發(fā)現(xiàn),處理該類(lèi)型圖像輪廓時(shí),并不需要對(duì)梯度方向進(jìn)行運(yùn)算,所以程序并沒(méi)有給出各向同性Sobel算子的處理方法。由于Sobel算子是濾波算子的形式,用于提取邊緣,可以利用快速卷積函數(shù),簡(jiǎn)單有效,因此應(yīng)用廣泛。美中不足的是,Sobel算子并沒(méi)有將圖像的主體與背景嚴(yán)格地區(qū)分開(kāi)來(lái),換言之就是Sobel算子沒(méi)有基于圖像灰度進(jìn)行處理,由于Sobel算子沒(méi)有嚴(yán)格地模擬人的視覺(jué)生理特征,所以提取的圖像輪廓有時(shí)并不能令人滿(mǎn)意。在觀測(cè)一幅圖像的時(shí)候,我們往往首先注意的是圖像與背景不同的部分,正是這個(gè)部分將主體突出顯示,基于該理論,我們給出了下面閾值化輪廓提取算法,該算法已在數(shù)學(xué)上證明當(dāng)像素點(diǎn)滿(mǎn)足正態(tài)分布時(shí)所求解是最優(yōu)的。2.4實(shí)現(xiàn)功能本次課程考核設(shè)計(jì)了一個(gè)簡(jiǎn)單的圖片處理系統(tǒng),主要具有以對(duì)話框的形式“顯示原圖像”、“顯示原圖像的直方圖”、“圖像直方圖均衡化”、“顯示均衡化處理后的直方圖”的功能。3設(shè)計(jì)方案的實(shí)現(xiàn)3.1設(shè)計(jì)步驟1、創(chuàng)建程序框架使用AppWizard創(chuàng)建一個(gè)SDI程序框架,項(xiàng)目名稱(chēng)為projt。2、菜單編輯轉(zhuǎn)到【項(xiàng)目工作區(qū)】的【ResourceView】面板,雙擊Menu文件夾下的IDR_MAINFRAME項(xiàng),打開(kāi)菜單資源編輯器,3、加入對(duì)話框在【項(xiàng)目工作區(qū)】的【ResourceView】面板,右鍵單擊Dialog文件夾,選擇插入Dialog。在顯示出的對(duì)話框中刪除多余的項(xiàng),右鍵點(diǎn)擊,選擇屬性,在彈出的窗口中設(shè)置ID為:IDD_ORIGINAL,標(biāo)題為原始圖像。再右鍵點(diǎn)擊對(duì)話框,選擇建立類(lèi)向?qū)?,新建?lèi)的名稱(chēng)為:DialogOriginal。按照同樣的步驟,再添加一個(gè)對(duì)話框,設(shè)置屬性的ID為:IDD_RESULT,標(biāo)題為閾值分割后圖像,新建類(lèi)的名稱(chēng)為DialogResult。4、添加新類(lèi)(1)添加類(lèi)CDib轉(zhuǎn)到【項(xiàng)目工作區(qū)】的【ClassView】面板,右鍵單擊projectclasses,選擇NewClass,在彈出的對(duì)話框中填寫(xiě)Name:Cdib,并選擇BaseClass,然后點(diǎn)擊確定。雙擊新建的CDib,在出來(lái)的界面里輸入相應(yīng)程序代碼。(2)添加類(lèi)CYuZhiChuLiDib右鍵單擊projectclasses,選擇NewClass,在彈出的對(duì)話框中填寫(xiě)Name:CYuZhiChuLiDib,并選擇BaseClass,然后點(diǎn)擊確定。雙擊新建的CYuZhiChuLiDib,在出來(lái)的界面里輸入相應(yīng)程序代碼。5、添加消息和成員變量轉(zhuǎn)到【項(xiàng)目工作區(qū)】的【ClassView】面板,右鍵單擊CProjectView,選擇AddWindowsMessageHandler,在彈出的對(duì)話框的Classorobjecttohandle欄目下依次選擇IDM_ORIGINAL、IDM_YUZHIFENGE、IDM_RESULT、ID_FILE_OPEN,再選擇COMMAND,點(diǎn)擊AddHandler,最后點(diǎn)擊確定。分別右鍵單擊CDialogOriginal和CDialogResult,選擇AddWindowsMessageHandler,在彈出的對(duì)話框的Classorobjecttohandle欄目下選擇ID_FILE_PAINT,再選擇COMMAND,點(diǎn)擊AddHandler,最后點(diǎn)擊確定。6、代碼編輯轉(zhuǎn)到【項(xiàng)目工作區(qū)】的【ClassView】面板,依次雙擊需要編寫(xiě)的函數(shù),在右邊相應(yīng)出來(lái)的頁(yè)面輸入相應(yīng)函數(shù)的程序代碼,在輸入代碼時(shí),注意定義變量和虛函數(shù)即可。程序代碼//DynSplitView2.cpp:implementationfile//#include"stdafx.h"#include"DSplit.h"#include"DynSplitView2.h"#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif///////////////////////////////////////////////////////////////////////////////CDynSplitView2IMPLEMENT_DYNCREATE(CDynSplitView2,CView)CDynSplitView2::CDynSplitView2(){ state2=0;}voidCDynSplitView2::clearmem(){ CDSplitDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); pDoc->statedoc=0;state2=1; CDibNew1=&pDoc->CDibNew;CDib1=&pDoc->CDib; longintsize=CDib1->GetHeight()*CDib1->GetDibWidthBytes(); memcpy(CDibNew1->m_pData,CDib1->m_pData,size);}CPalette*CDynSplitView2::CreateBitmapPalette(BianYuanJianCeDib*pBitmap){ struct { WORDVersion; WORDNumberOfEntries; PALETTEENTRYaEntries[256]; }palette={0x300,256}; LPRGBQUADpRGBTable=pBitmap->GetRGB(); UINTnumberOfColors=pBitmap->GetNumberOfColors(); for(UINTx=0;x<numberOfColors;++x) { palette.aEntries[x].peRed= pRGBTable[x].rgbRed; palette.aEntries[x].peGreen= pRGBTable[x].rgbGreen; palette.aEntries[x].peBlue= pRGBTable[x].rgbBlue; palette.aEntries[x].peFlags=0; } hPalette.CreatePalette((LPLOGPALETTE)&palette); return&hPalette;}CDynSplitView2::~CDynSplitView2(){}CDSplitDoc*CDynSplitView2::GetDocument()//non-debugversionisinline{ ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDSplitDoc))); return(CDSplitDoc*)m_pDocument;}BEGIN_MESSAGE_MAP(CDynSplitView2,CView) //{{AFX_MSG_MAP(CDynSplitView2) ON_WM_ERASEBKGND() ON_COMMAND(ID_FILESAVE,OnFilesave) ON_COMMAND(ID_Laplacian,OnLaplacian) ON_COMMAND(ID_YUANTU,OnYuantu) ON_COMMAND(ID_RESULT,OnResult) ON_COMMAND(IDM_SOBEL,OnSobel) //}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CDynSplitView2drawingvoidCDynSplitView2::OnDraw(CDC*pDC){ CDSplitDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); if(!pDoc->statedoc&&state2==1) {BYTE*pBitmapData=CDibNew1->GetData();LPBITMAPINFOpBitmapInfo=CDibNew1->GetInfo();intbitmapHeight=CDibNew1->GetHeight();intbitmapWidth=CDibNew1->GetWidth(); if(CDibNew1->GetRGB())//Hasacolortable { CPalette*hPalette=CreateBitmapPalette(CDibNew1);CPalette*hOldPalette=pDC->SelectPalette(hPalette,true);pDC->RealizePalette(); ::StretchDIBits(pDC->GetSafeHdc(),0,0,bitmapWidth,bitmapHeight, 0,0,bitmapWidth,bitmapHeight, pBitmapData,pBitmapInfo, DIB_RGB_COLORS,SRCCOPY);pDC->SelectPalette(hOldPalette,true);::DeleteObject(hPalette); } else {StretchDIBits(pDC->GetSafeHdc(),0,0,bitmapWidth,bitmapHeight,0,0,bitmapWidth,bitmapHeight, pBitmapData,pBitmapInfo, DIB_RGB_COLORS,SRCCOPY); } }}///////////////////////////////////////////////////////////////////////////////CDynSplitView2diagnostics#ifdef_DEBUGvoidCDynSplitView2::AssertValid()const{ CView::AssertValid();}voidCDynSplitView2::Dump(CDumpContext&dc)const{ CView::Dump(dc);}#endif//_DEBUG///////////////////////////////////////////////////////////////////////////////CDynSplitView2messagehandlersBOOLCDynSplitView2::OnEraseBkgnd(CDC*pDC){ CRectrect; GetClientRect(&rect); pDC->FillSolidRect(&rect,::GetSysColor(COLOR_WINDOW)); returnTRUE;}voidCDynSplitView2::OnFilesave(){ CFileDialogdlg(FALSE,_T("BMP"),_T("*.BMP"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("位圖文件(*.BMP)|*.BMP|")); if(IDOK==dlg.DoModal()) CStringfilename;filename.Format("%s",dlg.GetPathName());CDibNew1->SaveFile(filename); state2=1; Invalidate();}/*拉普拉斯算子消息映射*/voidCDynSplitView2::OnLaplacian(){ clearmem(); CDibNew1->Laplacian();//調(diào)用Laplacian算子檢測(cè)處理函數(shù) Invalidate();}voidCDynSplitView2::OnYuantu(){ //TODO:Addyourcommandhandlercodehere clearmem(); m_yuantuDlg.DestroyWindow(); m_yuantuDlg.Create(CDib1->m_fileName); m_yuantuDlg.ShowWindow(SW_SHOW);}voidCDynSplitView2::OnResult(){ //TODO:Addyourcommandhandlercodehere //clearmem(); m_resultDlg.DestroyWindow(); m_resultDlg.Create(CDibNew1); m_resultDlg.ShowWindow(SW_SHOW);}voidCDynSplitView2::OnSobel(){ //TODO:Addyourcommandhandlercodehere clearmem(); CDibNew1->Laplacian();//調(diào)用Laplacian算子檢測(cè)處理函數(shù) Invalidate();} 5運(yùn)行結(jié)果編譯運(yùn)行程序,彈出一個(gè)圖像處理的操作界面,如下圖1所示:圖1圖像處理操作界面(2)打開(kāi)一個(gè)bmp格式的圖像,再點(diǎn)擊圖像處理菜單下的顯示原圖像,就會(huì)彈出一個(gè)對(duì)話框,顯示打開(kāi)的圖像,顯示結(jié)果如下圖2所示:圖2原始圖像(3)點(diǎn)擊圖像處理菜單下的sobel邊緣檢測(cè),然后再點(diǎn)擊圖像處理菜單下的顯示圖像,就會(huì)彈出一個(gè)對(duì)話框,顯示圖像sobel邊緣檢測(cè)后的圖像,顯示結(jié)果如下圖所示:圖3圖像sobel邊緣檢測(cè)后的圖像(4)還可以進(jìn)行其他的邊緣檢測(cè)比如roberts等邊緣檢測(cè),如下圖圖4roberts邊緣檢測(cè)圖5prewitt邊緣檢測(cè)6心得體會(huì)一個(gè)小技巧:活用編譯器可以幫你很多忙。在VC中,當(dāng)你輸入成員符號(hào)

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論