天天看點

soble邊緣檢測算法的verilog實作

    先來說說soble算子,soble算子是一種離散性差分算子,用來運算圖像亮度函數的灰階的近似值,在圖像的任何一點使用這個算子,會得到對應的灰階矢量或法矢量。

     SOBLE算子的卷積因子為:

soble邊緣檢測算法的verilog實作
soble邊緣檢測算法的verilog實作

soble算子包含兩組3*3的矩陣,分别為橫向和縱向,将 Gx 和 Gy 與圖像做 卷積,即可分别得出橫向和縱向的亮度差分近似值,如果用A表示原始圖像,Gx 和 Gy 分别代表經橫向和縱向邊緣檢測的圖像灰階值,公式如下:

soble邊緣檢測算法的verilog實作
soble邊緣檢測算法的verilog實作

圖像每一個像素的橫向和縱向灰階值通過一下公式結合,來計算該點灰階的大小:

soble邊緣檢測算法的verilog實作

通常,為了提高效率,使用不開平方的近似值,但是這樣做會損失精度,迫不得已的時候可以這樣做:

soble邊緣檢測算法的verilog實作

就是這個G就是判斷條件,如果梯度G大于某一門檻值(THRESHOLD),則認為該點(X,Y)為邊緣點。可以使用下面公式計算梯度方向(如果隻是邊緣檢測則不需要計算方向)

soble邊緣檢測算法的verilog實作

soble算子的verilog實作,可以劃分為4個步驟,解析和實作分别如下: (1)計算Gx, Gy與3*3像素陣列每行的乘積。

soble邊緣檢測算法的verilog實作

以上是例化生成3*3矩陣的子產品,下面的代碼是計算Gx, Gy。(2個clk)

soble邊緣檢測算法的verilog實作
soble邊緣檢測算法的verilog實作

  這個了解起來不難,比較簡單,先用一個時鐘計算3*3矩陣每行的像素乘積,再求的卷積後的Gx,Gy,是以消耗了兩個時鐘。 (2)求Gx^2+Gy^2的結果,及Gx與Gy的平方和。(1個clk) 這一步直接通過veilog中的乘法器的描述來實作,綜合時會自動布線為片内乘法器,如下。

soble邊緣檢測算法的verilog實作

(3)求Gx^2+Gy^2的平方根。(1個clk) 強大的ALTERA在QII軟體中提供了平方根的IP核,如下所示。

soble邊緣檢測算法的verilog實作

下面給出SQRT的例化代碼:

soble邊緣檢測算法的verilog實作

(4)根據外部輸入門檻值,判斷并實作邊緣的檢測。(1個clk)

soble邊緣檢測算法的verilog實作

将post_bit_r擴充到8bit, ~{8{post_bit_r}}, 檢測到的邊緣為黑色。

soble_threshold 是外部輸入的一個人為設定的門檻值。 (5)前面幾步對圖像資料的處理總共消耗了5個時鐘,是以圖像陣列的同步信号需要延遲5個時鐘。

soble邊緣檢測算法的verilog實作

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