色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

SpinalHDL里如何實現Sobel邊緣檢測

FPGA之家 ? 來源:FPGA之家 ? 作者:FPGA之家 ? 2022-08-26 08:59 ? 次閱讀

書接上文,趁著今天休假,采用SpinalHDL做一個小的demo,看看在SpinalHDL里如何優雅的實現Sobel邊緣檢測

Sobel邊緣檢測

Sobel邊緣檢測原理教材網上一大堆,核心為卷積處理。

Sobel卷積因子為:

38aa8124-24d7-11ed-ba43-dac502259ad0.png

該算子包含兩組3x3的矩陣,分別為橫向及縱向,將之與圖像作平面卷積,即可分別得出橫向及縱向的亮度差分近似值。如果以A代表原始圖像,Gx及Gy分別代表經橫向及縱向邊緣檢測的圖像灰度值,其公式如下:

38bd3ef4-24d7-11ed-ba43-dac502259ad0.png

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

38cce78c-24d7-11ed-ba43-dac502259ad0.png

通常,為了提高效率使用不開平方的近似值:

38de788a-24d7-11ed-ba43-dac502259ad0.png

最后,當計算出來的值大于某一閾值時即認為為邊緣像素點。

歸結起來,Sobel邊緣檢測分為三大步:卷積計算、灰度計算、閾值比較處理。結合上文實現的bufWindow,在SpinalHDL里實現Sobel邊緣檢測也就幾行代碼的事情(如果是寫Verilog我還是拒絕的)。

卷積計算

通過bufWindow,我們可以得到一個3x3的矩陣窗口,拿到結果第一步即是計算卷積,由于卷積因子是帶符號的,而在做卷積時又需要考慮位寬擴展的事情,在寫Verilog時還是需要小心的設計下的,而在SpinalHDL里,兩行代碼:

val Gx=(windowbuf.io.dataOut.payload(0)(2).expand.asSInt-^windowbuf.io.dataOut.payload(0)(0).expand.asSInt)+|      ((windowbuf.io.dataOut.payload(1)(2).expand.asSInt-^windowbuf.io.dataOut.payload(1)(0).expand.asSInt)<<1)+|      (windowbuf.io.dataOut.payload(2)(2).expand.asSInt-^windowbuf.io.dataOut.payload(2)(0).expand.asSInt)val Gy=(windowbuf.io.dataOut.payload(0)(0).expand.asSInt-^windowbuf.io.dataOut.payload(2)(0).expand.asSInt)+|       ((windowbuf.io.dataOut.payload(0)(1).expand.asSInt-^windowbuf.io.dataOut.payload(2)(1).expand.asSInt)<<1)+|       (windowbuf.io.dataOut.payload(0)(2).expand.asSInt-^windowbuf.io.dataOut.payload(2)(2).expand.asSInt)

首先將bufWindow輸出的窗口矩陣值擴展一位位寬轉換為有符號值,然后進行計算卷積。計算卷積運用了兩個運算符“-^”,"+|"來處理加減運算時的位寬處理(可參照SpinalHDL手冊或本公眾號的《SpinalHDL—數據類型:UInt/SIn》)。最終得到Gx、Gy。

灰度計算

灰度計算這里采用近似值,通過取絕對值的方式進行實現,在SpinalHDL里也就一行代碼的事情:

sobelResult.payload:= (sobelConv.payload(0).abs+| sobelConv.payload(1).abs).fixTo(cfg.dataWidth-1 downto 0,RoundType.ROUNDUP)
由于在卷積計算時有擴展位寬,這里計算最后調用fixTo進行高位飽和處理。最終得到位寬與輸入保持一致(想想你在Veirlog里實現這一步要做多少事情,少年)。

閾值比較

閾值比較就很簡單了,比較兩個值大小取兩個極端:

when(sobelResult.payload>io.thresholdValue){      io.dataOut.payload:=(default->true)    }otherwise{      io.dataOut.payload:=(default->false)    }
最終實現Sobel邊緣檢測代碼如下:

