FPGA之旅设计99例之第二十二例----Sobel算法边沿检测

简介: 笔记

一. 简介


本例将在上例的基础上,添加一个简单的图像处理算法—边缘检测(Sobel算法)。串口助手发送图片过来之后,结果边缘检测算法处理之后再输出到VGA进行显示。


边沿检测算法主要是针对灰度图进行处理的,所以模块内部还需要添加个RGB565转灰度的功能。边缘检测算法有很多种,例如Sobel、Canny、Prewitt等等,各有其优缺点。本次选择Sobel进行学习,主要是因为其相对而言比较简单,FPGA易于实现。


二. Sobel算法


Sobel主要是利用图像两个方向的梯度来与阈值进行对比,大于阈值的点,被认为是边缘点。算法步骤大体如下


求x,y方向的梯度dx,dy

求出近似梯度G = dx2 + dy2开根号,也可以近似为 G = |dx| + |dy|,方便FPGA处理

与阈值进行对比,大于阈值则为边缘,将该像素赋值为255,否则为0

可以看出算法的核心是如何计算图像两个方向的梯度。


(一). 梯度计算

梯度计算主要是用到了两个3x3大小的卷积核(如下图)。上图负责x方向,下图负责y方向。

25.png



卷积核在图像上进行移动,每次都会覆盖3x3大小的图像区域。卷积核与图像上对于位置上的元素相乘然后求和(矩阵的内积),就得到该点的梯度值(3x3中心位置的像素点)。


这样又会引入两个问题


计算过程需要使用三行图像数据,如何进行存储

图像边缘位置的像素如何进行处理

(二). 如何缓存三行数据

实际上,只需要存储两行数据即可,第三行为当前输入的那行。具体的实现方式有两种,一种是调用现成IP,另外一种就是自己实现啦。目是要学习Sobel算法,偷个懒直接调用IP也是可以的。在Quartus中可以调用Shift Register IP实现,Vivado中也有,名字忘记了。


IP工作原理如下,该图是缓存了4行数据。第一行输入一个数据,第一行就会输出一个数据,然后第一行输出的数据又会作为第二行的输入,第二行也会输出一个数据,作为第三行的输入,以此类推。一个数据输入,那么将会得到每一行的一个数据,共四个数据。


26.png


IP创建


选择Shift Register

27.png


选择输入数据的位宽,缓存行数,每行的数据个数和时钟使能信号。通过框图可以看出输入的位宽为8bit,缓存的行数为两行(第三行为当前输入,不需要缓存),每一行的个数为480,刚好为图像的列数。28.png



这样缓存三行的问题就得到了解决。


(三). 边缘像素如何处理

如果按照算法流程来的话,处理完成后,图像就会变小一圈,尺寸就变了,这是我们不希望得到了。一般采用的方法为先将图片扩大一圈,扩大一圈对应的像素值可以为0,或者255,也可以图像最外圈的保持一致,这样结果算法处理后,图像大小就和输入的大小保持一致了。但是这样在FPGA中处理不是很方便,考虑到图片边缘一般不会包含重要的信息,同样也是本次将采取的方便,外部输入一个像素,Sobel算法就会输出一个像素,这样边缘像素是否是边缘点,就是一个随机的了,跟初始化的值和上一帧图像有关,这样就大大简化了问题。


三. 算法实现


(1). 图片转灰

这里采用最简单的方法,对图像的三个通道取平均值的方法进行转换。这里采取了两个周期来处理,最终得到灰度值


