基于 Sobel 算子的边缘检测的FPGA 算法实现和MATLAB的实现

简介: 基于 Sobel 算子的边缘检测的FPGA 算法实现和MATLAB的实现

1. 背景知识


      边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。 这些包括(i)深度上的不连续、(ii)表面方向不连续、(iii)物质属性变化和(iv)场景照明变化。 边缘检测是图像处理和计算机视觉中,尤其是特征提取中的一个研究领域。

2. 边缘检测算子


一阶:Roberts Cross 算子,Prewitt 算子,Sobel 算子, Kirsch 算子,罗盘算子;

二阶: Marr-Hildreth,在梯度方向的二阶导数过零点,Canny 算子,Laplacian 算子。

今天要说的是基于 Sobel 算子的边缘检测的 FPGA 算法和MATLAB的实现。

3. Sobel滤波原理


Sobel 滤波,也称Sobel算子,是像素边缘检测中最重要的算子之一,在机器学习、数字媒体、计算机视觉等信息科技领域起着举足轻重的作用。边缘点其实是图像灰度跳变剧烈的点,所以先计算梯度图像,然后将梯度图像中较亮的那一部分提取出来就是简单的边缘部分。根据该原理,Sobel算子首先用两组3×3的滤波器分别对图像横向及纵向进行滤波,从而得到横向和纵向的梯度图像(亮度差分近似值)。若A表示原始图像,和分别代表经横向及纵向边缘检测的图像,其公式如下:

image.png

图像的每一个像素的横向及纵向梯度近似值可用结合。然后计算梯度方向:image.png 此外,计算梯度图像时一般会使用,用绝对值消除梯度方向的影响。

如果以上的角度Θ等于零,即代表图像该处拥有纵向边缘,左方较右方暗。

缺点是Sobel算子并没有将图像的主题与背景严格地区分开来,换言之就是Sobel算子并没有基于图像灰度进行处理,由于Sobel算子并没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意。

首先一篇他文让大家了解下sobel的工作原理 : 彻底理解数字图像处理中的卷积-以Sobel算子为例

image.png

clear all; 
close all;
imag = imread('sobel.jpg');  %读取关键帧
subplot(131);imshow(imag);title('原图');
imag = rgb2gray(imag);        %转化为灰度图 
[high,width] = size(imag);   % 获得图像的高度和宽度
F2 = double(imag);        
U = double(imag);       
uSobel = imag;
for i = 2:high - 1   %sobel边缘检测
    for j = 2:width - 1
        Gx = (U(i+1,j-1) + 2*U(i+1,j) + F2(i+1,j+1)) - (U(i-1,j-1) + 2*U(i-1,j) + F2(i-1,j+1));
        Gy = (U(i-1,j+1) + 2*U(i,j+1) + F2(i+1,j+1)) - (U(i-1,j-1) + 2*U(i,j-1) + F2(i+1,j-1));
        uSobel(i,j) = sqrt(Gx^2 + Gy^2); 
    end
end 
subplot(132);imshow(im2uint8(uSobel));title('边缘检测后');  %画出边缘检测后的图像
% Matlab自带函数边缘检测
% K为获取得到的关键帧的灰度图
BW3 = edge(imag,'sobel', 0.07);
subplot(133);imshow(BW3,[]);title('Matlab自带函数边缘检测');

image.png

