目录
1.前言
图像边缘检测大幅度地减少了数据量,并且剔除了可以认为不相关的信息,保留了图像重要的结构属性。在本课题中,将通过FPGA实现图像sobel边缘提取的硬件测试。
本课题为之前博客中写的文章的硬件调试:
基于FPGA的图像sobel边缘提取算法开发,包括tb测试文件以及matlab验证代码-CSDN博客
在仿真版本的基础上,我们增加了图像存储模块,HDMI接口模块,图像时序处理模块,rgb转dvi模块等。
2.算法硬件测试效果图预览
边缘提取效果:
3.算法运行软件版本
vivado2022.2
Matlab2022a/matlab2024b
4.部分核心程序
(完整版代码包含中文注释和操作步骤视频)
color_bar hdmi_color_bar(
.clk(video_clk),
.rst(1'b0),
.key(key),
.hs(video_hs),
.vs(video_vs),
.de(video_de),
.rgb_r(video_r),
.rgb_g(video_g),
.rgb_b(video_b)
);
video_clock video_clock_m0
(
// Clock in ports
.clk_in1(sys_clk),
// Clock out ports
.clk_out1(video_clk),
.clk_out2(video_clk_5x),
// Status and control signals
.reset(1'b0),
.locked()
);
rgb2dvi_0 rgb2dvi_m0 (
// DVI 1.0 TMDS video interface
.TMDS_Clk_p(TMDS_clk_p),
.TMDS_Clk_n(TMDS_clk_n),
.TMDS_Data_p(TMDS_data_p),
.TMDS_Data_n(TMDS_data_n),
.oen(hdmi_oen),
//Auxiliary signals
.aRst_n(1'b1), //-asynchronous reset; must be reset when RefClk is not within spec
// Video in
.vid_pData({video_r,video_g,video_b}),
.vid_pVDE(video_de),
.vid_pHSync(video_hs),
.vid_pVSync(video_vs),
.PixelClk(video_clk),
.SerialClk(video_clk_5x)// 5x PixelClk
);
endmodule
0X2_042m
5.算法仿真参数
parameter H_ACTIVE = 16'd1280; //horizontal active time (pixels)
parameter H_FP = 16'd110; //horizontal front porch (pixels)
parameter H_SYNC = 16'd40; //horizontal sync time(pixels)
parameter H_BP = 16'd220; //horizontal back porch (pixels)
parameter V_ACTIVE = 16'd720; //vertical active Time (lines)
parameter V_FP = 16'd5; //vertical front porch (lines)
parameter V_SYNC = 16'd5; //vertical sync time (lines)
parameter V_BP = 16'd20; //vertical back porch (lines)
parameter HS_POL = 1'b1; //horizontal sync polarity, 1 : POSITIVE,0 : NEGATIVE;
parameter VS_POL = 1'b1; //vertical sync polarity, 1 : POSITIVE,0 : NEGATIVE;
7.硬件测试说明
具体的硬件操作步骤,可以参考作品中提供的视频步骤
如果不同开发板,系统的移植可以参考如下文章
8.算法理论概述
Soble边缘检测算法比较简,实际应用中效率比canny边缘检测效率要高,但是边缘不如Canny检测的准确,但是很多实际应用的场合,sobel边缘却是首选,尤其是对效率要求较高,而对细纹理不太关心的时候。Soble边缘检测通常带有方向性,可以只检测竖直边缘或垂直边缘或都检测。所以我们先定义两个梯度方向的系数:
然后我们来计算梯度图像,我们知道边缘点其实就是图像中灰度跳变剧烈的点,所以先计算梯度图像,然后将梯度图像中较亮的那一部分提取出来就是简单的边缘部分。
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为垂直方向上的梯度图像。为了更清楚的说明算法过程,下面给出一张示例图像的梯度图像。
9.参考文献
[1]艾扬利,杨兵.基于FPGA的Sobel算子并行计算研究[J].现代电子技术, 2005, 28(9):2.DOI:10.3969/j.issn.1004-373X.2005.09.019.
[2]李明,赵勋杰,毛伟民.Sobel边缘检测的FPGA实现[J].现代电子技术, 2009, 32(16):44-44.DOI:JournalArticle/5af3bc88c095d718d810bc2d.
10.算法完整程序工程
OOOOO
OOO
O