在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

淺述Sobel算子在HLS上的實現教程

FPGA之家 ? 來源:FPGA科技室 ? 作者:FPGA科技室 ? 2021-07-23 14:53 ? 次閱讀

Sobel 原理介紹

索貝爾算子(Sobel operator)主要用作邊緣檢測,在技術上,它是一離散性差分算子,用來運算圖像亮度函數的灰度之近似值。在圖像的任何一點使用此算子,將會產生對應的灰度矢量或是其法矢量Sobel 卷積因子為:

31c07d38-e10c-11eb-9e57-12bb97331649.png

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

31c8e838-e10c-11eb-9e57-12bb97331649.png

具體計算如下:

Gx = (-1)*f(x-1, y-1) + 0*f(x,y-1) + 1*f(x+1,y-1)

+(-2)*f(x-1,y) + 0*f(x,y)+2*f(x+1,y)

+(-1)*f(x-1,y+1) + 0*f(x,y+1) + 1*f(x+1,y+1)

= [f(x+1,y-1)+2*f(x+1,y)+f(x+1,y+1)]-[f(x-1,y-1)+2*f(x-1,y)+f(x-1,y+1)]

Gy =1* f(x-1, y-1) + 2*f(x,y-1)+ 1*f(x+1,y-1)

+0*f(x-1,y) 0*f(x,y) + 0*f(x+1,y)

+(-1)*f(x-1,y+1) + (-2)*f(x,y+1) + (-1)*f(x+1, y+1)

= [f(x-1,y-1)+2f(x,y-1)+f(x+1,y-1)]-[f(x-1, y+1) + 2*f(x,y+1)+f(x+1,y+1)]

其中 f(a,b), 表示圖像(a,b)點的灰度值;

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

31d47bf8-e10c-11eb-9e57-12bb97331649.png

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

31de8f8a-e10c-11eb-9e57-12bb97331649.png

Sobel 算子根據像素點上下、左右鄰點灰度加權差,在邊緣處達到極值這一現象檢測邊緣。對噪聲具有平滑作用,提供較為精確的邊緣方向信息,邊緣定位精度不夠高。當對精度要求不是很高時,是一種較為常用的邊緣檢測方法。

Sobel 算子在 HLS 上的實現

工程創建

Step1:打開 Vivado HLS 開發工具,單擊 Creat New Project 創建一個新工程,設置好工程路徑和工程名,一直點擊 Next 按照默認設置

Step2:出現如下圖所示界面,時鐘周期 Clock Period 按照默認 10ns,Uncertaintly 和 Solution Name 均按照默認設置,點擊紅色箭頭部分選擇芯片類型,然后點擊 OK。

點擊 Finish,出現如下界面

32508d6a-e10c-11eb-9e57-12bb97331649.png

Step4:右單擊 Source 選項,選擇 New File,創建一個名為 Top.cpp 的文件。(一定要加cpp后綴)

Step5:打開剛剛新建的cpp文件,進入編輯狀態,輸入以下代碼

325a9c06-e10c-11eb-9e57-12bb97331649.png

Top.cpp代碼

#include “top.h”

void hls_sobel(AXI_STREAM& INPUT_STREAM, AXI_STREAM&

OUTPUT_STREAM, int rows, int cols)

{

//Create AXI streaming interfaces for the core

#pragma HLS INTERFACE axis port=INPUT_STREAM

#pragma HLS INTERFACE axis port=OUTPUT_STREAM

#pragma HLS RESOURCE core=AXI_SLAVE variable=rows metadata=“- bus_bundle CONTROL_BUS”

#pragma HLS RESOURCE core=AXI_SLAVE variable=cols metadata=“-bus_bundle CONTROL_BUS”

#pragma HLS RESOURCE core=AXI_SLAVE variable=return metadata=“-bus_bundle CONTROL_BUS”

#pragma HLS INTERFACE ap_stable port=rows

#pragma HLS INTERFACE ap_stable port=cols

RGB_IMAGE img_0(rows, cols);

RGB_IMAGE img_1(rows, cols);

RGB_IMAGE img_2(rows, cols);

RGB_IMAGE img_3(rows, cols);

RGB_IMAGE img_4(rows, cols);

RGB_IMAGE img_5(rows, cols);

RGB_PIXEL pix(50, 50, 50);

#pragma HLS dataflow

hls::AXIvideo2Mat(INPUT_STREAM, img_0);

hls::Sobel《1,0,3》(img_0, img_1);

hls::SubS(img_1, pix, img_2);

hls::Scale(img_2, img_3, 2, 0);

hls::Erode(img_3, img_4);

hls::Dilate(img_4, img_5);

hls::Mat2AXIvideo(img_5, OUTPUT_STREAM)

}

