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

来源:http://www.cnblogs.com/ninghechuan/archive/2017/09/11/7448924.html
-Advertisement-
Play Games

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • C++遠征之封裝篇(上)筆記 所有內容都是聽課筆記,願課堂視頻如下: C++遠征之封裝篇(上)-慕課網http://www.imooc.com/learn/382 類和對象 1 什麼是類,什麼是對象? 對象是具體的事物,而類是出於不同的目的從對象中抽象出來的,所以,同一事物可以抽象成不同的類。 舉個 ...
  • 摘要:ThinkPHP是一個小型網站很常用的低端框架,但是不專業的文檔和編碼導致使用者很容易只知其表不知其里。這裡僅就官方文檔中未曾提及的在thinkphp中使用jquery實現ajax非同步交互略作總結。 環境:ThinkPHP3.2.3,jQuery 閱讀目錄: 正文: 在一般的網站中,都需要用到 ...
  • 這是一個高級Java面試系列題中的第一部分。這一部分論述了可變參數,斷言,垃圾回收,初始化器,令牌化,日期,日曆等等Java核心問題。 1. 什麼是可變參數? 可變參數允許調用參數數量不同的方法。請看下麵例子中的求和方法。此方法可以調用1個int參數,或2個int參數,或多個int參數。 //int ...
  • 1、首先在MyEclipse菜單欄找到"windows"下拉菜單中找到首選項(英文Prefenerces),彈出首選項界面。 2、打開java ——>editor > templates 就出現了templates界面 3、然後點擊右上角的"new",按鈕創建你的組合鍵,在"Name"處輸入你的快捷 ...
  • 剛開始先從最簡單的爬蟲邏輯入手 爬蟲最簡單的解析面真的是這樣 這隻是一個函數而已 那麼在下麵加上: 哈哈,搞定 就是這麼一個爬蟲了 太神奇 但是得到的只是網頁的html頁面的東西 而且還沒篩選 那麼就篩選吧 那就用上面的來解析一下我的博客園 解析的是<a>...</a>之間的東西 看起來還不錯吧 我 ...
  • 詳細說明:http://php.662p.com/thread-1023-1-1.html ...
  • 或許您正在使用 REST 端點(endpoint)來擺脫 Web 服務和客戶端。如果您是一名 Java 開發人員,您可能已經嘗試過 JAX-RS、Spring REST 或者兩者。但哪一個好用呢?在這篇文章中,我將介紹兩者之間的差異,使用大體相同的代碼進行對比。在之後的博文中,我將向您展示如何輕鬆地... ...
  • 測試代碼放在兩個地方纔有效果,一個是模塊開頭,一個是函數聲明語句的下一行 doctest 的概念模型 在python的官方文檔中,對doctest是這樣介紹的: doctest模塊會搜索那些看起來像是python互動式會話中的代碼片段,然後嘗試執行並驗證結果。 從名字上是否會讓你聯想到docstri... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...