image.png

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date:    18:56:27 09/11/2019 
// Design Name: 
// Module Name:    sobel 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: 
//
// Dependencies: 
//
// Revision: 
// Revision 0.01 - File Created
// Additional Comments: 
//
//
module sobel#(
       parameter DW = 8,
     parameter LINE_N  = 3,
     parameter iTHRESHOLD = 150
     )
  (
  input            pixelclk_i,
    input            rst_n,
    input            clk,
    input [DW-1:0]   din,
  output           pixelclk_o,
  output           dout
    );
  localparam DATA_IN_WIDTH = 11;
  //Sobel x
    localparam  X1 = 3'd1, X2 = 3'd0, X3 = 3'd1,
        X4 = 3'd2, X5 = 3'd0, X6 = 3'd2,
        X7 = 3'd1, X8 = 3'd0, X9 = 3'd1;
   //Sobel y
   localparam   Y1 = 3'd1, Y2 = 3'd2, Y3 = 3'd1,
                Y4 = 3'd0, Y5 = 3'd0, Y6 = 3'd0,
                Y7 = 3'd1, Y8 = 3'd2, Y9 = 3'd1;
  reg  [DW-1:0] din_r0[0:LINE_N-1];
    reg  [DW-1:0] din_r1[0:LINE_N-1];
    reg  [DW-1:0] din_r2[0:LINE_N-1];
  wire matrix_clken;
  matrix_3x3 uut_matrix_3x3(
    .clk(clk),            
    .rst_n(rst_n),              
    .per_clken(pixelclk_i),
    .per_img(din),
    .matrix_clken(matrix_clken),  
    .matrix_p11(din_r0[0]),           
    .matrix_p12(din_r0[1]),           
    .matrix_p13(din_r0[2]), 
    .matrix_p21(din_r1[0]),           
    .matrix_p22(din_r1[1]),           
    .matrix_p23(din_r1[2]),           
    .matrix_p31(din_r2[0]),           
    .matrix_p32(din_r2[1]),           
    .matrix_p33(din_r2[2])  
    );
  //1clk
  //1.Gx = P ★Sobelx -- 原始图像与 Sobel 算子 X 方向卷积;
  reg   [9:0]   Gx_temp1;//postive result
  reg   [9:0]   Gx_temp2;//negetive result
  reg   [9:0]   Gx_data;//Horizontal grade data
  always @(posedge clk or negedge rst_n)
  begin
    if(!rst_n)begin
      Gx_temp1 <= 10'd0;
      Gx_temp2 <= 10'd0;
      Gx_data  <= 10'd0;
    end 
    else begin
      Gx_temp1 <= din_r0[2]*X3 + din_r1[2]*X6 + din_r2[2]*X9;//postive result
      Gx_temp2 <= din_r0[0]*X1 + din_r1[0]*X4 + din_r2[0]*X7;//negetive result
      Gx_data  <= (Gx_temp1 >= Gx_temp2)? Gx_temp1 - Gx_temp2 : Gx_temp2 - Gx_temp1;
    end
  end
  // 2. Gy = P★Sobely -- 原始图像与 Sobel 算子 Y 方向卷积;
  always @(posedge clk or negedge rst_n)
  begin
    if(!rst_n)begin
      Gy_temp1 <= 10'd0;
      Gy_temp2 <= 10'd0;
    end 
    else begin
      Gy_temp1 <= din_r0[0]*X1 + din_r0[1]*X2 + din_r0[2]*X3;//postive result
      Gy_temp2 <= din_r2[0]*X1 + din_r2[1]*X2 + din_r2[2]*X3;//negetive result
    end
  end
  //得到GY和GX 1clk
   always @(posedge clk or negedge rst_n)
   begin  
    if(!rst_n)begin
      Gx_data  <= 10'd0;
      Gy_data  <= 10'd0;
    end 
    else begin
      Gx_data  <= (Gx_temp1 >= Gx_temp2)? Gx_temp1 - Gx_temp2 : Gx_temp2 - Gx_temp1;
      Gy_data  <= (Gy_temp1 >= Gy_temp2)? Gy_temp1 - Gy_temp2 : Gy_temp2 - Gy_temp1;
    end
   end  
   // 3. 实现平方和
  wire  [10:0]  dim;
  assign dim = Gx_data + Gy_data;
  // 4. 阈值比较形成边缘查找后的二值图像
  //1clk
  reg   post_img_bit_r;
  always @(posedge clk or negedge rst_n)
  begin
    if(!rst_n)
      post_img_bit_r <= 1'b0;
    else if(dim >= iTHRESHOLD)
      post_img_bit_r <= 1'b1;
    else 
      post_img_bit_r <= 1'b0;
  end 
  assign dout = post_img_bit_r;
  //per_clken delay 3clk  
  reg   [2:0] per_clken_r;
  always @(posedge clk or negedge rst_n)begin
    if(!rst_n)
      per_clken_r <= 3'b0;
    else 
      per_clken_r <= {per_clken_r[1:0], matrix_clken};
  end
  assign  pixelclk_o = per_clken_r[2];
