1. 程式人生 > >基於FPGA的Sobel邊緣檢測的實現

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

二維 技術分享 所有 之間 個人 .html 題目 擴展 坐標軸

  前面我們實現了使用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的中值濾波算法實現

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