- 數(shù)字圖像處理高級應(yīng)用:基于MATLAB與CUDA的實現(xiàn)(第2版) (精通MATLAB)
- 趙小川
- 3888字
- 2020-11-28 22:33:12
第1章 熱點圖像處理方法原理及其MATLAB仿真
1.1 基于模型的圖像邊緣檢測及其代碼快速生成
1.1.1 模型驅(qū)動開發(fā)思想概述
基于模型設(shè)計方法是一種設(shè)計復(fù)雜系統(tǒng)的可視化數(shù)學(xué)方法。基于模型的軟件開發(fā)方法是一種以模型為中心的軟件設(shè)計方法,用模型來形式化表示用戶所構(gòu)建系統(tǒng)的功能、行為和結(jié)構(gòu)。形式化的意思是指描述模型的語言具有定義良好的語法和語義。基于模型設(shè)計思想是通過模型抽象和描述系統(tǒng)的關(guān)鍵問題,用模型表示出系統(tǒng)解決方案,并通過形式化的工具對系統(tǒng)模型進行驗證,以保證系統(tǒng)設(shè)計正確性。基于模型設(shè)計思想從根本上解決了軟件設(shè)計的正確性保證問題。
什么是模型?模型可以是具體的物理實體,也可以是抽象的描述,如圖像描述、數(shù)學(xué)表達式。模型特征是對對應(yīng)的物理系統(tǒng)或者非物理系統(tǒng)的一種簡化表示,是人們的一種有意識的創(chuàng)造物。有了模型,系統(tǒng)開發(fā)人員就可以依賴模型來構(gòu)建系統(tǒng),而忽略掉無關(guān)的細(xì)節(jié)。
系統(tǒng)建模和模型仿真驗證是基于模型設(shè)計方法的兩個重點。采用特定的建模語言和模型設(shè)計工具,來抽象出被描述的目標(biāo)系統(tǒng),從而建立準(zhǔn)確的模型,這樣可以消除其他系統(tǒng)描述方式(比如文本描述)的模糊性和二義性。仿真驗證毫無疑問需要基于建立好的準(zhǔn)確的目標(biāo)模型,而仿真驗證帶來的好處是通過相應(yīng)的仿真驗證工具對模型進行仿真驗證之后可以保證模型的正確性。
模型驅(qū)動架構(gòu)(Model Driven Architecture, MDA)是2002年被提出的,包含了模型的精確形式化表示、模型存儲以及模型交換等方面的一系列規(guī)約,如MOF(Meta Object Facility)、OCL(Object Constraint Language)、XMI(XML Metadata Interchange)等,旨在提高程序設(shè)計的抽象層次,提高軟件開發(fā)效率,增強軟件的可移植性、協(xié)同工作能力和可維護性。要求設(shè)計時進行嚴(yán)格的模型定義,力求最終能全部或部分自動生成工程代碼。
MDA的軟件開發(fā)過程是由軟件系統(tǒng)建模驅(qū)動的。模型根據(jù)抽象層次不同可分為平臺無關(guān)模型PIM和平臺相關(guān)模型PSM。平臺無關(guān)模型描述系統(tǒng)的行為需求不涉及平臺實現(xiàn)細(xì)節(jié),平臺無關(guān)模型的設(shè)計者專注于表示系統(tǒng)的業(yè)務(wù)邏輯;平臺相關(guān)模型不僅包含系統(tǒng)功能描述,而且包含實現(xiàn)平臺的設(shè)計思想。平臺無關(guān)模型可以被轉(zhuǎn)換為一個或多個平臺相關(guān)模型,平臺相關(guān)模型最終會轉(zhuǎn)換成具體平臺的實現(xiàn)代碼。MDA軟件開發(fā)周期如圖1.1.1所示。

