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
    +关注

    关注

    1656

    文章

    22298

    浏览量

    630457
  • 仿真
    +关注

    关注

    53

    文章

    4411

    浏览量

    137679

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于FPGA的肤色检测方案简介

    的白色区域扩大,从而抵消腐蚀操作对图像带来的变化。通过腐蚀和膨胀,可以在几乎不改变图像的前提下消除干扰,提高肤色检测准确度。其效果如下所示: 在FPGA中,实现腐蚀和膨胀操作最主要
    发表于 10-28 07:07

    光纤图像处理卡设计原理图:520-基于ZU15EG 适配AWR2243的雷达验证底板 XCZU15EG架构高速信号处理

    高速信号处理, FPGA光纤, 光纤图像处理, XCZU15EG架构
    的头像 发表于 08-28 10:39 422次阅读
    光纤<b class='flag-5'>图像</b><b class='flag-5'>处理</b>卡设计原理图:520-基于ZU15EG 适配AWR2243的雷达验证底板 XCZU15EG架构高速信号<b class='flag-5'>处理</b>板

    友思特方案 | FPGA 加持,友思特图像采集卡高速预处理助力视觉系统运行提速增效

    图像处理图像处理关键中间环节,通过优化传感器到主机的数据传输处理为后续减负。其算法依托硬件执行,搭载 
    的头像 发表于 08-20 09:18 605次阅读
    友思特方案 | <b class='flag-5'>FPGA</b> 加持,友思特<b class='flag-5'>图像</b>采集卡高速预<b class='flag-5'>处理</b>助力视觉系统运行提速增效

    FPGA 加持,友思特图像采集卡高速预处理助力视觉系统运行提速增效

    图像处理图像处理关键环节,可优化数据传输、减轻主机负担,其算法可在FPGA等硬件上执行。友思特FPG
    的头像 发表于 08-13 17:41 803次阅读
    <b class='flag-5'>FPGA</b> 加持,友思特<b class='flag-5'>图像</b>采集卡高速预<b class='flag-5'>处理</b>助力视觉系统运行提速增效

    AI 边缘计算网关:开启智能新时代的钥匙​—龙兴物联

    智能化决策的关键。卷积神经网络在图像识别方面表现卓越,在智能工厂产品质量检测中,能快速准确识别产品缺陷;循环神经网络擅长处理时间序列数据,可对设备故障进行精准预测。 在通信技术与协议支持上,AI
    发表于 08-09 16:40

    基于LockAI视觉识别模块:C++轮廓检测

    本文档展示了如何使用 OpenCV 进行图像处理和特征检测,包括边缘检测、直线检测、圆
    发表于 05-22 10:05

    FPGA新品】正点原子L22开发板来了!采用紫光的Logos系列FPGA,适合工业控制、图像处理、高速通信等领域!

    FPGA新品】正点原子L22开发板来了!采用紫光的Logos系列FPGA,适合工业控制、图像处理、高速通信等领域! ATK-L22开发板采用紫光的Logos系列
    发表于 04-21 17:28

    芯有灵犀智创未来,基于中科亿海微FPGA实现图像处理系统及应用——第九届集创赛中科亿海微杯赛题解析

    进行定制化配置。中科亿海微FPGA图像处理系统具有并行计算能力和可重构特性,在实时图像处理领域具有显著优势,广泛应用于工业
    的头像 发表于 02-21 17:26 1951次阅读
    芯有灵犀智创未来,基于中科亿海微<b class='flag-5'>FPGA</b>实现<b class='flag-5'>图像</b><b class='flag-5'>处理</b>系统及应用——第九届集创赛中科亿海微杯赛题解析

    FPGA上的图像处理算法集成与优化

    本文详细介绍了多种图像处理技术,包括RG/GB单通道提取、亮度和对比度调整、图像反转、均值滤波、高斯滤波、图像锐化、中值滤波、阈值分割、边缘
    的头像 发表于 02-14 13:46 1162次阅读
    <b class='flag-5'>FPGA</b>上的<b class='flag-5'>图像</b><b class='flag-5'>处理</b>算法集成与优化

    基于FPGA图像边缘检测设计

    今天给大侠带来基于 FPGA图像边缘检测设计,话不多说,上货。 设计流程如下:mif文件的制作→ 调用 ip 核生成rom以及仿真注意问题→ 灰度
    的头像 发表于 02-10 11:30 1103次阅读
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>图像</b><b class='flag-5'>边缘</b><b class='flag-5'>检测</b>设计

    FPGA图像处理基础----实现缓存卷积窗口

    像素行与像素窗口 一幅图像是由一个个像素点构成的,对于一幅480*272大小的图片来说,其宽度是480,高度是272。在使用FPGA进行图像处理时,最关键的就是使用
    的头像 发表于 02-07 10:43 1435次阅读
    <b class='flag-5'>FPGA</b><b class='flag-5'>图像</b><b class='flag-5'>处理</b>基础----实现缓存卷积窗口

    基于FPGA实现图像直方图设计

    简单,单采用FPGA来实现直方图的统计就稍显麻烦。若使用Xilinx和Altera的FPGA芯片,可以使用HLS来进行图像的加速处理。但这暂时不是我的重点。 用C语言实现直方图统计:u
    的头像 发表于 12-24 10:24 1215次阅读
    基于<b class='flag-5'>FPGA</b>实现<b class='flag-5'>图像</b>直方图设计

    DFT在图像处理中的作用 DFT在音频信号处理中的应用

    处理中的几个主要作用: 频域滤波 :DFT允许我们分析图像的频率成分,从而可以设计滤波器来增强或抑制特定频率的信号,例如低通滤波器可以减少图像噪声,而高通滤波器可以增强边缘
    的头像 发表于 12-20 09:18 1853次阅读

    AI模型部署边缘设备的奇妙之旅:目标检测模型

    1、简介 人工智能图像识别是人工智能领域的一个重要分支,它涉及计算机视觉、深度学习、机器学习等多个领域的知识和技术。图像识别主要是处理具有一定复杂性的信息。计算机采用与人类类似的图像
    发表于 12-19 14:33

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

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