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

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

圖1.1.2 傳統的以代碼為中心的軟件開發方法

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

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

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


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

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

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

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

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

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

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

圖1.1.13 單擊Code Generation下的Build按鈕

圖1.1.14 生成的可執行的C代碼