case class sobelProc(cfg:lineBufferCfg) extends Component{  require(cfg.lineNum==3)  val io=new Bundle{    val thresholdValue =in UInt(cfg.dataWidth bits)    val dataIn=slave Flow(UInt(cfg.dataWidth bits))    val dataOut=master Flow(UInt(cfg.dataWidth bits))    dataOut.valid.setAsReg().init(False)    dataOut.payload.setAsReg().init(0)  }  noIoPrefix()  val sobel=new Area{    val windowbuf=bufWindow(cfg)    val sobelConv=Reg(Flow(Vec(SInt(),2)))    val sobelResult=Reg(Flow(UInt(cfg.dataWidth bits)))    sobelConv.valid.init(False)    sobelResult.valid.init(False)    io.dataIn<>windowbuf.io.dataIn    val Gx=(windowbuf.io.dataOut.payload(0)(2).expand.asSInt-^windowbuf.io.dataOut.payload(0)(0).expand.asSInt)+|      ((windowbuf.io.dataOut.payload(1)(2).expand.asSInt-^windowbuf.io.dataOut.payload(1)(0).expand.asSInt)<<1)+|      (windowbuf.io.dataOut.payload(2)(2).expand.asSInt-^windowbuf.io.dataOut.payload(2)(0).expand.asSInt)    val Gy=(windowbuf.io.dataOut.payload(0)(0).expand.asSInt-^windowbuf.io.dataOut.payload(2)(0).expand.asSInt)+|           ((windowbuf.io.dataOut.payload(0)(1).expand.asSInt-^windowbuf.io.dataOut.payload(2)(1).expand.asSInt)<<1)+|           (windowbuf.io.dataOut.payload(0)(2).expand.asSInt-^windowbuf.io.dataOut.payload(2)(2).expand.asSInt)    sobelConv.valid:=windowbuf.io.dataOut.valid    sobelConv.payload(0):=Gx    sobelConv.payload(1):=Gy    sobelResult.valid:=sobelConv.valid    sobelResult.payload:= (sobelConv.payload(0).abs+| sobelConv.payload(1).abs).fixTo(cfg.dataWidth-1 downto 0,RoundType.ROUNDUP)    io.dataOut.valid:=sobelResult.valid    when(sobelResult.payload>io.thresholdValue){      io.dataOut.payload:=(default->true)    }otherwise{      io.dataOut.payload:=(default->false)}  }}
區區不到四十行代碼,簡潔而優雅,基本上就是描述算法,出錯概率應該很小吧!

仿真

做圖像處理的小伙伴想想在做仿真驗證時需要怎么搞,matlab生成灰度圖像二進制數據放在文件里,然后仿真時再導入,仿真完成后將結果保存到文件里,最后再在matlab里做對比。 太麻煩。SpinalHDL提供了仿真支持,而SpinalHDL是基于Scala的,可以完美實現整個仿真驗證流程:從圖片直接獲取數據,然后進行仿真驗證,仿真結果直接再次生成圖片。

審核編輯:彭靜
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Verilog
    +關注

    關注

    28

    文章

    1351

    瀏覽量

    110077
  • 代碼
    +關注

    關注

    30

    文章

    4779

    瀏覽量

    68525
  • sobel
    +關注

    關注

    0

    文章

    12

    瀏覽量

    7904

