基于 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
目录
相关文章
|
23小时前
|
存储 算法
m基于LDPC编译码的matlab误码率仿真,对比SP,MS,NMS以及OMS四种译码算法
MATLAB 2022a仿真实现了LDPC译码算法比较,包括Sum-Product (SP),Min-Sum (MS),Normalized Min-Sum (NMS)和Offset Min-Sum (OMS)。四种算法在不同通信场景有各自优势:SP最准确但计算复杂度高;MS计算复杂度最低但性能略逊;NMS通过归一化提升低SNR性能;OMS引入偏置优化高SNR表现。适用于资源有限或高性能需求的场景。提供的MATLAB代码用于仿真并绘制不同SNR下的误码率曲线。
15 3
|
2天前
|
算法 异构计算
基于直方图的图像曝光量分析FPGA实现,包含tb测试文件和MATLAB辅助验证
该内容包括了算法的运行效果展示、软件版本信息、理论概述和核心程序代码。在正常图像中,`checkb`位于`f192b`和`f250b`之间,而多度曝光图像中`checkb`超出此范围,判断为曝光过度。使用的软件为Vivado 2019.2和MATLAB 2022a。理论依据未详细给出,但提及主要方法。提供的Verilog代码段用于处理图像数据,包括读取文件、时钟控制及图像histogram计算等,其中模块`im_hist`似乎是关键部分。
|
4天前
|
算法 数据安全/隐私保护 计算机视觉
基于DCT变换的彩色图像双重水印嵌入和提取算法matlab仿真
**算法摘要:** - 图形展示:展示灰度与彩色图像水印应用,主辅水印嵌入。 - 软件环境:MATLAB 2022a。 - 算法原理:双重水印,转换至YCbCr/YIQ,仅影响亮度;图像分割为M×N块,DCT变换后嵌入水印。 - 流程概览:两步水印嵌入,每步对应不同图示表示。 - 核心代码未提供。
|
4天前
|
机器学习/深度学习 算法 数据可视化
Matlab决策树、模糊C-均值聚类算法分析高校教师职称学历评分可视化
Matlab决策树、模糊C-均值聚类算法分析高校教师职称学历评分可视化
10 0
|
4天前
|
算法 TensorFlow 算法框架/工具
基于直方图的图像阈值计算和分割算法FPGA实现,包含tb测试文件和MATLAB辅助验证
这是一个关于图像处理的算法实现摘要,主要包括四部分:展示了四张算法运行的效果图;提到了使用的软件版本为VIVADO 2019.2和matlab 2022a;介绍了算法理论,即基于直方图的图像阈值分割,通过灰度直方图分布选取阈值来区分图像区域;并提供了部分Verilog代码,该代码读取图像数据,进行处理,并输出结果到&quot;result.txt&quot;以供MATLAB显示图像分割效果。
|
5天前
|
算法 搜索推荐 数据挖掘
MATLAB模糊C均值聚类FCM改进的推荐系统协同过滤算法分析MovieLens电影数据集
MATLAB模糊C均值聚类FCM改进的推荐系统协同过滤算法分析MovieLens电影数据集
13 0
|
6天前
|
数据采集 机器学习/深度学习 存储
MATLAB用改进K-Means(K-均值)聚类算法数据挖掘高校学生的期末考试成绩
MATLAB用改进K-Means(K-均值)聚类算法数据挖掘高校学生的期末考试成绩
13 0
|
7天前
|
算法 数据安全/隐私保护 数据格式
基于混沌序列的图像加解密算法matlab仿真,并输出加解密之后的直方图
该内容是一个关于混沌系统理论及其在图像加解密算法中的应用摘要。介绍了使用matlab2022a运行的算法,重点阐述了混沌系统的特性,如确定性、非线性、初值敏感性等,并以Logistic映射为例展示混沌序列生成。图像加解密流程包括预处理、混沌序列生成、数据混淆和扩散,以及密钥管理。提供了部分核心程序,涉及混沌序列用于图像像素的混淆和扩散过程,通过位操作实现加密。
|
7天前
|
数据采集 算法 数据可视化
MATLAB、R用改进Fuzzy C-means模糊C均值聚类算法的微博用户特征调研数据聚类研究
MATLAB、R用改进Fuzzy C-means模糊C均值聚类算法的微博用户特征调研数据聚类研究
15 1
|
13天前
|
机器学习/深度学习 人工智能 算法
基于DCT和扩频的音频水印嵌入提取算法matlab仿真
本文介绍了结合DCT和扩频技术的音频水印算法,用于在不降低音质的情况下嵌入版权信息。在matlab2022a中实现,算法利用DCT进行频域处理,通过扩频增强水印的隐蔽性和抗攻击性。核心程序展示了水印的嵌入与提取过程,包括DCT变换、水印扩频及反变换步骤。该方法有效且专业,未来研究将侧重于提高实用性和安全性。

热门文章

最新文章