FPGA/ZYNQ:Sobel边缘检测

news/2024/9/29 3:20:53

一、简述
边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。图像边缘检测大幅度地减少了数据量,并且剔除了可以认为不相关的信息,保留了图像重要的结构属性。所谓边缘是指其周围像素灰度急剧变化的那些像素的集合,它是图像最基本的特征。边缘存在于目标、背景和区域之间,所以,它是图像分割所依赖的最重要的依据。由于边缘是位置的标志,对灰度的变化不敏感,因此,边缘也是图像匹配的重要的特征。边缘大致可以分为两种,一种是阶跃状边缘,边缘两边像素的灰度值明显不同;另一种为屋顶状边缘,边缘处于灰度值由小到大再到小的变化转折点处。索贝尔算子(Sobel operator)主要用作边缘检测,在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰度之近似值。在图像的任何一点使用此算子,将会产生对应的灰度矢量或是其法矢量。
sobel卷积因子:

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

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

通常,为了提高效率,使用不开平方的近似值,但这样做会损失精度,迫不得已的时候可以如下这样子:

如果梯度 G 大于某一阀值,则认为该点(x,y)为边缘点。
二、实现方法
首先通过获取33矩阵(在前面博客中有介绍)来得到相应模板与视频图像做融合,再将相应的横、纵像素值与卷积模板相乘,再将得到的Gx与Gy求取绝对值(该方法在计算上相对易于实现,减少时钟周期,也可以通过平方开根号的方法得到该值),最后将Gx与Gy相加,得到相应G值,再将该值与阈值做判断,得到边界线。
三、实现过程
首先对3
3矩阵内的值与卷积核相乘,此处将横、纵轴同时计算可节省时钟周期。

always @(posedge clk or negedge rst_n) beginif(!rst_n) beginGx1 <= 'd0;Gx3 <= 'd0;Gy1 <= 'd0;Gy3 <= 'd0; endelse beginGx1 <= matrix_11 + (matrix_21 << 1) + matrix_31;Gx3 <= matrix_13 + (matrix_23 << 1) + matrix_33;Gy1 <= matrix_11 + (matrix_12 << 1) + matrix_13;Gy3 <= matrix_31 + (matrix_32 << 1) + matrix_33; end
end

再求取Gx和Gy的绝对值:

    if(!rst_n) beginGx <= 'd0;Gy <= 'd0;endelse begin  //也可判断bit[7]来确定Gx <= (Gx1 > Gx3) ? (Gx1 - Gx3) : (Gx3 - Gx1);Gy <= (Gy1 > Gy3) ? (Gy1 - Gy3) : (Gy3 - Gy1);end
end

最后再求取该3*3模板的G值,并将其与阈值作比较:

always @(posedge clk or negedge rst_n) beginif(!rst_n) beginG <= 'd0;endelse beginG <= Gx + Gy;end
endassign sobel_data = (G > value) ? 24'h000000 : 24'hffffff;

对sobel的处理总共耗费三个时钟周期,所以要对其他信号做延迟处理:

always @(posedge clk or negedge rst_n) beginif(!rst_n) beginvideo_de_r    <= 4'b0;video_href_r <= 4'b0;video_vsync_r <= 4'b0;endelse begin  video_de_r    <= {video_de_r[1:0],    video_de};video_href_r <= {video_href_r[1:0], video_href};video_vsync_r <= {video_vsync_r[1:0], video_vsync};end
endassign sobel_de    = video_de_r[2];
assign sobel_href = video_href_r[2];
assign sobel_vsync = video_vsync_r[2];

四、实验总结
本次实验效果较好,能够准确识别相应物体的边界线。
五、参考资料
正点原子领航者sdk——ov7725的sobel边缘检测
博客园——咸鱼IC
(本博客用于学习记录,如有侵权请告知)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/45585.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Docker部署安装应用大集合(Tomcat、Nginx、Mysql、Redis、MQ、Nacos、Zookeeper、Portainer、MongoDB ......)

Docker部署安装应用大集合(Tomcat、Nginx、Mysql、Redis、MQ、Nacos、Zookeeper、Portainer、MongoDB ......)精选 原创CodeDevMaster2022-11-16 08:42:24博主文章分类:Docker©著作权 文章标签dockermysqlNginxNacosMQ文章分类Docker云计算yyds干货盘点 Docker部署安装应…

接口信息快速保存与打开

今天发现一个特别有用的神器,chrome的F12。利用F12中提供的导出har格式数据工具和导入har格式数据工具可以大大提高工作效率。 当我们用F12抓包完成后可以将这些接口信息存为har格式,之后可以利用har导入功能在F12下将当时保存的信息导入就不用手动复制粘贴了。 应用场景: 1…

有点儿神奇,原来vue3的setup语法糖中组件无需注册因为这个

在setup语法糖中直接将组件import导入无需注册就可以使用,你知道这是为什么呢?前言 众所周知,在vue2的时候使用一个vue组件要么全局注册,要么局部注册。但是在setup语法糖中直接将组件import导入无需注册就可以使用,你知道这是为什么呢?注:本文中使用的vue版本为3.4.19。…

可以把 FolkMQ 内嵌到 SpringBoot3 项目里(可内嵌的消息中间件,纯血国产)

支持Qos0、定时、过期、顺序、广播、事务、二进制等消息特性。有确认、重试、延时等机制。可嵌入、单机、集群等部署。之前发了《把 FolkMQ 内嵌到 SpringBoot2 项目里(比如 “诺依” 啊)》。有人说都淘态了,有什么好内嵌的。。。所以再发个 SpringBoot3FolkMQ 是一个 “纯…

SharpBV下载bilibili视频,支持720p和1080p清晰度视频;

b站视频下载 bibililidown shrapbvSharpBV下载bilibili视频,支持720p和1080p清晰度视频; 特点: 操作系统Win7|Win10 64位 并发下载默认3并发量 进度显示 鼠标点击自动粘贴视频链接SharpBV-1.0.0-win64.msi.zip - 蓝奏云

弹性伸缩:高可用架构利器(架构+算法+思维)

1 介绍 云计算资源弹性伸缩是一种根据业务需求动态调整计算资源规模的技术。它可以根据系统的性能指标(如CPU使用率、内存占用率、磁盘IO、网卡读写率、请求响应时间等)或者预定义的规则(如时间周期、业务事件等),自动增加或减少计算资源的数量,以满足业务负载的变化。这…

C#.Net筑基-集合知识全解

.Net 中提供了一系列的管理对象集合的类型,数组、可变列表、字典等。从类型安全上集合分为两类,泛型集合 和 非泛型集合,传统的非泛型集合存储为Object,需要类型转。而泛型集合提供了更好的性能、编译时类型安全,推荐使用。01、集合基础知识 .Net 中提供了一系列的管理对象…

.NET使用原生方法实现文件压缩和解压

前言 在.NET中实现文件或文件目录压缩和解压可以通过多种方式来完成,包括使用原生方法(System.IO.Compression命名空间中的类)和第三方库(如:SharpZipLib、SharpCompress、K4os.Compression.LZ4等)。本文我们主要讲的是如何使用.NET原生方法System.IO.Compression命名空间…