基于 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
目录
相关文章
|
10天前
|
存储 算法 调度
基于和声搜索优化算法的机器工作调度matlab仿真,输出甘特图
本程序基于和声搜索优化算法(Harmony Search, HS),实现机器工作调度的MATLAB仿真,输出甘特图展示调度结果。算法通过模拟音乐家即兴演奏寻找最佳和声的过程,优化任务在不同机器上的执行顺序,以最小化完成时间和最大化资源利用率为目标。程序适用于MATLAB 2022A版本,运行后无水印。核心参数包括和声记忆大小(HMS)等,适应度函数用于建模优化目标。附带完整代码与运行结果展示。
|
3天前
|
算法 安全 数据安全/隐私保护
基于AES的遥感图像加密算法matlab仿真
本程序基于MATLAB 2022a实现,采用AES算法对遥感图像进行加密与解密。主要步骤包括:将彩色图像灰度化并重置大小为256×256像素,通过AES的字节替换、行移位、列混合及轮密钥加等操作完成加密,随后进行解密并验证图像质量(如PSNR值)。实验结果展示了原图、加密图和解密图,分析了图像直方图、相关性及熵的变化,确保加密安全性与解密后图像质量。该方法适用于保护遥感图像中的敏感信息,在军事、环境监测等领域具有重要应用价值。
|
18天前
|
算法 数据可视化 BI
基于免疫算法的最优物流仓储点选址方案MATLAB仿真
本程序基于免疫算法实现物流仓储点选址优化,并通过MATLAB 2022A仿真展示结果。核心代码包括收敛曲线绘制、最优派送路线规划及可视化。算法模拟生物免疫系统,通过多样性生成、亲和力评价、选择、克隆、变异和抑制机制,高效搜索最优解。解决了物流仓储点选址这一复杂多目标优化问题,显著提升物流效率与服务质量。附完整无水印运行结果图示。
基于免疫算法的最优物流仓储点选址方案MATLAB仿真
|
7天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于GA遗传优化TCN-GRU时间卷积神经网络时间序列预测算法matlab仿真
本项目基于MATLAB2022a开发,提供无水印算法运行效果预览及核心程序(含详细中文注释与操作视频)。通过结合时间卷积神经网络(TCN)和遗传算法(GA),实现复杂非线性时间序列的高精度预测。TCN利用因果卷积层与残差连接提取时间特征,GA优化超参数(如卷积核大小、层数等),显著提升模型性能。项目涵盖理论概述、程序代码及完整实现流程,适用于金融、气象、工业等领域的时间序列预测任务。
|
7天前
|
算法 定位技术 数据安全/隐私保护
基于遗传优化算法的多AGV栅格地图路径规划matlab仿真
本程序基于遗传优化算法实现多AGV栅格地图路径规划的MATLAB仿真(测试版本:MATLAB2022A)。支持单个及多个AGV路径规划,输出路径结果与收敛曲线。核心程序代码完整,无水印。算法适用于现代工业与物流场景,通过模拟自然进化机制(选择、交叉、变异)解决复杂环境下的路径优化问题,有效提升效率并避免碰撞。适合学习研究多AGV系统路径规划技术。
|
15天前
|
算法 数据安全/隐私保护
基于GA遗传算法的斜拉桥静载试验车辆最优布载matlab仿真
本程序基于遗传算法(GA)实现斜拉桥静载试验车辆最优布载的MATLAB仿真,旨在自动化确定车辆位置以满足加载效率ηq(0.95≤ηq≤1.05)的要求,目标是使ηq尽量接近1,同时减少加载车辆数量和布载耗时。程序通过迭代优化计算车辆位置、方向、类型及占用车道等参数,并展示适应度值收敛过程。测试版本为MATLAB2022A,包含核心代码与运行结果展示。优化模型综合考虑车辆总重量、间距及桥梁允许载荷密度等约束条件,确保布载方案科学合理。
|
8天前
|
传感器 存储 算法
基于ECC簇内分组密钥管理算法的无线传感器网络matlab性能仿真
本程序基于ECC(椭圆曲线密码学)簇内分组密钥管理算法,对无线传感器网络(WSN)进行MATLAB性能仿真。通过对比网络通信开销、存活节点数量、网络能耗及数据通信量四个关键指标,验证算法的高效性和安全性。程序在MATLAB 2022A版本下运行,结果无水印展示。算法通过将WSN划分为多个簇,利用ECC生成和分发密钥,降低计算与通信成本,适用于资源受限的传感器网络场景,确保数据保密性和完整性。
|
18天前
|
机器学习/深度学习 算法 JavaScript
基于GA遗传优化TCN时间卷积神经网络时间序列预测算法matlab仿真
本内容介绍了一种基于遗传算法优化的时间卷积神经网络(TCN)用于时间序列预测的方法。算法运行于 Matlab2022a,完整程序无水印,附带核心代码、中文注释及操作视频。TCN通过因果卷积层与残差连接学习时间序列复杂特征,但其性能依赖超参数设置。遗传算法通过对种群迭代优化,确定最佳超参数组合,提升预测精度。此方法适用于金融、气象等领域,实现更准确可靠的未来趋势预测。
|
30天前
|
算法 数据安全/隐私保护 异构计算
基于LSB最低有效位的音频水印嵌入提取算法FPGA实现,包含testbench和MATLAB对比
本项目展示了一种基于FPGA的音频水印算法,采用LSB(最低有效位)技术实现版权保护与数据追踪功能。使用Vivado2019.2和Matlab2022a开发,完整代码含中文注释及操作视频。算法通过修改音频采样点的最低有效位嵌入水印,人耳难以察觉变化。然而,面对滤波或压缩等攻击时,水印提取可能受影响。该项目运行效果无水印干扰,适合实时应用场景,核心逻辑简单高效,时间复杂度低。
|
30天前
|
算法 数据安全/隐私保护
基于GA遗传算法的拱桥静载试验车辆最优布载matlab仿真
本程序基于遗传算法(GA)实现拱桥静载试验车辆最优布载的MATLAB仿真,旨在自动化确定车辆位置以满足加载效率要求(0.95≤ηq≤1.05),目标是使ηq尽量接近1,同时减少车辆数量和布载耗时。程序在MATLAB 2022A版本下运行,展示了工况1至工况3的测试结果。通过优化模型,综合考虑车辆重量、位置、类型及车道占用等因素,确保桥梁关键部位承受最大荷载,从而有效评估桥梁性能。核心代码实现了迭代优化过程,并输出最优布载方案及相关参数。

热门文章

最新文章