基於FPGA的Sobel邊緣檢測的實現


  前面我們實現了使用PC端上位機串口發送圖像數據到VGA顯示,通過MATLAB處理的圖像數據直接是灰度圖像,后面我們在此基礎上修改,從而實現,基於FPGA的動態圖片的Sobel邊緣檢測、中值濾波、Canny算子邊緣檢測、腐蝕和膨脹等。那么這篇文章我們將來實現基於FPGA的Sobel邊緣檢測。

圖像邊緣:簡言之,邊緣就是圖像灰度值突變的地方,亦即圖像在該部分的像素值變化速度非常之快,這就好比在坐標軸上一條曲線有剛開始的平滑突然來個大轉彎,在變化出的導數非常大。

  Sobel算子主要用作邊緣檢測,在技術上,它是一離散型差分算子,用來計算圖像亮度函數灰度之近似值。在圖像的恩和一點使用此算子,將會產生對應的灰度矢量或是其法矢量。

  邊緣是指其周圍像素灰度急劇變化的那些像素的集合。邊緣存在於目標、背景和區域之間,所以,他是圖像分割所以來的最重要的依據。由於邊緣是位置的標志,對灰度的變化不敏感,因此,邊緣也是圖像匹配的重要的特征。

         Sobel邊緣檢測的核心在於像素矩陣的卷積,卷積對於數字圖像處理非常重要,很多圖像處理算法都是做卷積來實現的。卷積運算的本質就是對制定的圖像區域的像素值進行加權求和的過程,其計算過程為圖像區域中的每個像素值分別與卷積模板的每個元素對應相乘,將卷積的結果作求和運算,運算到的和就是卷積運算的結果。

         卷積公式如下。

 

 

         3x3的窗口M與卷積模板C的卷積運算如下。

 

Gx和Gy是sobel的卷積因子,將這兩個因子和原始圖像做如下卷積。如圖3-22所示。

 

  Sobel卷積因子

其中A代表原始圖像。

 

 

得到圖像中的每一個點的橫向縱向灰度值Gx、Gy。最后通過如下公式來計算改點灰度的大小。

 

但是通常為了提高效率,使用不開平方的近似值,雖然這樣做會損失精度,,

 

使用並行流水線的設計思想將Sobel算子的實現划分為五個步驟,加流水線后的計算可以將整個模塊的計算提高5倍。

(1) 計算Gx與Gy與模板每行的乘積

(2) 兩個3x3矩陣的卷積即將每一行每一列對應相乘然后想加

(3) 求得3*3模板運算后的Gx、Gy

(4) 求Gx^2 + Gy^2的結果,和Gx和Gy的平方和(需要消耗兩個時鍾)

(5) 求Gx^2 + Gy^2的平方根

邊緣檢測同樣需要生成3x3矩陣而這與中值濾波和均值濾波中生成3X3矩陣的方法是完全一樣的,3X3矩陣的生成方法可以參考前面的博客:最近發現Xilinx也有自己的Shift RAM,Shift_RAM簡直就是為3X3矩陣而生的,所以這我使用Xilinx shift_RAM來實現3X3矩陣,配置如下:

 

這里Xilinx的shift_ram一次只能生成一行數據,所以我采用兩個IP Core和正在輸入的一行來生成三行數據

 

         這是我設計的模塊端口,clken為串口接收的完成標志信號,接收到的八位數據輸入,最后經過Sobel算子計算完成后,將單bit數據通過位擴展為十六位輸出。

生成3x3矩陣

 

Sobel算子與目標像素卷積

如圖所示,用生成的3x3矩陣與Sobel算子進行卷積,最后求出目標像素當前的方向梯度

最終值輸出

這里我們為了簡化工程量,所以我們采取使用開平方根的近似值,取絕對值相加,雖然這樣做會損失精度。

 

通過開平根的運算后,我們設置一個閾值,當該像素點的值小於閾值輸出為0,當像素點的值大於閾值輸出為1,最后將單bit的數據進行位擴充輸出給VGA顯示。顯示視頻效果圖:http://t.cn/RN7tODe

         最后我將閾值設置為150,最終測試lena圖片顯示如上,可以看出我們將屬於lena邊緣的部分顯示為黑,其余部分顯示為百,這樣就可以很清楚的看到圖像的邊緣,這對后面我們要進行圖像分割、識別打下了夯實的基礎,這樣看來我們的Sobel邊緣檢測是正確的,邊緣捕捉的效果還是不錯的呢!

         最后基於FPGA的Sobel邊緣檢測源碼博主在這里就不暫時不提供了,前面已經提供了三個算法的工程源碼,基本圖像處理算法的思路已經教給大家了,而且Sobel還是本科畢業設計的熱門題目,這一套所持有的價值,我見過最便宜的是賣五百塊人民幣,所以如果大家能夠自己調試出來那么你也就可以代人做畢業設計賺錢了,如果前面的那些基礎課程大家都完全掌握了,這個Sobel邊緣檢測算法的思路我也已經提供了,那么我覺得肯定能通過自己的方法將Sobel調試出來,在學習的過程中歡迎和我一起討論學習。下一篇呢,我會將中值濾波和Sobel邊緣檢測同時做在一起,圖片進過中值濾波后再進行Sobel邊緣檢測。看看最后的邊緣檢測的效果會不會更好呢!

  如果你想獲得本文的所有課件,請關注本人的個人微信訂閱號:開源FPGANingHeChuan或掃描下方二維碼關注訂閱號,在后台回復圖像處理,即可獲得本文的所有課件、資料以及更多FPGA的學習資料哦!

 

轉載請注明出處:NingHeChuan(寧河川)

個人微信訂閱號:開源FPGANingHeChuan

如果你想及時收到個人撰寫的博文推送,可以掃描左邊二維碼(或者長按識別二維碼)關注個人微信訂閱號

知乎ID:NingHeChuan

微博ID:NingHeChuan

原文地址:http://www.cnblogs.com/ninghechuan/p/7448924.html 

 

 

圖像處理系列文章

第一篇:基於FPGA的VGA顯示靜態圖片

第二篇:基於FPGA的RGB565_YCbCr_Gray算法實現

第三篇:基於FPGA的Uart接收圖像數據至VGA顯示

番外篇:數字圖像處理界標准圖像 Lena 后面的故事

第四篇:基於FPGA的均值濾波算法實現

第五篇:深刻認識shift_ram IP core——圖像處理學習筆記

第六篇:基於FPGA的中值濾波算法實現 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM