FPGA形態學濾波設計

頂層框架設計

Tophat變換(白帽)實際上是原圖像與“開運算”的結果圖之差,算法數學表達式如下:
在這裏插入圖片描述
根據以上公式,設計系統頂層框圖如下所示:
在這裏插入圖片描述
開運算爲先腐蝕後膨脹的過程,將原圖輸入流依次流過腐蝕運算流水線和膨脹運算流水線即可,不過要注意時序對齊!!!,開運算的設計框圖如下所示:
在這裏插入圖片描述
腐蝕與膨脹運算可以理解爲在形態學處理核(n*n的矩形窗口)範圍內尋找像素灰度值的最小值或最大值。他們之間只有些許差別,因此在設計時,將一維的腐蝕和膨脹操作劃分爲一個模塊,通過入口參數(ERO_DIL)進行腐蝕或膨脹選擇。二維腐蝕與膨脹操作的設計框圖如下圖所示:
在這裏插入圖片描述
一維膨脹與腐蝕模塊完成輸入數據流的連續幾個數據的比較,完成流水線輸出。設計框圖如下所示:
在這裏插入圖片描述

子模塊設計

在子模塊設計中我們往往採用自底向上的設計原則。根據上一節所設計的整體框架及模塊劃分,我們需設計以下模塊:
(1) 比較子模塊min_max.v
(2) 一維形態學腐蝕/膨脹子模塊morph_1d.v
(3) 二維形態學腐蝕/膨脹子模塊morph_2d.v
(4) 二維形態學開運算子模塊morph_open_2d.v
(5) 二維形態學Tophat運算模塊morph_tophat_2d.v

比較子模塊(min_max)設計

考慮到代碼維護性和移植性,將基本比較單元設計爲單獨的子模塊,這個子模塊需實現以下功能:
(1) 輸出兩個數據的較大值
(2) 輸出兩個數據的較小值
模塊的設計結構如下所示:
在這裏插入圖片描述
由上圖可以看出,本模塊消耗一個時鐘。

一維形態學腐蝕/膨脹子模塊(morph_1d)設計

對於圖像處理而言,可以分爲縱向和橫向兩個維度的處理。我們習慣先處理橫向處理,然後再縱向處理。所謂橫向處理就是對每一行進行處理。對於nn的處理窗口,可以採用一個1n的窗口從圖像第一行第一列開始,自左向右滑動,依次取出窗口內的n個像素灰度值,比較得到灰度最小值和最大值。

以處理尺寸爲5來說明,其電路設計框圖如下所示:
在這裏插入圖片描述
上圖中min_max的比較單元正好爲一個時鐘的開銷。所以得到窗口內的最值需要5個時鐘開銷,同時考慮到邊界對齊,將輸出有效信號減少radius時鐘。得到的輸出有效信號與輸出數據的關係圖如下所示:
在這裏插入圖片描述
容易算出,輸入數據流經過morph_1d模塊,共延時了KSZ-radius時鐘。具體的看代碼自己仔細算算。

二維形態學腐蝕/膨脹子模塊(morph_2d)設計

將每一行的輸入數據流過morph_1d模塊,得到的結果即爲每一行的一維運算結果。按照二維擴展的思路,將每一行的一維算子的計算結果對齊,然後在列方向上再進行一維運算,得到的結果即是二維運算結果。其框圖如下所示:
在這裏插入圖片描述
從上圖可以看出,首先將din數據流入morph_1d模塊,得到一維運算結果,然後再將其通過line_fifo行FIFO緩存起來,用於列數據對齊。

容易得知,緩存4行數據後,在第5行數據來的時候,該模塊才能輸出實際第3行的處理結果。當最後一行數據來的時候,該模塊輸出實際倒數第3行的結果。 此時各fifo中都還有一行的殘留數據,所以需用利用場同步信號來進行行fifo清零,否則第二幀圖像處理時會出問題。

同時爲了使輸出圖像數據分辨率不變,就需要考慮邊界問題。以line_rden[3]打3拍得到的輸出有效標誌信號,其對應的輸出輸出數據是第3行到倒數第3行,上下還有2行邊界沒有覆蓋到。

考慮到morph_1d模塊的morph_1d_dout_vld信號與line_rden[3]之間恰好存在2*radius行延時,正好用來作爲邊界。本教程使用morph_1d模塊的morph_1d_dout_vld打3拍作爲morph_2d模塊的數據輸出有效信號。二維輸出的邊界圖如下所示:
在這裏插入圖片描述
通過以上分析,容易得到din數據流經過morph_2d模塊,場同步信號延時了KSZ+3-radius時鐘。

二維形態學開運算子模塊(morph_open_2d)設計

二維的開運算模塊設計相對來說比較簡單,其設計框圖如下所示:
在這裏插入圖片描述
容易得到din輸入數據經過morph_open_2d模塊後,場同步信號延時了2*(KSZ+3-radius)拍。

二維形態學Tophat變換模塊(morph_tophat_2d)設計

二維Tophat濾波模塊設計需要等待原圖開運算結束,結束後將原圖與開運算結果相減並輸出,設計框圖如下所示:
在這裏插入圖片描述
由上節可以得知,din數據經過morph_open_2d模塊後,經過2*(KSZ+3-radius)時鐘才能輸出圖像數據,同時考慮到line_fifo讀數據也會延時一拍,所以din輸入數據經過delay延時,即2*(KSZ+3-radius)-1時鐘延時,經過延時後的輸入數據將會與morph_open_2d模塊輸出的數據對齊。

從圖9可以看出,腐蝕/膨脹模塊輸出的上邊界是2radius行,其中radius行原本是下邊界的,爲了對齊方便,將原本下邊界的radius移到了上邊界了,相當於有效圖像數據往下移了radius行,而開運算是先腐蝕後膨脹,所以經過開運算後,就相當於圖像數據往下移動了2radius行。所以din輸入數據需要緩存2*radius行才能和開運算輸出的有效數據對齊!!!

這個地方有點不好理解,總的來說,就是要對齊數據!!!

調試

源碼和調試過程我就不再貼圖了,後面會給出源碼的下載方式。下面將直接給圖效果圖,以供大家參考對比。

腐蝕效果圖

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

膨脹效果圖

在這裏插入圖片描述
在這裏插入圖片描述

開運算效果圖

在這裏插入圖片描述

tophat變換效果圖

在這裏插入圖片描述
在這裏插入圖片描述

福利

本教程的所有verilog源碼以及上位機源碼都會公佈,微信掃描下面的二維碼關注[春哥筆記]公衆號,回覆“形態學濾波”即可Get源碼的獲取方式。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章