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

    关注

    1664

    文章

    22508

    浏览量

    639431
  • 仿真
    +关注

    关注

    55

    文章

    4539

    浏览量

    138689

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RK3576 单板机高清视频图像处理开发实战手册(三)

    工业相机采集、OpenCV 边缘检测等实战案例,支持 4K@60fps 高性能处理。创龙科技通过标准化流程与工程化案例,帮助用户高效完成嵌入式视频与视觉应用开发。
    的头像 发表于 04-29 09:49 178次阅读
    RK3576 单板机高清视频<b class='flag-5'>图像</b><b class='flag-5'>处理</b>开发实战手册(三)

    RK3576 单板机高清视频图像处理开发实战手册(二)

    工业相机采集、OpenCV 边缘检测等实战案例,支持 4K@60fps 高性能处理。创龙科技通过标准化流程与工程化案例,帮助用户高效完成嵌入式视频与视觉应用开发。
    的头像 发表于 04-28 10:33 36次阅读
    RK3576 单板机高清视频<b class='flag-5'>图像</b><b class='flag-5'>处理</b>开发实战手册(二)

    RK3576 单板机高清视频图像处理开发实战手册(一)

    工业相机采集、OpenCV 边缘检测等实战案例,支持 4K@60fps 高性能处理。创龙科技通过标准化流程与工程化案例,帮助用户高效完成嵌入式视频与视觉应用开发。
    的头像 发表于 04-27 09:36 53次阅读
    RK3576 单板机高清视频<b class='flag-5'>图像</b><b class='flag-5'>处理</b>开发实战手册(一)

    FPGA图像处理平台搭建方案

    基于 MicroBlaze V 的 FPGA 视觉平台:通过以太网实时捕获、调试和传输 MIPI 相机数据,支持全帧或高速 ROI 范围。
    的头像 发表于 04-22 09:32 423次阅读
    <b class='flag-5'>FPGA</b><b class='flag-5'>图像</b><b class='flag-5'>处理</b>平台搭建方案

    综合图像处理硬件平台设计资料:2-基于6U VPX的双TMS320C6678+Xilinx FPGA K7 XC7K420T的图像信号处理

    FPGA光纤, XCVU9P板卡, 高速图像采集, 基带信号处理, 加速计算卡, 无线仿真平台, 图像信号处理
    的头像 发表于 03-30 14:39 152次阅读
    综合<b class='flag-5'>图像</b><b class='flag-5'>处理</b>硬件平台设计资料:2-基于6U VPX的双TMS320C6678+Xilinx <b class='flag-5'>FPGA</b> K7 XC7K420T的<b class='flag-5'>图像</b>信号<b class='flag-5'>处理</b>板

    FPGA 信号处理板卡设计原理图:618-基于FMC+的XCVU3P高性能 PCIe 载板

    汽车驾驶员辅助, FPGA 信号处理, XCVU3P板卡, 雷达图像处理, 卫星通信系统, 基带通信接收
    的头像 发表于 01-30 10:27 454次阅读
    <b class='flag-5'>FPGA</b> 信号<b class='flag-5'>处理</b>板卡设计原理图:618-基于FMC+的XCVU3P高性能 PCIe 载板

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

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

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

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

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

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

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

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

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

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

    【VisionFive 2单板计算机试用体验】人脸及物体识别、图像边缘检测

    一、引言 赛昉科技提供了许多参考性文档,其中不乏使用昉·星光 2测试在AI图像处理的应用场景。上期咱分享了二维码检测与解码效果,只要摄像头采集图像够清晰,扫描二维码与解析效率还是挺好的
    发表于 08-07 00:49

    边缘AI盒子技术解析:ASIC/FPGA/GPU芯片及边缘-云端协同与自适应推理

      电子发烧友网综合报道 边缘AI盒子是一种集成了高性能芯片、AI算法和数据处理能力的硬件设备,部署在数据源的边缘侧,如工厂、商场、交通路口等,能在本地进行数据采集、预处理、分析和决策
    的头像 发表于 07-13 08:25 4910次阅读

    边缘AI的优势和技术基石

    在万物皆可AI(人工智能)的今天,市场上几乎每家企业都在宣称自己的业务中有了AI成分。因此,将AI接入极靠近终端客户的网络边缘也就没什么悬念了。这里的边缘人工智能(即Edge AI,或边缘AI)主要是指将人工智能系统(如预测分析
    的头像 发表于 06-12 10:14 1675次阅读
    <b class='flag-5'>边缘</b>AI的优势和技术基石

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

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