圖1.1.1 MDA軟件開發(fā)周期
MDA引入了模型驅(qū)動開發(fā)(Model-Driven Development, MDD)的軟件開發(fā)和模型集成運算(Model-Integrated Computing, MIC)的開發(fā)模式。模型驅(qū)動開發(fā)是當(dāng)今嵌入式系統(tǒng)開發(fā)方法的熱點,模型集成運算開發(fā)方法是面向領(lǐng)域的模型驅(qū)動開發(fā)方法,在面向特定領(lǐng)域的建模語言方面擴展了模型驅(qū)動開發(fā)方法,能通過元模型針對特定領(lǐng)域進行定制和裁剪,并能基于領(lǐng)域模型自動生成代碼。
代碼生成的概念最初見于編譯器設(shè)計和開發(fā)中,編譯器先將輸入的源程序翻譯成某種中間表示,然后產(chǎn)生等價的某種目標(biāo)程序語言表示的目標(biāo)程序。這種將中間表示生成目標(biāo)程序的過程也是代碼生成,但是在基于模型的軟件設(shè)計方法中的代碼生成是指利用計算機程序(代碼生成器)將模型自動地生成可用的代碼。代碼生成的過程大致包括模型建立和生成代碼。建立一個好的能準(zhǔn)確描述應(yīng)用系統(tǒng)并充分考慮系統(tǒng)應(yīng)用環(huán)境的模型并沒有解決所有問題,因為必須將這個模型轉(zhuǎn)化成有效的可運行的模型代碼。
基于模型的軟件開發(fā)方法和傳統(tǒng)的軟件開發(fā)方法有著顯著的區(qū)別。傳統(tǒng)的軟件開發(fā)方法如圖1.1.2所示,其核心是代碼,代碼的開發(fā)、測試和維護占用項目開發(fā)的絕大多數(shù)時間和精力。而基于模型的軟件開發(fā)方法,如圖1.1.3所示,其核心是模型,項目開發(fā)的主要工作是模型的設(shè)計,測試和維護也是圍繞著模型來開展的,其代碼可以方便地依據(jù)模型而自動生成。代碼生成可以很好地提升軟件開發(fā)效率、縮短軟件開發(fā)周期、提高軟件開發(fā)效率。

圖1.1.2 傳統(tǒng)的以代碼為中心的軟件開發(fā)方法

圖1.1.3 以模型為中心的軟件開發(fā)方法
1.1.2 模型驅(qū)動開發(fā)的優(yōu)勢
基于模型驅(qū)動的設(shè)計開發(fā)在各個過程之間沒有阻礙,它的優(yōu)勢在于:
(1)在統(tǒng)一的開發(fā)、測試平臺上,允許產(chǎn)品從需求分析階段就開始驗證,并做到持續(xù)不斷的驗證與測試;
(2)產(chǎn)品的缺陷暴露在產(chǎn)品開發(fā)的初級階段,開發(fā)者把主要精力放在算法和測試的研究上,代碼生成和驗證過程則留給計算機自動完成;
(3)大大縮短開發(fā)周期,降低開發(fā)成本。
1.1.3 模型驅(qū)動開發(fā)在圖像處理領(lǐng)域中的應(yīng)用
眾所周知,數(shù)字圖像處理的實現(xiàn)過程中代碼量巨大,將模型驅(qū)動開發(fā)引入到圖像處理領(lǐng)域,則可大大提高其規(guī)范性和高效性。
基于模型驅(qū)動的數(shù)字圖像處理的主要步驟包括:
(1)需求分析;
(2)將實現(xiàn)過程按照邏輯先后順序分為各個階段,再將各個階段按照功能劃分為各個模塊;
(3)建立基于功能模塊的模型,并進行仿真;
(4)代碼自動生成。
1.1.4 基于Simulink-Blocks的模型驅(qū)動開發(fā)圖像處理
MATLAB中的計算機視覺系統(tǒng)工具箱(Computer Vision System)如圖1.1.4所示,提供了視頻和圖像處理的各種模型,共計11個大類庫,每個模型庫提供了數(shù)種模塊。用戶可以通過拖動、組合,構(gòu)建視頻和圖像處理模型,進行視頻和圖像的仿真和分析。