endmodule
目录
相关文章
|
7月前
|
存储 算法 生物认证
基于Zhang-Suen算法的图像细化处理FPGA实现,包含testbench和matlab验证程序
本项目基于Zhang-Suen算法实现图像细化处理,支持FPGA与MATLAB双平台验证。通过对比,FPGA细化效果与MATLAB一致,可有效减少图像数据量,便于后续识别与矢量化处理。算法适用于字符识别、指纹识别等领域,配套完整仿真代码及操作说明。
|
9月前
|
存储 算法 数据安全/隐私保护
基于FPGA的图像退化算法verilog实现,分别实现横向和纵向运动模糊,包括tb和MATLAB辅助验证
本项目基于FPGA实现图像运动模糊算法,包含横向与纵向模糊处理流程。使用Vivado 2019.2与MATLAB 2022A,通过一维卷积模拟点扩散函数,完成图像退化处理,并可在MATLAB中预览效果。
|
算法 数据安全/隐私保护 计算机视觉
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。
|
算法 数据安全/隐私保护 异构计算
基于LSB最低有效位的音频水印嵌入提取算法FPGA实现,包含testbench和MATLAB对比
本项目展示了一种基于FPGA的音频水印算法,采用LSB(最低有效位)技术实现版权保护与数据追踪功能。使用Vivado2019.2和Matlab2022a开发,完整代码含中文注释及操作视频。算法通过修改音频采样点的最低有效位嵌入水印,人耳难以察觉变化。然而,面对滤波或压缩等攻击时,水印提取可能受影响。该项目运行效果无水印干扰,适合实时应用场景,核心逻辑简单高效,时间复杂度低。
|
编解码 算法 数据安全/隐私保护
基于FPGA的信号DM编解码实现,包含testbench和matlab对比仿真
本项目展示了DM编解码算法的实现与测试结果。FPGA测试结果显示为T1,Matlab仿真结果为T2。使用软件版本为Matlab 2022a和Vivado 2019.2。核心程序包含详细中文注释和操作视频。DM编解码通过比较信号样本差值进行编码,适用于音频等低频信号处理。硬件结构包括编码器(采样器、减法器、比较器)和解码器(解码器、积分器)。
|
监控 算法 数据安全/隐私保护
基于三帧差算法的运动目标检测系统FPGA实现,包含testbench和MATLAB辅助验证程序
本项目展示了基于FPGA与MATLAB实现的三帧差算法运动目标检测。使用Vivado 2019.2和MATLAB 2022a开发环境,通过对比连续三帧图像的像素值变化,有效识别运动区域。项目包括完整无水印的运行效果预览、详细中文注释的代码及操作步骤视频,适合学习和研究。
|
监控 算法 安全
基于颜色模型和边缘检测的火焰识别FPGA实现,包含testbench和matlab验证程序
本项目展示了基于FPGA的火焰识别算法,可在多种应用场景中实时检测火焰。通过颜色模型与边缘检测技术,结合HSV和YCbCr颜色空间,高效提取火焰特征。使用Vivado 2019.2和Matlab 2022a实现算法,并提供仿真结果与测试样本。FPGA平台充分发挥并行处理优势,实现低延迟高吞吐量的火焰检测。项目包含完整代码及操作视频说明。
|
算法 异构计算
FPGA强化(10):基于Sobel算法的边缘检测(二)
FPGA强化(10):基于Sobel算法的边缘检测(二)
277 0
|
算法 数据安全/隐私保护 异构计算
基于FPGA的变步长LMS自适应滤波器verilog实现,包括testbench
### 自适应滤波器仿真与实现简介 本项目基于Vivado2022a实现了变步长LMS自适应滤波器的FPGA设计。通过动态调整步长因子,该滤波器在收敛速度和稳态误差之间取得良好平衡,适用于信道均衡、噪声消除等信号处理应用。Verilog代码展示了关键模块如延迟单元和LMS更新逻辑。仿真结果验证了算法的有效性,具体操作可参考配套视频。
555 74
|
机器学习/深度学习 算法 数据安全/隐私保护
基于FPGA的SNN脉冲神经网络之LIF神经元verilog实现,包含testbench
本项目展示了 LIF(Leaky Integrate-and-Fire)神经元算法的实现与应用,含无水印运行效果预览。基于 Vivado2019.2 开发,完整代码配有中文注释及操作视频。LIF 模型模拟生物神经元特性,通过积分输入信号并判断膜电位是否达阈值产生脉冲,相较于 Hodgkin-Huxley 模型更简化,适合大规模神经网络模拟。核心程序片段示例,助您快速上手。
下一篇
开通oss服务