1. 程式人生 > >soble邊緣檢測演算法的verilog實現

soble邊緣檢測演算法的verilog實現

    先來說說soble運算元,soble運算元是一種離散性差分運算元,用來運算影象亮度函式的灰度的近似值,在影象的任何一點使用這個運算元,會得到對應的灰度向量或法向量。     SOBLE運算元的卷積因子為:soble運算元包含兩組3*3的矩陣,分別為橫向和縱向,將 Gx 和 Gy 與影象做卷積,即可分別得出橫向和縱向的亮度差分近似值,如果用A表示原始影象,Gx 和 Gy 分別代表經橫向和縱向邊緣檢測的影象灰度值,公式如下:影象每一個畫素的橫向和縱向灰度值通過一下公式結合,來計算該點灰度的大小:通常,為了提高效率,使用不開平方的近似值,但是這樣做會損失精度,迫不得已的時候可以這樣做:就是這個G就是判斷條件,如果梯度G大於某一閾值(THRESHOLD),則認為該點(X,Y)為邊緣點。可以使用下面公式計算梯度方向(如果只是邊緣檢測則不需要計算方向)soble運算元的verilog實現,可以劃分為4個步驟,解析和實現分別如下:(1)計算Gx, Gy與3*3畫素陣列每行的乘積。
以上是例化生成3*3矩陣的模組,下面的程式碼是計算Gx, Gy。(2個clk)  這個理解起來不難,比較簡單,先用一個時鐘計算3*3矩陣每行的畫素乘積,再求的卷積後的Gx,Gy,因此消耗了兩個時鐘。(2)求Gx^2+Gy^2的結果,及Gx與Gy的平方和。(1個clk)這一步直接通過veilog中的乘法器的描述來實現,綜合時會自動佈線為片內乘法器,如下。(3)求Gx^2+Gy^2的平方根。(1個clk)強大的ALTERA在QII軟體中提供了平方根的IP核,如下所示。下面給出SQRT的例化程式碼:(4)根據外部輸入閾值,判斷並實現邊緣的檢測。(1個clk)將post_bit_r擴充套件到8bit, ~{8{post_bit_r}}, 檢測到的邊緣為黑色。soble_threshold 是外部輸入的一個人為設定的閾值。(5)前面幾步對影象資料的處理總共消耗了5個時鐘,因此影象陣列的同步訊號需要延遲5個時鐘。

以上就完成了Soble 運算元的HDL移植。是不是很簡單?真的不難。