0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FPGA图像处理的Sobel边缘检测

FPGA之家 来源:似猿非猿的FPGA 作者:似猿非猿的FPGA 2021-03-22 09:45 次阅读

Sobel边缘检测

Sobel边缘检测原理教材网上一大堆,核心为卷积处理。

Sobel卷积因子为:

587a489a-8924-11eb-8b86-12bb97331649.png

该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。如果以A代表原始图像,Gx及Gy分别代表经横向及纵向边缘检测的图像灰度值,其公式如下:

589be176-8924-11eb-8b86-12bb97331649.png

图像的每一个像素的横向及纵向灰度值通过以下公式结合,来计算该点灰度的大小:

58c78876-8924-11eb-8b86-12bb97331649.png

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

5903a144-8924-11eb-8b86-12bb97331649.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的,可以完美实现整个仿真验证流程:从图片直接获取数据,然后进行仿真验证,仿真结果直接再次生成图片。

原文标题:FPGA图像处理——老戏新说

文章出处:【微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1629

    文章

    21736

    浏览量

    603216
  • 仿真
    +关注

    关注

    50

    文章

    4080

    浏览量

    133585

原文标题:FPGA图像处理——老戏新说

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV

    图像中的特征或者创建掩码。 边缘检测 Canny 边缘检测 (cv2.Canny) 或 Sobel
    发表于 12-14 09:31

    友思特方案 精析“蝉翼”:FPGA图像处理方案助力锂电池高速产线检测新升级

    为新能源锂电行业赋能第二站:FPGA高精度图像采集与处理解决方案! 薄如蝉翼的锂电池薄膜材料在高速产线上生产而成,实时检测并精准分析其质量,依托于友思特
    的头像 发表于 12-04 15:56 146次阅读
    友思特方案  精析“蝉翼”:<b class='flag-5'>FPGA</b><b class='flag-5'>图像</b><b class='flag-5'>处理</b>方案助力锂电池高速产线<b class='flag-5'>检测</b>新升级

    FPGA 实时信号处理应用 FPGA图像处理中的优势

    优势之一是其并行处理能力。与传统的CPU或GPU相比,FPGA可以同时执行多个操作,这在图像处理中尤为重要,因为图像
    的头像 发表于 12-02 10:01 488次阅读

    FPGA图像处理领域的优势有哪些?

    FPGA(Field Programmable Gate Array,现场可编程门阵列)在图像处理领域具有显著的优势,这些优势主要体现在以下几个方面: 一、高并行处理能力
    发表于 10-09 14:36

    基于 DSP5509 进行数字图像处理Sobel 算子边缘检测的硬件连接威廉希尔官方网站 图

    使用 FPGA 或专用的图像处理芯片与 DSP5509 协同工作,提高边缘检测的速度。 并行处理
    发表于 09-25 15:25

    DSP国产教学实验箱_实验案例_操作教程:5-11 边缘检测

    搜索,可到达的点是边缘,不可到达的点不是边缘。 (5)利用滞后技术来跟踪边界。 程序流程设计 程序流程设计中首先要读取工程目录下的BMP图像,接着进行边缘
    发表于 07-19 10:38

    图像边缘检测系统的设计流程

    图像边缘检测系统的设计流程是一个涉及多个步骤的复杂过程,它旨在从图像中提取出重要的结构信息,如边界、轮廓等。这些边缘信息对于
    的头像 发表于 07-17 16:39 353次阅读

    图像识别算法都有哪些方法

    传统方法和基于深度学习的方法。 传统图像识别算法 1.1 边缘检测 边缘检测图像识别的基础,它
    的头像 发表于 07-16 11:14 5558次阅读

    opencv图像识别有什么算法

    图像识别算法: 边缘检测边缘检测图像识别中的基本步骤之一,用于识别
    的头像 发表于 07-16 10:40 1037次阅读

    图像处理中的卷积运算

    卷积运算是图像处理中一种极其重要的操作,广泛应用于图像滤波、边缘检测、特征提取等多个方面。它基于一个核(或称为卷积核、滤波器)与
    的头像 发表于 07-11 15:15 2280次阅读

    FPGA设计经验之图像处理

    系列:基于 FPGA图像边缘检测系统设计(sobel算法) FPGA设计中 Verilo
    发表于 06-12 16:26

    基于FPGA的实时边缘检测系统设计,Sobel图像边缘检测FPGA图像处理

    的主要特征提取手段 。由于实时视频图像边缘检测需要处理的数据量非常大,所以采用一般的软件方法实现起来处理速度慢,无法满足实时性的要求。 随
    发表于 05-24 07:45

    算法系列:基于 FPGA图像边缘检测系统设计(sobel算法)

    今天给大侠带来基于 FPGA图像边缘检测设计,话不多说,上货。 设计流程如下:mif文件的制作→ 调用 ip 核生成rom以及仿真注意问题→ 灰度
    发表于 03-26 16:40

    FPGA图像处理之CLAHE算法

    FPGA图像处理--CLAHE算法(一)中介绍了为啥要用CLAHE算法来做图像增强。
    的头像 发表于 01-04 12:23 2531次阅读
    <b class='flag-5'>FPGA</b><b class='flag-5'>图像</b><b class='flag-5'>处理</b>之CLAHE算法

    为什么不能直接对RGB图做直方图均衡化

    相信好多人在开始学习FPGA图像处理的时候都是接触的RGB转灰度图,Sobel图像检测,直方图均
    的头像 发表于 01-02 09:41 1175次阅读
    为什么不能直接对RGB图做直方图均衡化