前言
通常来说,边缘是指图像中像素值有突变的地方,常用于图像的分割领域。
注意:后续技术分享,第一时间更新,以及缩放、白平衡及各种滤波算法完整代码,将在VX群发布,请添加VX:Zeus20010223
一、sobel是什么?
Sobel算子包含两组3 × 3 的矩阵,分别为横向和纵向模板,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。
检测水平方向 沿横向模板:
检测垂直方向 沿纵向的模板
图像的每一个像素的横向及纵向梯度近似值,可用以下的公式结合,来计算梯度的大小
二、FPGA实现
使用matrix产生3×3矩阵
matrix #(
.COL(COL),
.ROW(ROW)
)
u1_matrix
(
.clk (clk ),
.rst_n (rst_n ),
.data_de (y_de ),
.data (y_data ),
.matrix_de (matrix_de ),
.matrix11 (matrix11 ),
.matrix12 (matrix12 ),
.matrix13 (matrix13 ),
.matrix21 (matrix21 ),
.matrix22 (matrix22 ),
.matrix23 (matrix23 ),
.matrix31 (matrix31 ),
.matrix32 (matrix32 ),
.matrix33 (matrix33 )
);
按照sobel算子模版对矩阵进行乘法 消耗一个周期
再分别对两个算子的结果进行求和 消耗一个周期
always@(posedge clk)
if(!rst_n)
x_add_line <= 'd0;
else if(matrix_de_r[0]==1'b1)
x_add_line <= x_one_line+x_second_line+x_third_line;
else
x_add_line <= 'd0;
对所求的和求绝对值 通过首位是否为1来判断 消耗一个周期
求平方 消耗一个周期
求平方和 消耗一个周期
调用ip核 求开方 通过仿真可知消耗17个周期
square_root u1_square_root (
.aclk (clk ),
.aresetn (rst_n ),
.s_axis_cartesian_tvalid (matrix_de_r[4] ),
.s_axis_cartesian_tdata (xy_add_line_2 ),
.m_axis_dout_tvalid (square_de ),
.m_axis_dout_tdata (square_data )
);
ip核配置
三、仿真验证
通过波形可以看出逻辑正确 按照周期来执行
左 matlab 右 fpga
通过结果比对 可知处理结果完全一致
四、总结
调用vivado ip 完成开方操作