Step6:再在 Source 中添加一個名為 Top.h 的庫函數,并添加如下程序:

32656f00-e10c-11eb-9e57-12bb97331649.png

Top.h代碼

#ifndef TOP_H

#define TOP_H

#include “hls_video.h”

// maximum image size

#define MAX_WIDTH 512

#define MAX_HEIGHT 512

// I/O Image Settings

#define INPUT_IMAGE “lena.jpg”

#define OUTPUT_IMAGE “result.jpg”

#define OUTPUT_IMAGE_GOLDEN “result_golden.jpg”

// typedef video library core structures

typedef hls::stream《ap_axiu《32,1,1,1 style=“font-size: inherit;color: inherit;line-height: inherit;”》》 AXI_STREAM;

typedef hls::Scalar《3, unsigned char》 RGB_PIXEL;

typedef hls::MatRGB_IMAGE;

// top level function for HW synthesis

void hls_sobel(AXI_STREAM& src_axi, AXI_STREAM& dst_axi, int rows, int cols);

#endif《/ap_axiu《32,1,1,1》

Step7:在 Test Bench 中,用同樣的方法添加一個名為 Test.cpp 的測試程序。添加如下代碼:

326e7546-e10c-11eb-9e57-12bb97331649.png

Test.cpp代碼

#include “top.h”

#include “opencv_top.h”

using namespace std;

using namespace cv;

int main (int argc, char** argv)

{

//獲取圖像數據

IplImage* src = cvLoadImage(INPUT_IMAGE);

IplImage* dst = cvCreateImage(cvGetSize(src), src-》depth, src-》nChannels);

//使用HLS庫進行處理

AXI_STREAM src_axi, dst_axi;

IplImage2AXIvideo(src, src_axi);

hls_sobel(src_axi, dst_axi, src-》height, src-》width);

AXIvideo2IplImage(dst_axi, dst);

cvSaveImage(OUTPUT_IMAGE,dst);

cvShowImage(“hls_dst”, dst);

//使用OPENCV庫進行處理

opencv_image_filter(src, dst);

cvShowImage(“cv_dst”, dst);

cvSaveImage(OUTPUT_IMAGE_GOLDEN,dst);

waitKey(0);

//釋放內存

cvReleaseImage(&src);

cvReleaseImage(&dst);

}

Step8:用同樣的方法,再在 Test Bench 中創建一個 opencv_top.cpp 和 opencv_top.h 文件,添加如下程序:

3278679a-e10c-11eb-9e57-12bb97331649.png

Opencv_top.cpp代碼

#include “opencv_top.h”

#include “top.h”

void opencv_image_filter(IplImage* src, IplImage* dst)

{

IplImage* tmp = cvCreateImage(cvGetSize(src), src-》depth, src-》nChannels);

cvCopy(src, tmp);

cv::Mat)tmp, (cv::Mat)dst, -1, 1, 0);

cvSubS(dst, cvScalar(50,50,50), tmp);

cvScale(tmp, dst, 2, 0);

cvErode(dst, tmp);

cvDilate(tmp, dst);

cvReleaseImage(&tmp);

}

void sw_image_filter(IplImage* src, IplImage* dst)

{

AXI_STREAM src_axi, dst_axi;

IplImage2AXIvideo(src, src_axi);

hls_sobel(src_axi, dst_axi, src-》height, src-》width);

AXIvideo2IplImage(dst_axi, dst);

}

opencv_top.h代碼

#ifndef OPENCV_TOP_H___ #define ___OPENCV_TOP_H

#include “hls_opencv.h”

void opencv_image_filter(IplImage* src, IplImage* dst);

void sw_image_filter(IplImage* src, IplImage* dst);

#endif

Step7:在 Test Bench 中添加一張名為 lena.jpg的測試圖片

接下來對工程進行編譯和仿真

