基于FPGA的图像sobel边缘提取算法实现,包含testbench和matlab验证程序
目录
1.算法仿真效果
matlab2022a/vivado2019.2仿真结果如下:
2.算法涉及理论知识概要
点和线是做图像分析时两个最重要的特征,而线条往往反映了物体的轮廓,对图像中边缘线的检测是图像分割与特征提取的基础。边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。 这些包括(i)深度上的不连续、(ii)表面方向不连续、(iii)物质属性变化和(iv)场景照明变化。 边缘检测是图像处理和计算机视觉中,尤其是特征提取中的一个研究领域。
图像边缘检测大幅度地减少了数据量,并且剔除了可以认为不相关的信息,保留了图像重要的结构属性。有许多方法用于边缘检测,它们的绝大部分可以划分为两类:基于查找一类和基于零穿越的一类。基于查找的方法通过寻找图像一阶导数中的最大和最小值来检测边界,通常是将边界定位在梯度最大的方向。基于零穿越的方法通过寻找图像二阶导数零穿越来寻找边界,通常是Laplacian过零点或者非线性差分表示的过零点。
Sobel边缘检测
Soble边缘检测算法比较简,实际应用中效率比canny边缘检测效率要高,但是边缘不如Canny检测的准确,但是很多实际应用的场合,sobel边缘却是首选,尤其是对效率要求较高,而对细纹理不太关心的时候。Soble边缘检测通常带有方向性,可以只检测竖直边缘或垂直边缘或都检测。所以我们先定义两个梯度方向的系数:
kx=0;ky=1;% horizontal
kx=1;ky=0;% vertical
kx=1;ky=1;% both
然后我们来计算梯度图像,我们知道边缘点其实就是图像中灰度跳变剧烈的点,所以先计算梯度图像,然后将梯度图像中较亮的那一部分提取出来就是简单的边缘部分。
Sobel算子用了一个3*3的滤波器来对图像进行滤波从而得到梯度图像,这里面不再详细描述怎样进行滤波及它们的意义等。
竖起方向的滤波器:y_mask=op = [-1 -2 -1;0 0 0;1 2 1]/8;
水平方向的滤波器:op的转置:x_mask=op’;
定义好滤波器后,我们就开始分别求垂直和竖起方向上的梯度图像。用滤波器与图像进行卷积即可:
bx = abs(filter2(x_mask,a));
by = abs(filter2(y_mask,a));
上面bx为水平方向上的梯度图像,by为垂直方向上的梯度图像。为了更清楚的说明算法过程,下面给出一张示例图像的梯度图像。
3.verilog核心程序
.........................................................................
reg signed[10:0]Sobel1;
reg signed[10:0]Sobel2;
reg signed[10:0]Sobel3;
reg signed[10:0]Sobel4;
always @(posedge i_clk or posedge i_rst)
begin
if(i_rst)
begin
Sobel1 <= 11'd0;
Sobel2 <= 11'd0;
Sobel3 <= 11'd0;
Sobel4 <= 11'd0;
end
else begin
Sobel1 <= {3'd0,sobelxy13} + {3'd0,sobelxy23} + {3'd0,sobelxy23} + {3'd0,sobelxy33};
Sobel2 <= {3'd0,sobelxy11} + {3'd0,sobelxy21} + {3'd0,sobelxy21} + {3'd0,sobelxy31};
Sobel3 <= {3'd0,sobelxy11} + {3'd0,sobelxy12} + {3'd0,sobelxy12} + {3'd0,sobelxy13};
Sobel4 <= {3'd0,sobelxy31} + {3'd0,sobelxy32} + {3'd0,sobelxy32} + {3'd0,sobelxy33};
end
end
reg signed[11:0]Sobel12;
reg signed[11:0]Sobel34;
always @(posedge i_clk or posedge i_rst)
begin
if(i_rst)
begin
Sobel12 <= 12'd0;
Sobel34 <= 12'd0;
end
else begin
Sobel12 <= {Sobel1[10],Sobel1}-{Sobel2[10],Sobel2};
Sobel34 <= {Sobel3[10],Sobel3}-{Sobel4[10],Sobel4};
end
end
reg signed[11:0]absSobel12;
reg signed[11:0]absSobel34;
always @(posedge i_clk or posedge i_rst)
begin
if(i_rst)
begin
absSobel12 <= 12'd0;
absSobel34 <= 12'd0;
end
else begin
if(Sobel12[11]==0)
absSobel12 <= Sobel12;
else
absSobel12 <= ~Sobel12+1'b1;
if(Sobel34[11]==0)
absSobel34 <= Sobel34;
else
absSobel34 <= ~Sobel34+1'b1;
end
end
.....................................................
A805
4.完整算法代码文件
V
相关文章
- matlab 求矩阵秩,求Matlab中矩阵的秩和迹 | 学步园[通俗易懂]
- NSGA3算法及其MATLAB版本实现
- MATLAB快速搭建一个神经网络以及神经网络工具箱的使用
- lasso回归matlab,机器学习Lasso回归重要论文和Matlab代码「建议收藏」
- matlab Lasso回归
- PID控制的MATLAB仿真(1)
- matlab中错误使用fmincon,MATLAB中fmincon 函数问题
- 如何用matlab编写分段函数_请教各位怎样用matlab定义一个分段函数MATLAB分段函数…[通俗易懂]
- matlab中矩阵的秩,matlab矩阵的秩
- matlab fir带通滤波,基于Matlab的FIR带通滤波器设计与实现
- matlab支持向量回归,支持向量回归 MATLAB代码
- matlab中imfinfo 有关图形文件的信息
- MATLAB自带的dwt2和wavedec2函数实现基于小波变换的自适应阈值图像边缘检测
- matlab运行结果图片如何保存_应对数据丢失最简单的方法
- matlab产生高斯白噪声
- 520表白季,教你用matlab画动态心形曲线图,可自动保存GIF格式图片,送给女朋友,她们一定会惊讶,赶紧收藏!!!
- matlab plot函数详解_MATLAB的plot
- Matlab赋值_matlab二维数组赋值
- MATLAB循环_matlab如何循环计算
- matlab根据数据画三维图_matlab导入三组数据画三维图
- matlab将两幅图进行融合_matlab拟合三维曲面
- matlab 怎么使用function,Matlab中function函数使用操作方法
- MATLAB数据挖掘用改进的K-Means(K-均值)聚类算法分析高校学生的期末考试成绩数据
- MATLAB随机波动率SV、GARCH用MCMC马尔可夫链蒙特卡罗方法分析汇率时间序列|附代码数据
- MATLAB软件怎么下载?科学计算工具MATLAB 2022中文版下载安装
- 快速安装Linux上的MATLAB(linux安装matlab)
- java和matlab画多边形闭合折线图示例讲解