//计算rgb三个值
always@(posedge clk or negedge rst)
begin
  if(rst == 1'b0)
  begin
  reg_R <= 'd0;
  reg_G <= 'd0;
  reg_B <= 'd0;
  end
  else  if(data_en == 1'b1)
  begin
  reg_R <= {data_in[15:11],3'b0};
  reg_G <= {data_in[10:5],2'b0};
  reg_B <= {data_in[4:0],3'b0};
  end
  else
  begin
  reg_R <= reg_R;
  reg_G <= reg_G;
    reg_B <= reg_B;
  end
end
//计算regR regB  regG之和取平均
always@(posedge clk or negedge rst)
begin
  if(rst == 1'b0)
  reg_RGB <= 'd0;
  else
  reg_RGB <= (reg_R + reg_G + reg_B)/3;  //取平均值
end


(二). Sobel算法实现

本次实现的Sobel算法一共需要花费两个时钟周期完成,


第一个时钟周期主要完成Sobel核与图像的卷积操作将负数和正数分开计算


always@(posedge clk or negedge rst)
begin
  if(rst == 1'b0)
  begin
    Sobel_px <= 'd0;
    Sobel_nx <= 'd0;
  end
  else if(data_en==1'b1)
  begin
    Sobel_nx <= martix_11 + martix_21 + martix_21 + martix_31;
    Sobel_px <= martix_13 + martix_23 + martix_23 + martix_33;
  end
  else
  begin
  Sobel_nx <= 'd0;
  Sobel_px <= 'd0;
  end
end


第二个时钟周期主要完成负数和正数的比较,求得梯度的绝对值,并求和比较输出结果


assign Sobel_data = (Sobel_x + Sobel_y > Sobel_thresh) ? 8'd0 : 8'd255;
always@(posedge clk)
begin
  Sobel_x <= (Sobel_px > Sobel_nx) ? (Sobel_px - Sobel_nx) : (Sobel_nx - Sobel_px);
    Sobel_y <= (Sobel_py > Sobel_ny) ? (Sobel_py - Sobel_ny) : (Sobel_ny - Sobel_py);
end


最终实现效果如图,搞错了图像宽度为640,不是480,所以最右边出现重复,尴尬


回复 FPGA之旅设计99例之第二十二例 获取完整工程 ,Sobel模块放在了sdram_read模块下面。

29.png

公众号:FPGA之旅

目录
相关文章
|
2月前
|
机器学习/深度学习 运维 算法
大模型开发:描述一种用于异常检测的技术或算法。
LOF算法是一种无监督异常检测技术,通过比较数据点局部密度识别离群点。它计算每个点的局部离群因子得分,得分高则异常可能性大。主要步骤包括:距离度量、k近邻搜索、计算局部可达密度和LOF得分,然后设定阈值识别异常点。适用于入侵检测、故障检测等场景,Python中可使用scikit-learn库实现。
25 1
|
1天前
|
算法 异构计算
m基于FPGA的MPPT最大功率跟踪算法verilog实现,包含testbench
该内容包括三部分:1) 展示了Vivado 2019.2和Matlab中关于某种算法的仿真结果图像,可能与太阳能光伏系统的最大功率点跟踪(MPPT)相关。2) 简述了MPPT中的爬山法原理,通过调整光伏电池工作点以找到最大功率输出。3) 提供了一个Verilog程序模块`MPPT_test_tops`,用于测试MPPT算法,其中包含`UI_test`和`MPPT_module_U`两个子模块,处理光伏电流和电压信号。
7 1
|
12天前
|
机器学习/深度学习 运维 算法
【Python机器学习专栏】异常检测算法在Python中的实践
【4月更文挑战第30天】本文介绍了异常检测的重要性和在不同领域的应用,如欺诈检测和网络安全。文章概述了四种常见异常检测算法:基于统计、距离、密度和模型的方法。在Python实践中,使用scikit-learn库展示了如何实现这些算法,包括正态分布拟合、K-means聚类、局部异常因子(LOF)和孤立森林(Isolation Forest)。通过计算概率密度、距离、LOF值和数据点的平均路径长度来识别异常值。
|
12天前
|
算法 数据可视化 数据挖掘
R语言平滑算法LOESS局部加权回归、三次样条、变化点检测拟合电视节目《白宫风云》在线收视率
R语言平滑算法LOESS局部加权回归、三次样条、变化点检测拟合电视节目《白宫风云》在线收视率
|
13天前
|
算法 TensorFlow 算法框架/工具
基于直方图的图像阈值计算和分割算法FPGA实现,包含tb测试文件和MATLAB辅助验证
这是一个关于图像处理的算法实现摘要,主要包括四部分:展示了四张算法运行的效果图;提到了使用的软件版本为VIVADO 2019.2和matlab 2022a;介绍了算法理论,即基于直方图的图像阈值分割,通过灰度直方图分布选取阈值来区分图像区域;并提供了部分Verilog代码,该代码读取图像数据,进行处理,并输出结果到&quot;result.txt&quot;以供MATLAB显示图像分割效果。
|
18天前
|
算法 数据可视化 数据挖掘
R语言社区发现算法检测心理学复杂网络:spinglass、探索性图分析walktrap算法与可视化
R语言社区发现算法检测心理学复杂网络:spinglass、探索性图分析walktrap算法与可视化
|
25天前
|
算法 数据可视化
R语言社区检测算法可视化网络图:ggplot2绘制igraph对象分析物种相对丰度
R语言社区检测算法可视化网络图:ggplot2绘制igraph对象分析物种相对丰度
|
26天前
|
文字识别 算法 计算机视觉
图像倾斜校正算法的MATLAB实现:图像倾斜角检测及校正
图像倾斜校正算法的MATLAB实现:图像倾斜角检测及校正
|
26天前
|
算法 数据可视化 数据挖掘
R语言社区主题检测算法应用案例
R语言社区主题检测算法应用案例
|
27天前
|
算法 计算机视觉 异构计算
基于直方图相似性的图像分类算法FPGA实现,包括tb测试文件和MATLAB辅助验证
该内容包含了一段关于图像处理算法的摘要,主要包括: 1. 展示了MATLAB和FPGA的测试结果图像,显示了图像读取完成的标志和相似性指标,其中图1与图2有较强相似性,图1与图3相似性较弱。 2. 算法使用的是vivado 2019.2和matlab 2022A版本。 3. 算法原理涉及图像直方图统计和直方图相似性度量,通过计算直方图的差异来衡量图像相似度,FPGA实现包括图像采集、直方图计算、比较和分类决策步骤。 4. 提供了一个部分核心Verilog程序,用于读取图像数据并在FPGA上进行直方图相似性计算。