Step1:單擊 Project-Project settings 或直接單擊快捷按鈕。

329dac1c-e10c-11eb-9e57-12bb97331649.png

Step2:選擇 Synthesis 選項,然后點擊 Browse.。指定一個頂層函數,選定 hls_sobel 為頂層函數,

單擊 開始綜合

32b39afe-e10c-11eb-9e57-12bb97331649.png

在協議類型里面我們可以看到我們主要使用了三種協議,分別是 axis、ap_stable 和 ap_ctrl_hs 三種,這些協議的詳細解釋我們均可以在官方手冊 ug902 中找到,其中 ap_ctrl_hs 的時序操作如下圖所示,說簡單點就是復位完成等待 ap_start 信號開始進行操作

綜合完畢,我們對代碼進行仿真測試,單擊 開始仿真

33ed078e-e10c-11eb-9e57-12bb97331649.png

仿真結果如下,與通過 OPENCV 實現的 Sobel 檢測結果基本一致。

33f6f532-e10c-11eb-9e57-12bb97331649.png

編輯:jq

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

    關注

    0

    文章

    12

    瀏覽量

    8020

原文標題:Sobel 算子在 HLS 上的實現

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

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    Vivado HLS設計流程

    為了盡快把新產品推向市場,數字系統的設計者需要考慮如何加速設計開發的周期。設計加速主要可以從“設計的重用”和“抽象層級的提升”這兩個方面來考慮。Xilinx 推出的 Vivado HLS 工具可以
    的頭像 發表于 04-16 10:43 ?600次閱讀
    Vivado <b class='flag-5'>HLS</b>設計流程

    芯片制造中的溝道隔離工藝技術

    溝道隔離(STI)是芯片制造中的關鍵工藝技術,用于半導體器件中形成電學隔離區域,防止相鄰晶體管之間的電流干擾。本文簡單介紹溝道隔離技術的作用、材料和步驟。
    的頭像 發表于 03-03 10:00 ?1391次閱讀
    芯片制造中的<b class='flag-5'>淺</b>溝道隔離工藝技術

    FPGA的圖像處理算法集成與優化

    本文詳細介紹了多種圖像處理技術,包括RG/GB單通道提取、亮度和對比度調整、圖像反轉、均值濾波、高斯濾波、圖像銳化、中值濾波、閾值分割、邊緣檢測(Sobel算子)、圖像膨脹與腐蝕、開運算與閉運算
    的頭像 發表于 02-14 13:46 ?516次閱讀
    FPGA<b class='flag-5'>上</b>的圖像處理算法集成與優化

    使用HLS流程設計和驗證圖像信號處理設備

    STMicroelectronics成像部門負責向消費者、工業、安全和汽車市場提供創新的成像技術和產品。該團隊精心制定了一套通過模板實現的High-Level Synthesis(HLS)高層次綜合流程,使得上述產品能夠迅速上市。對于汽車市場,該流程符合ISO 26262
    的頭像 發表于 01-08 14:39 ?580次閱讀
    使用<b class='flag-5'>HLS</b>流程設計和驗證圖像信號處理設備

    深居出AutoCAD二次開發

    深居出AutoCAD二次開發,net版
    發表于 01-06 14:12 ?6次下載

    MATLA B助力數字與模擬芯片設計:高效實現HLS、UCIe和UVM

    ? 本文將分享 MathWorks 參與 中國集成電路設計業高峰論壇暨展覽會 ICCAD-Expo 的展臺展示以及發表主題演講《MATLAB 加速數字和模擬芯片設計--高效實現 HLS、UCIe
    的頭像 發表于 12-20 11:11 ?612次閱讀
    MATLA B助力數字與模擬芯片設計:高效<b class='flag-5'>實現</b><b class='flag-5'>HLS</b>、UCIe和UVM

    助力AIoT應用:米爾FPGA開發板實現Tiny YOLO V4

    受限的設備運行,尤其低功耗、實時檢測的邊緣計算設備中表現出色。相比傳統 GPU,FPGA 能在小面積和低功耗下實現類似的推理性能,非常契合 AIoT 應用。像米爾 ZU3EG 這樣的 FPGA
    發表于 12-06 17:18

    DSP實現DDR2 PCB布局布線

    電子發燒友網站提供《DSP實現DDR2 PCB布局布線.pdf》資料免費下載
    發表于 10-15 09:16 ?3次下載
    <b class='flag-5'>在</b>DSP<b class='flag-5'>上</b><b class='flag-5'>實現</b>DDR2 PCB布局布線

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

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

    優化 FPGA HLS 設計

    減少錯誤并更容易調試。然而,經常出現的問題是性能權衡。高度復雜的 FPGA 設計中實現高性能需要手動優化 RTL 代碼,而這對于HLS開發環境生成的 RTL 代碼來說是不可能的。然而,存在一些解決方案
    發表于 08-16 19:56

    摩爾線程攜手智源研究院完成基于Triton的大模型算子庫適配

    里,即成功完成了近60個算子的功能驗證,精度符合交付標準,并實現對Bert-large模型的全面支持。FlagGems算子摩爾線程MUSA架構
    的頭像 發表于 08-02 11:06 ?1299次閱讀

    多FPGA集群實現高級并行編程

    今天我們看的這篇論文介紹了多FPGA集群實現高級并行編程的研究,其主要目標是為非FPGA專家提供一個成熟且易于使用的環境,以便在多個并行運行的設備擴展高性能計算(HPC)應用。
    的頭像 發表于 07-24 14:54 ?1770次閱讀

    一種HLS中插入HDL代碼的方式

    很多人都比較反感用C/C++開發(HLS)FPGA,大家第一拒絕的理由就是耗費資源太多。但是HLS也有自己的優點,除了快速構建算法外,還有一個就是接口的生成,尤其對于AXI類接口,按照標準語法就可以很方便地生成相關接口。
    的頭像 發表于 07-16 18:01 ?1358次閱讀
    一種<b class='flag-5'>在</b><b class='flag-5'>HLS</b>中插入HDL代碼的方式

    園區智慧用電管理系統的設計與應用

    程瑜 安科瑞電氣股份有限公司 上海嘉定 201801 摘要:為解決目前園區用電管理紊亂、數據采集不便、運維智能化水平低等問題。研究搭建出園區智慧用電管理系統。本系統由網關、PC、手機、智能物聯網設備等硬件組成。利用RS-485總線通信、數據庫管理、GPRS無線傳輸等技術將智能電表、集中器、數據采集終端及云服務器連接起來進行信息交換與通訊,建立智慧用電管理系統。該系統能夠保證用電管理的高效性和性,顯著提高了物業服務的工作效率和智能
    的頭像 發表于 07-10 09:15 ?867次閱讀
    <b class='flag-5'>淺</b><b class='flag-5'>述</b>園區智慧用電管理系統的設計與應用

    ESP32-C3休眠時中斷一直觸發是怎么回事?

    目前在用ESP32-C3,用BLE 低功耗后 要啟用自動休眠,開啟了休眠之后GPIO 中斷一直不停觸發,不管設置里面內部拉 還是外部47K
    發表于 06-21 14:53
    主站蜘蛛池模板: brazzers720欧美丰满| 日韩欧美一卡二区 | 黄色视屏日本 | 日本亚洲精品成人 | 国产午夜在线观看视频播放 | 欧美video free xxxxx | 色成年激情久久综合 | 国产在线综合网 | 天天做天天爽天天谢 | 2023天天操| 日韩毛片免费视频一级特黄 | 97射射| 日产乱码免费一卡二卡在线 | 黄色片网站日本 | 淫性视频 | videosgratis乱色欧美野外 | 亚洲成人网在线 | 免费一级特黄特色大片在线观看看 | 在线种子搜索 | 国产精品一区二区三区免费视频 | 日日操夜夜操天天操 | 在线午夜影院 | 久久婷婷人人澡人人爱91 | 爱爱视频天天干 | 亚洲综合天堂网 | 午夜啪 | 午夜色片 | 在线看一区二区 | 一级国产特黄aa大片 | 日本一区二区精品88 | 色天使色婷婷丁香久久综合 | 美女被啪到哭网站在线观看 | 婷婷综合久久中文字幕 | 四虎影院精品 | 青娱乐伊人 | 一级特黄a大片免费 | 午夜激情啪啪 | 国产色爽女 | 亚洲特级毛片 | 美女被羞羞产奶视频网站 | 欧美成人免费高清网站 |