圖1.1.4 計算機視覺系統(tǒng)工具箱的路徑
啟動MATLAB,選擇菜單欄的Simulink Library,按圖1.1.4所示選擇Computer Vision System Toolbox,系統(tǒng)就會顯示計算機視覺系統(tǒng)工具箱,如圖1.1.5所示。視頻和圖像處理模塊包含Sources(輸入模塊)、Sinks(輸出模塊)、Analysis &Enhancement(分析和增強)、Conversions(轉(zhuǎn)換)、Filtering(濾波)、Geometric Transformations(幾何變換)、Morphological Operations(形態(tài)學(xué)運算)、Statistics(統(tǒng)計)、Text &Graphics(文本和圖像)、Transforms(變換)和Utilities(自定義)11個大類庫。這幾乎包含了圖像處理中的所有操作和算法,并附帶了文字標(biāo)注子模塊,為圖像處理的模型建立和仿真提供了充足的模塊。

圖1.1.5 計算機視覺系統(tǒng)工具箱模塊
1.1.5 基于Sobel算子的邊緣檢測的基本原理
邊緣是圖像最基本的特征。邊緣檢測在計算機視覺、圖像分析等應(yīng)用中起著重要的作用,是圖像分析與識別的重要環(huán)節(jié)。因為圖像的邊緣包含了用于識別的有用信息,所以邊緣檢測是圖像分析和模式識別的主要特征提取手段。
所謂邊緣,是指其周圍像素灰度階躍變化或屋頂狀變化的那些像素的集合,它存在于目標(biāo)與背景、目標(biāo)與目標(biāo)、區(qū)域與區(qū)域、基元與基元之間。因此,它是圖像分割所依賴的重要特征,也是紋理特征的重要信息源和形狀特征的基礎(chǔ);而圖像的紋理形狀特征的提取又常常依賴于圖像分割。圖像的邊緣提取也是圖像匹配的基礎(chǔ),因為它是位置的標(biāo)志,對灰度的變化不敏感,所以可作為匹配的特征點。
圖像的其他特征都是由邊緣和區(qū)域這些基本特征推導(dǎo)出來的。邊緣具有方向和幅度兩個特征。沿邊緣走向,像素變化比較平緩;而垂直于邊緣走向,像素變化比較劇烈,而這種劇烈變化可能呈現(xiàn)階躍狀,也可能呈現(xiàn)斜坡狀。邊緣上的這種變化可以用微分算子檢測出來,通常用一階或二階導(dǎo)數(shù)來檢測邊緣。不同的是,一階導(dǎo)數(shù)認(rèn)為最大值對應(yīng)邊緣位置,而二階導(dǎo)數(shù)則以過零點對應(yīng)邊緣位置。
邊緣檢測的步驟如下:
(1)圖像濾波。邊緣檢測算法主要是基于圖像亮度的一階和二階導(dǎo)數(shù),但是導(dǎo)數(shù)的計算對噪聲很敏感,因此必須使用濾波器來改善與噪聲有關(guān)的邊緣檢測器的性能。
(2)圖像增強。增強邊緣的基礎(chǔ)是確定圖像各點鄰域強度的變化值。增強算法可以將鄰域強度值有顯著變化的點突出顯示。
(3)圖像檢測。在圖像中有許多點的梯度幅值比較大,而這些點在特定的應(yīng)用領(lǐng)域中并不都是邊緣,應(yīng)該用某些方法來確定哪些是邊緣點。最簡單的邊緣檢測判據(jù)是梯度幅值閾值判據(jù)。
(4)圖像定位。如果某一應(yīng)用場合要求確定邊緣位置,則邊緣的位置可以在子像素分辨率上來估計,邊緣的方位也可以被估計出來。
對于圖像的邊緣檢測來說,一般在識別過程中有如下要求:
(1)首先能夠正確地檢測出有效的邊緣;
(2)邊緣定位的精度要高;
(3)檢測的響應(yīng)最好是單像素的;
(4)對于不同尺度的邊緣都能有較好的響應(yīng)并盡量減少漏檢;
(5)對噪聲應(yīng)該不敏感;
(6)檢測的靈敏度受邊緣方向影響應(yīng)該小。
邊緣檢測的實質(zhì)是采用某種算法來提取出圖像中的對象與背景間的交界線。圖像灰度的變化情況可以用圖像灰度分布的梯度來反映,因此可以利用局部圖像微分技術(shù)獲得邊緣檢測算子。經(jīng)典的邊緣檢測方法是對原始圖像中像素的某個小鄰域來構(gòu)造邊緣檢測算子。
Sobel算子的基本原理是將圖像中每個像素的上、下、左、右四鄰域的灰度值加權(quán)差,與之接近的鄰域的權(quán)值最大。因此,Sobel算子定義如下:
sx={f(x+1, y-1)+2f(x+1, y)+f(x+1, y+1)}
-{f(x-1, y-1)+2f(x-1, y)+f(x-1, y+1)}
sy={f(x-1, y+1)+2f(x, y+1)+f(x+1, y+1)}
-{f(x-1, y-1)+2f(x, y)+f(x+1, y-1)}
該方法不但能產(chǎn)生較好的檢測效果,而且對噪聲具有平滑作用,可以提供較為精確的邊緣方向信息。但是,在抗噪聲好的同時增加了計算量,而且也會檢測出偽邊緣,定位精度不高。如果檢測中對精度的要求不高,則該方法較為常用。
1.1.6 基于模型的實現(xiàn)
下面就通過一個例子來看一下,如何通過MATLAB Simulink-Blocks來實現(xiàn)基于模型驅(qū)動的數(shù)字圖像處理。
(1)需求分析。對輸入的圖像進行Sobel邊緣檢測。
(2)實現(xiàn)步驟。RGB圖像輸入→轉(zhuǎn)換成灰度圖像→邊緣提取。
(3)建立功能模塊,并通過功能模塊進行仿真。
其中,各功能模塊及其路徑如表1.1.1所列,連接方式如圖1.1.6所示。
表1.1.1 各功能模塊及其路徑