原文標題:FPGA圖像處理——老戲新說

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    基于FPGA的Sobel邊緣檢測工作原理

    Sobel 邊緣檢測的工作原理是檢測圖像在水平和垂直方向上的梯度變化。為此,將兩個卷積濾波器應用于原始圖像,然后組合這些卷積濾波器的結果以確定梯度的大小。
    發表于 12-14 11:34 ?1425次閱讀

    基于FPGA的實時邊緣檢測系統設計,Sobel圖像邊緣檢測,FPGA圖像處理

    60 為閾值得到圖8(a)和(b)。 通過對比可以看出,使用 FPGA 進行Sobel邊緣檢測能夠實現與 MATLAB 相近的檢測效果,驗
    發表于 05-24 07:45

    基于 DSP5509 進行數字圖像處理中 Sobel 算子邊緣檢測的硬件連接電路圖

    以下是基于 DSP5509 進行數字圖像處理中 Sobel 算子邊緣檢測的硬件設計方案: 一、總體架構 圖像采集:使用合適的圖像傳感器,如 CMOS 傳感器,通過相應的接口(如 SPI、I2C 等
    發表于 09-25 15:25

    關于圖像邊緣檢測器的VHDL的實現該怎么下手,求大神指教!

    準備要做一個以VHDL實現圖像邊緣檢測器,用的是sobel算子,不怎么會寫VHDL的代碼,請各路大神指教,感激不盡!
    發表于 12-02 18:58

    基于FPGA的Sobel邊緣檢測實現

    我們在此基礎上修改,從而實現,基于FPGA的動態圖片的Sobel邊緣檢測、中值濾波、Canny算子邊緣
    發表于 08-29 15:41

    基于FPGA的邊緣檢測Sobel算法

    轉帖摘要: 針對嵌入式軟件無法滿足數字圖像實時處理速度問題,提出用硬件加速器的思想,通過FPGA實現Sobel邊緣檢測算法。通過乒乓操作、并行處理數據和流水線設計,大大提高算法的處理速
    發表于 11-29 08:57

    Labview圖像處理——邊緣檢測

    邊緣的灰度值過度較為明顯,梯度算子可以得到較好的邊緣檢測結果。邊緣提取其實也是一種濾波,不同的算子有不同的提取效果。比較常用的方法有三種,Sobel
    發表于 12-01 12:16

    邊緣檢測的幾種微分算子

    一、邊緣檢測邊緣檢測的幾種微分算子:一階微分算子:Roberts、Sobel、Prewitt二階微分算子:Laplacian、Log/Mar
    發表于 07-26 08:29

    【米爾MYS-8MMX開發板免費試用】-VI.Sobel邊緣檢測(ZMJ)

    【米爾MYS-8MMX開發板】-VI.Sobel邊緣檢測(ZMJ)1.功能簡介本案例使用 GStreamer API 通過 ARM Cotrex-A53 從 USB 攝像頭獲取 MJPEG 格式視頻
    發表于 09-10 15:41

    SpinalHDL實現優雅的添加待跟蹤波形信號

    SpinalHDL,我們一樣可以實現優雅的添加待跟蹤波形信號。姿勢一在Verilog代碼,我們想要添加波形跟蹤信號時往往在待跟蹤信號上添加廠商約束原語,如下所示:so easy!貌
    發表于 06-22 14:37

    迅為iTOP-RK3568開發板Sobel 算子邊緣檢測

    ,是最為常用的邊緣檢測算子,但是得到的邊緣較粗,可能出現偽邊緣。 cv2.Sobel 函數功能: 使用
    發表于 09-18 10:27

    sobel_FPGA l邊緣檢測

    sobel_FPGA l邊緣檢測.源代碼。
    發表于 05-03 16:42 ?9次下載

    基于CORDIC的高速Sobel算法實現

    為提高圖像邊緣檢測的處理速度,提出一種基于CORDIC的高速Sobel算法實現
    的頭像 發表于 10-05 09:54 ?3561次閱讀
    基于CORDIC的高速<b class='flag-5'>Sobel</b>算法<b class='flag-5'>實現</b>

    FPGA圖像處理的Sobel邊緣檢測

    Sobel邊緣檢測 Sobel邊緣檢測原理教材網上一大堆,核心為卷積處理。
    的頭像 發表于 03-22 09:45 ?2956次閱讀
    FPGA圖像處理的<b class='flag-5'>Sobel</b><b class='flag-5'>邊緣</b><b class='flag-5'>檢測</b>

    Sobel算子原理介紹與實現方法

    索貝爾算子(Sobel operator)主要用作邊緣檢測,在技術上,它是一離散性差分算子,用來運算圖像亮度函數的灰度之近似值。在圖像的任何一點使用此算子,將會產生對應的灰度矢量或是其法矢量S
    的頭像 發表于 07-21 17:27 ?1.3w次閱讀
    主站蜘蛛池模板: CHINA篮球体育飞机2023| 俄罗斯大白屁股| 国产99视频在线观看| 花季v3.0.2黄在线观看| 欧美成人精品高清在线观看| 乌克兰16~18sex| 6080yy亚洲久久无码| 国产精品99久久久久久动态图| 久久热精品18国产| 深夜释放自己在线观看| 再插深点嗯好大好爽| 国产AV高清怡春院| 啦啦啦 中文 中国 免费 高清在线| 日韩精品在线观看免费| 一个人的免费高清影院| 俄罗斯xxxxxbbbbb| 久久午夜免费视频| 午夜AV亚洲一码二中文字幕青青| 在线日本v二区不卡| 国产精品久久久久久免费字体| 麻婆豆腐传媒视频免费| 香蕉久久一区二区三区啪啪| 97午夜伦伦电影理论片| 国产一区二区波多野结衣| 青青精品视频国产| 岳的奶大又白又胖| 国产免费麻传媒精品国产AV| 欧美一级久久久久久久久大| 影音先锋av色咪影院| 国产精人妻无码一区麻豆| 欧美videqsdesex0| 亚洲精品无码午夜福利在线观看| 哺乳溢出羽月希中文字幕| 久久精品中文字幕有码日本| 小寡妇好紧进去了好大看视频| xnxx高中生| 美女丝袜夹b| 一个人在线观看免费视频| 国产精品一区二区AV交换 | 日本日本熟妇中文在线视频| 一本道色播|