版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 畢 業(yè) 設 計(論 文)</p><p> 基于MFC的圖像邊緣檢測提取算法仿真</p><p> 基于MFC的圖像邊緣檢測提取算法仿真</p><p> [摘要] 本論文是要通過計算機仿真的方法來實現對圖像邊緣的提取,并生成新的圖像,新的圖像只含有邊緣,無其他的顏色信息。在通過用計算機進行仿真的過程中,演示仿真系統(tǒng)是使用VC++6.0來
2、編寫的,應用了面向對象的編程思想,并使用C++語言實現。本論文研究的圖像是Windows操作系統(tǒng)中的標準圖像文件格式(*.bmp)。本論文從介紹MFC編程的基礎知識,然后又分析了bmp圖像的內部結構。分析比較了六個常用邊緣檢測算子,最后又分析了邊緣提取算子。通過對各個算子的分析比較,最后應用在邊緣提取上的邊緣檢測算子是Kirsch算子,其他幾個算子在應用后邊緣檢測后效果一般,但是進行邊緣提取后,效果非常不清晰,只有Kirsch算子較好的
3、反應了邊緣,我所做的邊緣檢測,是在不分析圖像的噪聲,和其他因素的條件下進行的。</p><p> [關鍵詞] 邊緣檢測 邊緣提取 算子 圖像</p><p> Based on MFC image edge detection extraction algorithm simulation</p><p> [Abstract] This
4、 thesis is to through the computer simulation method to realize the image edge extraction, and generate new image, the new image contains only edge, no other color information. With a computer simulation in through the p
5、rocess, demo simulation system is using vc ++6.0 to write, applied the object-oriented programming ideas, and use the c++ language implementation. This paper studies the image is Windows operating system standard image f
6、ile format (*. BMP). This paper introduces t</p><p> [Key words] edge detection pick operator image</p><p><b> 目 錄</b></p><p><b> 目 錄I</b><
7、;/p><p><b> 第1章 緒論1</b></p><p><b> 1.1引言1</b></p><p> 1.2邊緣與邊緣檢測1</p><p> 1.3 邊緣檢測的研究背景及意義1</p><p> 1.4 課題發(fā)展狀況和目標2</p>
8、;<p> 第2章 程序框架及編程基礎知識介紹3</p><p> 2.1 MFC概述3</p><p> 2.2 MFC類庫3</p><p> 2.3 程序設計框架:4</p><p> 第3章 VC++圖像處理程序的設計6</p><p> 3.1數字圖像處理概述6<
9、;/p><p> 3.2圖像和顏色系統(tǒng)7</p><p> 3.2.1灰度圖像和彩色圖像8</p><p><b> 3.3位圖8</b></p><p> 第4章 經典的邊緣檢測提取方法及實現14</p><p> 4.1 Roberts算子14</p><
10、p> 4.2 Prewitt 算子和 Sobel 算子15</p><p> 4.3 Kirsch算子17</p><p> 4.4 拉普拉斯算子17</p><p> 4.5 高斯拉普拉斯邊緣檢測算子19</p><p> 4.6邊緣檢測算子的實現20</p><p> 4.7算子的結果比
11、較23</p><p> 第五章 邊緣提取25</p><p> 5.1邊緣提取的功能與原理25</p><p> 5.2 邊緣提取的效果與算法實現26</p><p><b> 結 論28</b></p><p><b> 致 謝29</b><
12、;/p><p><b> 參考文獻30</b></p><p><b> 第1章 緒論</b></p><p><b> 1.1引言</b></p><p> 邊緣檢測是圖像處理的一個重要分支,研究為完成某一任務需要從圖像中提取哪些有用的信息,以及如何利用這些信息解釋圖
13、像。邊緣檢測技術對于處理數字圖像非常重要,因為邊緣是所要提取目標和背景的分界線,提取出邊緣才能將目標和背景區(qū)分開來。在圖像中,邊界表明一個特征區(qū)域的終結和另一個特征區(qū)域的開始,邊界所分開區(qū)域的內部特征或屬性是一致的,而不同的區(qū)域內部的特征或屬性是不同的,邊緣檢測正是利用物體和背景在某種圖像特性上的差異來實現的,這些差異包括灰度,顏色或者紋理特征。邊緣檢測實際上就是檢測圖像特征發(fā)生變化的位置。</p><p>
14、由于噪聲和模糊的存在,檢測到的邊界可能會變寬或在某些點處發(fā)生間斷,因此,邊界檢測包括兩個基本內容:首先抽取出反映灰度變化的邊緣點,然后剔除某些邊界點或填補邊界間斷點,并將這些邊緣連接成完整的線。邊緣檢測的方法大多數是基于方向導數掩模求卷積的方法。導數算子具有突出灰度變化的作用,對圖像運用導數算子,灰度變化較大的點處算得的值比較高,因此可將這些導數值作為相應點的邊界強度,通過設置門限的方法,提取邊界點集。[3]</p>&l
15、t;p> 1.2邊緣與邊緣檢測</p><p> 直觀上邊緣是一組相連像素的集合,它們位于兩個不同區(qū)域之間,而從根本上說邊緣是基于某種算法得到的具有特定特征的點的集合。由此看出邊緣的定義與算法有關,同時邊緣的定義以像素灰度的躍變?yōu)榛A。</p><p> 圖像上顏色相近的像素連在一起形成了不同的區(qū)域而不同的區(qū)域間的邊緣表現為顏色灰度的躍變。邊緣檢測就是利用微分等方法通過對灰度躍
16、變的分析尋找圖像上區(qū)域邊緣的技術,對數字圖像,通常使用卷積或類似卷積的方法來實現對灰度的分析。</p><p> 1.3 邊緣檢測的研究背景及意義</p><p> 利用計算機進行圖像處理有兩個目的:一是生產更適合人類觀察和識別的圖像;二是希望能由計算機自動識別和理解圖像。無論為了哪種目的,圖像處理中關鍵的一步就是對包含大量的各式各樣景物信息的圖像進行分解。分解最終結果是圖像被分解成一
17、些具有某種特征的最小成分,稱為圖像的基元,相對于整幅圖像來說,這種基元比較容易處理。</p><p> 圖像的特征是指圖像場中可用作標志的屬性。它可以分為圖像的統(tǒng)計特征和圖像的視覺特征。</p><p> 圖像的統(tǒng)計特征是指一些人為定義的特征,通過變換才能得到如圖像的直方圖、矩頻譜等。圖像的視覺特征是指人的視覺可直接感受到自然特征,如區(qū)域的亮度、紋理或輪廓等,利用這兩類特征把圖像分解成
18、一系列有意的目標或區(qū)域的過程稱為圖像的分割。</p><p> 圖像的邊緣是圖像的最基本特征。所謂邊緣是指周圍圖像灰度有階躍變化的那些像素的集合,邊緣廣泛存在于物體與背景之間,物體與物體之間,基元與基元之間。因此邊緣檢測是圖像分割所依賴的重要特征。[2]</p><p> 1.4 課題發(fā)展狀況和目標</p><p> 邊緣檢測的研究多年來在業(yè)內被人們高度重視。
19、從邊緣檢測研究的歷史和現狀來看,邊緣檢測有幾個明顯的趨勢:1、對原有的算法不斷改進。2、新方法、新概念的引入和多種方法的有效綜合運用。3、對特殊圖像邊緣檢測的研究越來越得到重視,目前有很多針對立體圖像、彩色圖像、多光譜圖像、合成孔徑雷達圖像、深度圖像、紋理圖像、超聲圖像、計算機斷層掃描、磁共振圖像、共聚焦激光掃描顯微鏡圖像以及運動圖像等特殊圖像的邊緣檢測技術的研究。4、對圖像邊緣檢測評價的研究和對評價系統(tǒng)的研究越來越得到關注。5、將現有
20、的算法應用于工程實際中。</p><p> 在此本可以將使用VC++6.0編程設計軟件對邊緣檢測技術的的各個算法進行仿真編程,來分析和比較各個算法的功能和效果,以便更深入的了解圖像邊緣檢測技術。</p><p> 第2章 程序框架及編程基礎知識介紹</p><p><b> 2.1 MFC概述</b></p><p&
21、gt; MFC,微軟基礎類(Microsoft Foundation Classes),實際上是微軟提供的,用于在C++環(huán)境下編寫應用程序的一個框架和引擎,VC++是Windows下開發(fā)人員使用的專業(yè)C++ SDK(SDK,Standard SoftWare Develop Kit,專業(yè)軟件開發(fā)平臺),MFC就是掛在它之上的一個輔助軟件開發(fā)包,MFC作為與VC++血肉相連的部分(注意C++和VC++的區(qū)別:C++是一種程序設計語言,是
22、一種大家都承認的軟件編制的通用規(guī)范,而VC++只是一個編譯器,或者說是一種編譯器+源程序編輯器的IDE。MFC是Win API與C++的結合,API,即微軟提供的Windows下應用程序的編程語言接口,是一種軟件編程的規(guī)范,但不是一種程序開發(fā)語言本身,可以允許用戶使用各種各樣的第三方(如我是一方,微軟是一方,Borland就是第三方)的編程語言來進行對Windows下應用程序的開發(fā),使這些被開發(fā)出來的應用程序能在Windows下運行,比
23、如VB,VC++,Java,Delhpi編程語言函數本質上全部源于API,因此用它們開發(fā)出來的應用程序都能工作在Windows的消</p><p><b> 2.2 MFC類庫</b></p><p> CWnd:窗口,它是大多數“看得見的東西”的父類(Windows里幾乎所有看得見的東西都是一個窗口,大窗口里有許多小窗口),比如視圖CView、框架窗口CFram
24、eWnd、工具條CToolBar、對話框CDialog、按鈕CButton,一個例外是菜單(CMenu)不是從窗口派生的。該類很大,一開始也不必學,知道就行了。</p><p> CDocument文檔,負責內存數據與磁盤的交互。最重要的是OnOpenDocument(讀入),OnSaveDocument(寫盤),Serialize(讀寫)。</p><p> CView視圖,負責內存
25、數據與用戶的交互。包括數據的顯示、用戶操作的響應(如菜單的選取、鼠標的響應)。最重要的是OnDraw(重畫窗口),通常用CWnd::Invalidate()來啟動它。另外,它通過消息映射表處理菜單、工具條、快捷鍵和其他用戶消息。你自己的許多功能都要加在里面,你打交道最多的就是它。 </p><p> CDC設備文本。無論是顯示器還是打印機,都是畫圖給用戶看。這圖就抽象為CDC。CDC與其他GDI(圖形設備接口)
26、一起,完成文字和圖形、圖像的顯示工作。把CDC想象成一張紙,每個窗口都有一個CDC相聯系,負責畫窗口。CDC有個常用子類CClientDC(窗口客戶區(qū)),畫圖通常通過CClientDC完成。 </p><p> CDialog對話框 </p><p> CWinApp應用程序類。似于C中的main函數,是程序執(zhí)行的入口和管理者,負責程序建立、消滅,主窗口和文檔模板的建立。最常用函數In
27、itInstance():初始化。</p><p> CSize大小,就是(cx,cy)對(寬、高)MFC是在1992年的Microsoft 16位版的C/C++編譯器的7.0版本中作為一個擴展輕量級的Windows API面向對象的C++封裝庫而引入的。</p><p> CEditView 提供Windows編緝控件的功能。因為CEditView派生于Cedit,該對象可同文件和文
28、件模板一同使用 afxext.h。</p><p> 2.3 程序設計框架:</p><p><b> 1.系統(tǒng)流程圖:</b></p><p> 圖2.1 系統(tǒng)流程圖</p><p> 第3章 VC++圖像處理程序的設計</p><p> 3.1數字圖像處理概述</p>
29、<p> 數字圖像處理(Digital Image Processing)是指用計算機對圖像信息進行的處理,也稱為(Computer Image Processing)。數字圖像處理包括以下幾個內容:[3]</p><p><b> (1)點運算</b></p><p> 點運算主要是針對圖像的像素進行加、減、乘、除等運算。圖像的點運算可有有效地改變
30、圖像的直方圖分布,這對提高圖像的分辨率以及圖像的均衡都是非常有效的。</p><p><b> (2)幾何處理</b></p><p> 幾何處理主要包括圖像的坐標轉換、圖像的移動、縮小、放大和旋轉,多個圖像的配準和圖像扭曲校正等。幾何處理是最常見的圖像處理手段,幾乎任何圖像處理軟件都提供了最基本的圖像縮放功能。圖像的扭曲校正功能可以對變形的圖像進行幾何校正,從而
31、得出準確的圖像。</p><p><b> (3)圖像增強</b></p><p> 圖像增強主要是突出圖像中重要的信息,同時減弱同時減弱或去除不需要的信息。本論文所研究的范圍就是屬于圖像的增強。常用的方法有直方圖增強和偽彩色增強等。[5]</p><p><b> (4)圖像復原</b></p>&l
32、t;p> 圖像復原的主要目的是去除干擾和模糊,從而恢復圖像的本來。例如對圖像進行去噪聲復原處理。</p><p> (5)圖像形態(tài)學處理</p><p> 圖像形態(tài)學是數學形態(tài)的延伸,是一門獨立的研究科學。利用圖像形態(tài)學處理技術,可以實現圖像的腐蝕、細化和分割等效果。</p><p><b> (6)圖像編碼</b></p&
33、gt;<p> 圖像編碼研究屬于信息論中信息源編碼的范疇,主要是利用圖像的信號的統(tǒng)計特性和人類視覺特性對圖像進行高效編碼,從而達到壓縮圖像的目的。圖像編碼是數字圖像處理中一個經典的研究范疇,有60多年的研究歷史,目前已經制定了多種編碼標準,如H.261、JPEG和MEPG等。</p><p><b> (7)圖像重建</b></p><p> 圖像
34、的重建起源于CT技術的發(fā)展,是一門新興的數字圖像處理技術,主要是利用采集的數據重建出圖像。圖像重建的主要算法有迭代法、代數法、傅立葉反投影法和和使用最廣泛的卷積反投影法等。</p><p><b> (8)模式識別</b></p><p> 模式識別也是數字圖像處理的一個新興的研究方向,目前模式識別方法有三種,即統(tǒng)計識別法、句法結構模式識別法和模糊識別法。應用廣泛
35、的有文字識別(ORC)技術就是應用模式識別技術開發(fā)出來的。</p><p> 3.2圖像和顏色系統(tǒng)</p><p><b> 1. 圖像</b></p><p> 普通的顯示器屏幕是由許多的點構成的,這些點稱為像素。顯示時采用掃描的方式:電子槍每次從左到右掃描一行,為每個像素著色,然后再從上到下掃描整個屏幕,利用人眼的視覺暫留效應就可以顯
36、示出一屏完整的圖像。為了防止閃爍,每秒要重復幾十次掃描過程。我們常說的屏幕分辨率為1024*768像素,刷新頻率為85Hz,意思是每行掃描1024像素,一共要掃描768行,每秒重復掃描屏幕85次。一般刷新頻率大于80Hz時,人眼感受不到因屏幕刷新而產生的閃爍,這種顯示器被稱為位映像設備。所謂位映像,就是指一個二維的像素矩陣,位圖就是采用位映像方法顯示和存儲的圖像。</p><p> 對于彩色圖像,它的顯示必須從
37、三原色RGB概念說起。眾所周知,自然界中的所有顏色都可以由紅、綠、藍三原色組合而成。有的顏色有紅色成分多一些,其他成分少一些。針對含有紅色成分的多少,可以人為地分成0~255共256個等級。0級表示不含紅色部分,255級表示含有100%的紅色成分。同樣,綠色和藍色也可以被分成256級。這樣根據紅、綠、藍各種不同的組合可以表示出256*256*256(約1600萬)種顏色。[4]</p><p><b>
38、 2.調色板</b></p><p> 如果一幅圖像的每個像素都用其RGB分量來表示,那么圖像文件將變的非常大,實際上的做法不完全是這樣,下面舉一個例子:</p><p> 對一副200*200的16色圖像,它共有40000個像素,如果沒一個像素都用R、G、B3個分量表示,則一個像素需要3個字節(jié)(因為每個分量有256個級別,要用8位,即1個字節(jié)來表示,所以3個分量需要用3
39、個字節(jié))。這樣保存整個 圖像要用200*200*3,即120000字節(jié)。但是如果采用調用的方法,就能節(jié)省很多字節(jié)。</p><p> 對于16色圖像,圖中最多只有16種顏色,如果采用一個顏色表,表中的每一行記錄一種顏色的R、G、B值,這樣當表示一個像素的顏色時,只需要指出該顏色是第幾行,即指出的該顏色在表中的索引值即可。例如表的第0行為(255,0,0),表示紅色,那么當某個像素為紅色時,只需要標明0即可。通過
40、顏色索引表來表示圖像,16種狀態(tài)可以用4位(bit)表示,所以一個像素要用半個字節(jié)。整個圖像要用200*200*0.5,即20000字節(jié),再加上顏色表占用3*16=48字節(jié),也不過20048字節(jié)。這樣一幅圖像整個占用的字節(jié)數只是用前面方法表示的1/6。[2]</p><p> 3.2.1灰度圖像和彩色圖像</p><p><b> 1. 灰度圖像</b></
41、p><p> 灰度圖(Grayscale)是指含亮度信息不含彩色信息的圖像,是數字圖像的基本形式,灰度圖像可有由黑白照片數字化得到,或從彩色圖像進行去色處理得到?;叶葓D像只表達圖像的亮度信息而沒有顏色信息,因此,灰度圖像的每個像素點上只包含一個量化的灰度級(即灰度值),用來表示該點的亮度水平,并且通常用1個字節(jié)(8個二進制位)來存儲灰度值。</p><p> 如果灰度值用1個字節(jié)表示,則可
42、以表示的正整數范圍是0到255,也就是說,像素灰度值取值在0到255之間,灰度技術為256級。注意到人眼對灰度的分辨能力通常在20到60級,因此,灰度值存儲以字節(jié)為單位即保證了人眼的分辨能力,又符合計算機數據尋址的習慣。在特殊應用中,可能要采用更高的灰度級數,例如CT圖像的灰度級數高達數千,需要采用12位或16位二進制位來存儲,但這類圖像通常都采用專用的顯示設備和軟件來進行顯示和處理。[7]</p><p>&l
43、t;b> 2.彩色圖像</b></p><p> 彩色圖像的數據不僅包含亮度信息,還包含顏色信息。彩色的表示方法是多樣化的,最常見的是三基色模型,例如RGB三基色模型,利用RGB三基色可以混合成任意顏色。因此RGB模型在各種彩色成像設備和彩色顯示設備中使用,常規(guī)的彩色圖像也都是用RGB三基色來表示的,每個像素包括RGB三基色數據,每個基色用1個字節(jié)(8位二進制位)表示,則每個像素的數據為3個
44、字節(jié)(即24位二進制位),這就是人們常說的24位真彩色。</p><p><b> 3.3位圖</b></p><p><b> 1.GDI位圖</b></p><p> GDI是圖形設備接口(Graphics Device Interface)的縮寫。GDI位圖是一種GDI對象,在Microsoft基本類(MFC)
45、庫中Cbitmap類來表示。在Cbitmap類對象中,包含一種和Windows的GDI模塊有關的Windows數據結構,該數據結構是與設備相關的。應用程序可以得到GDI位圖數據的一個備份,但是其中位圖的安排則完全依賴于顯示設備。我們可以將GDI位圖數據在同一臺計算機內的不同應用程序間任意傳遞,但是由于其對設備的依賴性,在不同類型計算機間的傳遞是沒有任何意義的。</p><p> Cbitmap類封裝了Windo
46、ws GDI位圖,同時提供了一些位圖的成員函數。在使用CBitmap對象時,首先要創(chuàng)建一個Cbitmap對象,然后把它選進設備環(huán)境中,再調用其成員函數進行處理,使用完畢后,把它從設備環(huán)境中選出并刪除。</p><p> 2.設備無關位圖(DIB)</p><p> DIB是設備無關位圖(Device-Independent Bitmap)的縮寫,它自帶顏色信息,因此調色板管理非常容易。
47、DIB也使打印時的灰度陰影的控制更加容易。任何運行Windows操作系統(tǒng)的計算機都可以處理DIB,它通常以BMP文件的形式被保存在磁盤中或者作為資源保存在EXE文件和DLL文件中。</p><p> (1)BMP圖像的DIB結構</p><p> DIB 是標準的Windows位圖格式,BMP文件中包含了一個DIB。一個BMP文件大體上分成如下4個部分:</p><
48、p> BITMAPFILEHEADERbType=”MB”</p><p> 位圖文件頭bfSize</p><p> (只用于BMP文件)btReserved1</p><p> btReserved2</p><p><b> bfOffBits</b></p><p&g
49、t; BITMAPINFOHEADERbiSize</p><p> 位圖信息頭biWidth</p><p><b> biHeight</b></p><p><b> biPlanes</b></p><p> biBitCount</p><p>
50、 biCompression</p><p> biSizeImage</p><p> biXPelsPerMeter</p><p> biYPelsPerMeter</p><p><b> biClrUsed</b></p><p> biClrImportant</p&g
51、t;<p> Polette單色DIB有2個表項</p><p> 調色板16色DIB有16個表項或更少</p><p> 256色DIB誘256個表項或更少</p><p> 真彩色DIB沒有調色板</p><p> 每個表項長度為4字節(jié)(32位)</p><p> DIB Pixel
52、s像素按照每行每列的順序排列</p><p> DIB 圖像數據每一行的字節(jié)數必須是4的整倍數</p><p> 第1部分為位圖文件頭BITMAPFILEHEADER,它是一個結構,其定義如下:</p><p> typedef struct tagBITMAPFILEHEADER{</p><p> WORD bfType;&
53、lt;/p><p> DWORD bfSize;</p><p> WORD bfReserved1;</p><p> WORD bfReserved2;</p><p> DWORD bfoffBits; </p><p> }BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER
54、, *PBITMAPFILEHEADER;</p><p> 該結構的長度是固定的,為14個字節(jié)(WORD為無符號16位整數,DWORD為無符號32位整數),各個域的說明如下:</p><p> bfType:指定文件類型,必須是0x4D42,即字符串“MB”,也就是說所有的“.bmp”文件的頭兩個字節(jié)都是“MB”。</p><p> bfSize:指定文件大
55、小,包括14個字節(jié)。</p><p> bfReserved1,bfReserved2:為保留字,不用考慮。</p><p> bfOffBits:為從文件頭到實際的位圖數據的偏移字節(jié)數。</p><p> 第2部分為位圖信息頭BITMAPINFOHEADER,它也是一個結構,其定義如下:</p><p> typedef struc
56、t tagBITMAPINFOHEADER{</p><p> DWORD biSize;</p><p> LONG biWidth;</p><p> LONG biHeight;</p><p> WORD biPlanes;</p><p> WORD biBitConut;</p>&
57、lt;p> DWORD biCompression;</p><p> DWORD biSizeImage;</p><p> LONG biXPelsPerMeter;</p><p> LONG biYPelsPerMeter;</p><p> DWORD biClrUsed;</p><p>
58、 DWORD biClrImportant;</p><p> } BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER</p><p> 這個結構的長度也是固定的,為40個字節(jié)(WORD為無符號16位整數,DWORD為無符號32位整數,LONG為32位整數)。各個域的說明如下。</p><p&g
59、t; biSize:指定這個結構的長度,為40字節(jié)。</p><p> biWidth:指定圖像的寬度,單位是像素。</p><p> biHeight:指定圖像的高度,單位是像素。</p><p> biPlanes:必須是1,不用考慮。</p><p> biBitCount:指定表示顏色時藥用到的位數,常用的值為1(黑白二色圖
60、)、4(16色圖)、8(256色)、24(真彩色圖),新的“.bmp”格式支持32位色</p><p> biCompression:指定位圖是否壓縮,有效的值為BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS(都是一些Windows定義好的常量)。需要注意,Windows位圖可以采用RLE4和RLE8的壓縮格式,但是使用不經常。</p><p> biSizeI
61、mage:指定實際的位圖數據占用的字節(jié)數,其實也可以從下面公式計算出來:</p><p> biSizeImage=biWidth‘*biHeight</p><p> 要注意的是上面的公式中的biWidth必須是4的整數倍(所以不biWidth,而是biWidth‘,表示大于或等于biWidth的離4最近的整數倍。例如,如果biWidth=240,則biWidth‘=240;如果bi
62、Width=241,則biWidth‘=244)。如果biCompression為BI_RGB,則該項可能為零。</p><p> biXPelsPerMerter:指定目標設備的水平分辨率,單位是像素/米。</p><p> biYPelsPerMerter:指定目標設備的垂直分辨率,單位是像素/米。</p><p> biClrUsed:指定圖像實際用到的
63、顏色數,如果該值為零,則用到的顏色數為2的biBitCount次冪。</p><p> biClrImportant:指定圖像中重要的顏色數,如果該值為零,則認為所有的顏色都是重要的。</p><p> 第3部分為調色板(Palette)。有些位圖需要調色板,有些位圖(例如真彩色圖)不需要調色板,它們的BITMAPINFOHEADER后面直接是位圖數據。</p><
64、p> 調色板實際上市一個數組,共有biClrUsed個元素(如果該值為零,則有2的biBitCount次冪個元素)。數組中每個元素的類型是一個RGBQUAD結構,占4個字節(jié),其定義如下:</p><p> typedef struct tagRGBQUAD{</p><p> BYTE rgbBlue; 該顏色的藍色分量</p><p> BYTE r
65、gbGreen; 該顏色的綠色分量。</p><p> BYTE rgbRed; 該顏色的紅色分量。</p><p> BYTE rgbReserved; 保留值。</p><p><b> }RGBQUAD;</b></p><p> 第4部分是實際的圖像數據。對于用到調色板的位圖,圖像數據就是該像素顏色在調色
66、板中的索引值;對于真彩色圖,圖像數據就是實際的R、G、B值</p><p> (2)BMP圖像的存取</p><p> BMP文件分為4個部分,那么BMP文件的讀入也按照4個人組成部分依次進行處理,即先處理BITMAPFILEHEADER結構,然后是BITMAPINFOHEADER結構、顏色表,最后處理位圖數據。</p><p> 首先,有關BITMAPFIL
67、EHEADER、BITMAPINFOHEADER、RGBQUAD等結構定義包含在頭文件“Windows.h”中,應該把它包含進來。</p><p> (3)DIB訪問函數</p><p> Windows支持一些重要的DIB訪問函數。這些函數都沒有被封裝到MFC中,所以我們需要參考msdn文檔來添加。下面介紹本程序用的訪問函數:</p><p> SetDIB
68、itsToDevice:該函數直接在顯示器或打印機上顯示DIB。顯示時不進行縮放,位圖的每一位對應一個顯示像素或一個打印點。不能進行縮放限制了它的實用。該函數不能像BitBlt函數那樣使用,因為BitBlt使用的是邏輯坐標。</p><p> StrechDIBits:該函數按照與StretchBlt函數類似的方式將DIB直接顯示在顯示器或打印機上。</p><p> GetDIBit
69、s:該函數利用申請到的內存,由GDI位圖來構造DIB??梢詫IB的格式進行控制,因為我們可以指定每個像素的顏色位數,并且可以指定是否對它進行壓縮。如果使用了壓縮格式,就必須對GetDIBits進行兩次調用,一次用于計算需要的內存,另一次來產生DIB數據。</p><p> CreateDIBitmap:該函數從DIB出發(fā)來創(chuàng)建GDI位圖。與所有這些DIB函數一樣,必須提供一個設備環(huán)境指針作為參數。這里我們需要
70、一個顯示器設備環(huán)境,不需要內存設備環(huán)境。</p><p> CreateDIBSection:該函數是一個新的Win32函數,它創(chuàng)建一個特殊的DIB,稱為DIB項,然后返回一個GDI位圖句柄。該函數為我們提供了DIB和GDI位圖最好的特性。我們可以直接訪問DIB的內存,而且利用位圖句柄和內存設備環(huán)境,還可以再DIB中調用GDI函數畫圖。</p><p> (4)ImgDib類的編寫&l
71、t;/p><p> 利用Windows現有的DIB訪問函數,可以實現位圖的可視化編程。使用MFC編制一個基于單文檔、面向過程的位圖顯示與存儲程序。BMP文件讀寫實例在功能上完全一致的,只不過一個是可視化的編程環(huán)境,一個是控制臺的程序。聲明的這個類叫做ImgDib,里面封裝了DIB位圖處理所需要的基本的成員變量和成員函數,這樣充分利用了面向對象程序設計的封裝、繼承等特性,又使得代碼易于維護和移植。[4]</p&
72、gt;<p> 1.ImgDib類的定義</p><p> ImgDib類的定義在頭文件”ImgDib.h”中,代碼如下</p><p> class ImgDib{</p><p><b> public:</b></p><p> unsigned char *m_pImageData;//圖
73、像數據的指針;</p><p> LPRGBQUAD m_pColorTable;//圖像顏色表指針;</p><p> int m_nBitPixel;//每個像素占的位數;</p><p><b> private:</b></p><p> LPBYTE m_pDib;//指向整個DIB的指針(包含BITM
74、APFILEHEHEDER,BITMATPINFOHEADER ,和顏色表)</p><p> LPBITMAPINFOHEADER m_pInfoHead;//圖像信息頭指針;</p><p> HPALETTE m_hPalette;//調色板指針;</p><p> int m_pColorTableLength;//顏色表長度;</p>
75、<p><b> public:</b></p><p> ImgDib();//不帶參數的構造函數;</p><p> ImgDib(CSize size,int nBitPixel,LPRGBQUAD pColorTable,unsigned char *pImageData);</p><p> ~ImgDib();//
76、析構函數;</p><p> BOOL Read(LPCTSTR lpszPathName);//DIB讀函數</p><p> BOOL OnDraw(CDC*PDC,CPoint Origin,CSize size);//DIB顯示函數;</p><p> BOOL WriteOn(LPCTSTR lpszPathName);</p><
77、;p> void MakePalette();//調色板生成函數;</p><p> CSize GetDibsize();//獲取圖像DIB的寬和高</p><p> void Empty();//清理內存空間;</p><p> void ReplaceDib(CSize size,int nBitPixel,LPRGBQUAD pColorTab
78、le,unsigned char *pImageData);//用新的數據替換當前的DIB;</p><p> int ComputeColorTableLength(int nBitPixel);//計算顏色表的長度;</p><p> protected:</p><p> int m_imgWidth;//圖像的寬。以像素為單位;</p>
79、<p> int m_imgHeight;//圖像的高,以像素為單位;};</p><p> 通過BMP文件讀取的方式生成DIB,也可以通過參數的傳遞方式生成DIB,本類始終都是一次為DIB的指針m_pdib分配內存。</p><p> ImgDib類的代碼實現在文件ImgDib.cpp中</p><p> 構造函數和析構函數:</p>
80、<p> 類的構造函數用來完成數據成員的初始化工作,系統(tǒng)在創(chuàng)建類的對象時自動調用構造函數。類的析構函數用來釋放被分配的內存空間,當類的對象消失時系統(tǒng)自動調用該函數。</p><p> 第4章 經典的邊緣檢測提取方法及實現</p><p> 4.1 Roberts算子</p><p> 邊緣,是指周圍像素灰度有階躍變化或屋頂等變化的那些像素的集
81、合。圖像的邊緣對應著圖像灰度的不連續(xù)性。顯然圖像的邊緣很少是從一個灰度跳到另一個灰度這樣的理想狀況。真實圖像的邊緣通常都具有有限的寬度呈現出陡峭的斜坡狀。 </p><p> 邊緣的銳利程度由圖像灰度的梯度決定。梯度是一個向量,f?指出灰度變化的最快的方向和數量。</p><p><b> 公式 4.1</b></p><p> 梯度的大
82、小和方向是由</p><p><b> 公式 4.2</b></p><p><b> [3]</b></p><p><b> 公式 4.3</b></p><p> 因此最簡單的邊緣檢測算子是用圖像的垂直和水平差分來逼近梯度算子:</p><p&
83、gt;<b> [3] </b></p><p><b> 公式 4.4</b></p><p> 因此當我想尋找邊緣的時候,最簡單的方法是對每一個像素計算出(4.4)的向量,然后求出它的絕對值,然后進行閾值操作就可以了。利用這種思想就得到了Roberts算子:</p><p><b> [3]<
84、/b></p><p><b> 公式4.5</b></p><p> 它是一個兩個2*2模板作用的結果(標注“.”的是當前像素的位置)</p><p> 能查到的最早的有關邊緣檢測的文獻就是1959 年 B. Jule的[17],這算是最早的提出邊緣檢測和邊緣檢測算子的文章了。 </p><p> 196
85、3 年 Roberts[23]提出了邊緣檢測和邊緣檢測的這個簡單算子。Machine Perception of 3-D Solids 是 Roberts 在 1963 年寫的(MIT)博士畢業(yè)論文。這是一篇大家都應該閱讀的論文。它是最早分析圖像中的邊緣、線、模型和圖形學的文章。作者提出的系統(tǒng)是第一個 3D 視覺系統(tǒng),其中有許多后來被大家常用的算子。它使用了三維物體的多邊形模型,通過計算圖像中的灰度數據尋找圖像中的“塊”然后對他最適當
86、的表示,最后通過匹配來尋找物體。復雜的物體是由很多“塊”組成的,而“塊”是由邊緣組成的。作者使用他的簡單的2×2 算子得到了邊緣。相鄰的邊緣點組成線,如果線比較短,那么這條線就被忽略,如果線比較長,那么我們就把它延長直到它與其它的邊緣線相交與一點。然后通過對這些線的匹配來識別物體。一旦一個物體識別出來,表示這個物體的邊緣就從圖像的邊緣線表示上刪除,然后再對下一個物體進行匹配。[4]</p><p>
87、4.2 Prewitt 算子和 Sobel 算子</p><p> Roberts 算子是直觀的也是簡單的,但是顯然效果不好。實踐中人們做了大量的實踐,總結出了一些經驗。 </p><p> 1970 年左右 Prewitt[16]和 Sobel[25]分別提出了一個算子,這就是 Prewitt 算子和 Sobel 算子。 </p><p> Prewitt
88、邊緣檢測算子使用兩個有向算子(一個水平的,一個是垂直的,一般稱為模板),每一個逼近一個偏導數:</p><p> PV= PH=</p><p> 如果我們用 Prewitt算子檢測圖像 M 的邊緣的話,我們可以先分別用水平算子和垂直算子對圖像進行卷積,得到的是兩個矩陣,在不考慮邊界的情形下也是和原圖像同樣大小的 M1,M2,他們分別
89、表示圖像 M 中相同位置處的兩個偏導數。然后把 M1,M2 對應位置的兩個數平方后相加得到一個新的矩陣G,G 表示 M 中各個像素的灰度的梯度值(一個逼近)。然后就可以通過閥值處理得到邊緣圖像。總的過程是: </p><p><b> 公式 4.6</b></p><p> Sobel 算子和 Prewitt算子的不同就在于使用的模板不一樣:</
90、p><p><b> [5]</b></p><p> S1= S2=</p><p> 我們假設圖像的灰度滿足下面這個關系:</p><p><b> [7]</b></p><p><b> 公式 4.7</b></p>&
91、lt;p> 當前像素 3×3 鄰域內像素值為</p><p><b> [7]</b></p><p><b> 公式 4.8</b></p><p> 定義垂直算子和水平算子形如:</p><p><b> [5]</b></p>&l
92、t;p> 之所以這樣定義是為了滿足對稱性和電路設計的需要。 利用這兩個模板對當前像素進行卷積,得到的方向導數為</p><p><b> [6]</b></p><p><b> 公式 4.9</b></p><p> 因此當前像素處的梯度的大小為:</p><p><b>
93、 [4]</b></p><p><b> 公式 4.10</b></p><p><b> 顯然要有:</b></p><p><b> [4]</b></p><p><b> 公式 4.11</b></p><
94、;p> 如果我們取a=b=1/6則得到的模板就是1/6乘Prewitt算子;如果我們取 a=1/8,b=1/4則得到的就是1/8乘 Sobel 算子。 </p><p> 哪一個算子比較好?這個問題的答案取決于圖像的噪聲,如果在每個點噪聲都是相同的,那么 Prewitt算子是比較好的;如果靠近邊緣的噪聲是沿著邊緣的2倍,那么 Sobel 算子是比較好的。也就是算子的好壞取決于噪聲的結構。事實上,它們存在
95、一些共同的問題: </p><p> A.他們的結果對噪聲很敏感,圖像的離散差分對噪聲比對原圖像更敏感; </p><p> B.可以通過先對圖像做平滑以改善結果,但是又會產生一個問題:會把一些靠在一起的邊緣平滑掉,而且會影響對邊緣的定位;[5]</p><p> 4.3 Kirsch算子</p><p> 1971年,R.Kirsc
96、h[34]提出了一種邊緣檢測的新方法:它使用了8個模板來確定梯度和梯度的方向。假設原來的 3×3子圖像的如下:</p><p><b> [7]</b></p><p> 則邊緣的梯度大小為: </p><p><b> [5]</b></p><p><b> 公式 4
97、.12</b></p><p><b> 其中 </b></p><p><b> [5]</b></p><p><b> 公式 4.13</b></p><p> 上面的下標如果超過7就用 8去除取余數。注意到 k=0,1,...7,其實就是使用了 8個
98、模板了</p><p> 4.4 拉普拉斯算子</p><p> 拉普拉斯算子是對二維函數進行運算的二階導數算子。通常使用的拉普拉斯算子如下面所示:</p><p> 由于拉普拉斯算子是一個二階導數,它將在邊緣處產生一個陡峭的零交叉,如下圖所示由于噪聲點對邊緣檢測有一定的影響,所以高斯拉普拉斯算子是效果較好的邊緣檢測器。它把高斯平滑濾波器和拉普拉斯銳化濾波器結
99、合起來,先平滑去掉噪聲,再進行邊緣檢測,所以效果更好。</p><p> 它的脈沖響應和傳遞函數如下圖:</p><p> 圖4.1 脈沖響應和傳遞函數[4] </p><p> 對數字圖像來說,f(x,y)的二階偏導數可以表示為:</p><p><b> [5]</b></p><p>
100、;<b> 公式 4.14</b></p><p> 因此拉普拉斯算子為:</p><p><b> 公式 4.15</b></p><p> 數字圖像在點的拉普拉斯算子,只有一個模板,它可以由點的灰度值減去該點鄰域的平均灰度值來求得。 </p><p> 4.5 高斯拉普拉斯邊緣檢測算子
101、</p><p> 因為圖像邊緣有大的灰度變化, 所以圖像的一階偏導數在邊緣處有局部最大值或最小值, 則二階偏導數在邊緣處會通過零點 (由正到負或由負到正)。</p><p> 考慮坐標旋轉變換,設旋轉前坐標為,旋轉后為,則有: </p><p><b> [5]</b></p><p><b>
102、 公式 4.16</b></p><p> 容易看出, 雖然, 不是各向同性的, 但是它們的平方和是各向同性的。即</p><p><b> [5]</b></p><p><b> 公式 4.17</b></p><p> 定義Laplacian算子為,拉普拉斯算子是各向同性(
103、isotropic)的微分算子。</p><p><b> [6]</b></p><p><b> 公式 4.18</b></p><p> 因此, Laplacian 算子是線性二次微分算子, 與梯度算子一樣, 具有旋轉不變性, 從而滿足不同走向的圖像邊界的銳化要求。</p><p>
104、對階躍狀邊緣, 二階導數在邊緣點出現零交叉, 即邊緣點兩旁二階導函數取異號, 據此, 對數字圖像{ f ( i , j) }的每個像素, Laplacian 算子取它關于 X 軸方向和 Y 軸方向的二階差分之和。</p><p><b> [4]</b></p><p><b> 公式 4.19</b></p><p>
105、; 這是一個與邊緣方向無關的邊緣檢測算子。若點發(fā)生零交叉, 則為階躍邊緣點。</p><p> 對屋頂狀邊緣, 在邊緣點的二階導數取極小值。據此, 對數字圖像的每個像素取它的關于 X 方向和 Y 方向的二階差分之和的相反數, 即 Laplacian 算子的相反數:</p><p> 公式 4.20[6]</p><p><b> 稱為邊緣圖像。&l
106、t;/b></p><p> 由于我們關心的是邊緣點位置而不是其周圍的實際灰度差, 因此, 一般都選擇與方向無關的邊緣檢測算子。用拉普拉斯算子檢測邊緣就是估算拉普拉斯算子的輸出, 找出它的零點位置。離散情況下, 拉普拉斯算子有幾種不同的模板計算形式:</p><p><b> 或或</b></p><p> 由于拉普拉斯算子是一個
107、二階導數, 它將在邊緣處產生一個陡峭的零交叉。由于噪聲點對邊緣檢測有一定影響, 所以高斯 – 拉普拉斯算子是效果較好的邊緣檢測器。它把高斯平滑濾波器和拉普拉斯銳化濾波器結合起來, 先平滑掉噪聲, 再進行邊緣檢測, 所以效果更好。通常的高斯 – 拉普拉斯算子是一個 5×5 的模板。[5]</p><p> 4.6邊緣檢測算子的實現</p><p> 1.Roberts算子的實現
108、:[1]</p><p> for(i=1;i<m_imgHeight-1;i++){</p><p> for(j=1;j<m_imgWidth-1;j++){</p><p> for(k=0;k<pixelByte;k++){</p><p><b> //x方向梯度</b></p&
109、gt;<p> x=*(m_pImgData+i*lineByte+j*pixelByte+k)</p><p> -*(m_pImgData+(i+1)*lineByte+j*pixelByte+k);</p><p><b> //y方向梯度</b></p><p> y=*(m_pImgData+i*lineByte
110、+j*pixelByte+k)</p><p> -*(m_pImgData+i*lineByte+(j+1)*pixelByte+k);</p><p> t=sqrt(x*x+y*y)+0.5;</p><p><b> if(t>255)</b></p><p><b> t=255;<
111、;/b></p><p> *(m_pImgDataOut+i*lineByte+j*pixelByte+k)=t;</p><p> 2.Sobel 算子的實現:[1]</p><p> for(i=1;i<m_imgHeight-1;i++){</p><p> for(j=1;j<m_imgWidth-1;j+
112、+){</p><p> for(k=0;k<pixelByte;k++){</p><p><b> //x方向梯度</b></p><p> x= *(m_pImgData+(i-1)*lineByte+(j+1)*pixelByte+k)</p><p> + 2 * *(m_pImgData+i*l
113、ineByte+(j+1)*pixelByte+k)</p><p> + *(m_pImgData+(i+1)*lineByte+(j+1)*pixelByte+k)</p><p> - *(m_pImgData+(i-1)*lineByte+(j-1)*pixelByte+k)</p><p> - 2 * *(m_pImgData+i*lineByte
114、+(j-1)*pixelByte+k)</p><p> - *(m_pImgData+(i+1)*lineByte+(j-1)*pixelByte+k);</p><p><b> //y方向梯度</b></p><p> y= *(m_pImgData+(i-1)*lineByte+(j-1)*pixelByte+k)</p&g
115、t;<p> + 2 * *(m_pImgData+(i-1)*lineByte+j*pixelByte+k)</p><p> + *(m_pImgData+(i-1)*lineByte+(j+1)*pixelByte+k)</p><p> - *(m_pImgData+(i+1)*lineByte+(j-1)*pixelByte+k)</p><
116、;p> - 2 * *(m_pImgData+(i+1)*lineByte+j*pixelByte+k)</p><p> - *(m_pImgData+(i+1)*lineByte+(j+1)*pixelByte+k);</p><p> t=sqrt(x*x+y*y)+0.5;</p><p><b> if(t>255)</
117、b></p><p><b> t=255;</b></p><p> *(m_pImgDataOut+i*lineByte+j*pixelByte+k)=t;</p><p> 3.Prewitt 算子的實現:[1]</p><p> for(i=1;i<m_imgHeight-1;i++){<
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 畢業(yè)論文-圖像邊緣檢測算法的分析實現
- 基于sobel算子的圖像邊緣檢測算法仿真設計【自動化畢業(yè)論文】
- 基于sobel算子的圖像邊緣檢測算法仿真設計【自動化畢業(yè)論文】
- 基于蟻群算法的圖像邊緣檢測附代碼畢業(yè)論文
- 畢業(yè)論文---基于matlab的數字圖像邊緣檢測算法研究
- 圖像邊緣檢測技術畢業(yè)論文
- 基于邊緣檢測的圖像分割方法研究-畢業(yè)論文
- 基于邊緣檢測的圖像分割方法研究-畢業(yè)論文
- 圖像邊緣檢測與提取算法的比較
- 基于邊緣檢測的圖像分割方法研究-畢業(yè)論文
- 畢業(yè)論文外文翻譯-圖像邊緣檢測
- 數字圖像邊緣檢測算法研究實現畢業(yè)論文
- 基于形狀的圖像特征提取及檢測算法仿真設計【自動化畢業(yè)論文】
- 畢業(yè)論文--數字圖像邊緣檢測算法的分析與實現
- 基于matlab的數字圖像與邊緣檢測畢業(yè)論文
- 基于matlab的數字圖像與邊緣檢測畢業(yè)論文
- 彩色圖像邊緣提取、矢量化 畢業(yè)論文
- 數字圖像邊緣檢測算法的研究和實現畢業(yè)論文
- 基于matlab的圖像邊緣檢測算法研究和仿真設計
- 基于matlab的圖像邊緣檢測算法研究和仿真設計
評論
0/150
提交評論