圖1.1.6 基于模型驅(qū)動的Sobel邊緣檢測
對各模塊的屬性進行設(shè)置如下:
(1)雙擊Image From File模塊,將其參數(shù)設(shè)置為如圖1.1.7所示的內(nèi)容。

圖1.1.7 Image From File模塊參數(shù)設(shè)置
(2)雙擊Color Space Conversion模塊,將其參數(shù)設(shè)置為如圖1.1.8所示的參數(shù)。

圖1.1.8 Color Space Conversion模塊參數(shù)設(shè)置
(3)雙擊Edge Detection模塊,將其參數(shù)設(shè)置為如圖1.1.9所示的參數(shù)。

圖1.1.9 Edge Detection模塊參數(shù)設(shè)置
在完成各功能模塊的設(shè)置之后,對整個模型進行仿真,證明該模型是正確的并且是可行的,其運行效果如圖1.1.10所示。

圖1.1.10 模型仿真結(jié)果
1.1.7 代碼的快速生成
接下來,進行代碼的自動生成。在Simulation下拉菜單下,選擇Configuration Parameters,如圖1.1.11所示。

圖1.1.11 選擇Configuration Parameters操作
將Solver options的屬性設(shè)置為Fixed-step,如圖1.1.12所示。

圖1.1.12 將Solver options的屬性設(shè)置為Fixed-step
單擊Code Generation下的Build按鈕(如圖1.1.13所示),便可生成可執(zhí)行的C代碼,如圖1.1.14所示。

圖1.1.13 單擊Code Generation下的Build按鈕

圖1.1.14 生成的可執(zhí)行的C代碼