FPGA实现sobel边缘检测并Modelsim仿真,与MATLAB实现效果对比

文章目录

  • 一、sobel边缘检测算法
    • 1.1 初识sobel边缘检测
    • 1.2 sobel原理
    • 1.3 应用
  • 二、matlab实现sobel边缘检测
  • 三、FPGA实现sobel边缘检测
    • 3.1 3*3窗口生成
    • 3.2 sobel算法模块
  • 四、modelsim仿真
  • 五、效果对比

基于均值、中值和高斯滤波等的实现,本文对sobel边缘检测进行实现。

一、sobel边缘检测算法

1.1 初识sobel边缘检测

边缘检测是是特征提取中的一个研究领域,它能边缘检测出数字图像中亮度变化明显的点,减少数据量,并剔除不相关的信息,最终保留图像重要的结构属性。常见的常用的边缘检测模板有Laplacian算子、Roberts算子、Sobel算子等。本文介绍Sobel算子。同时,Sobel 边缘检测通常带有方向性,可以只检测竖直边缘或垂直边缘或都检测

1.2 sobel原理

1、Sobel 提供了x水平和y垂直两个方向的滤波模板。
FPGA实现sobel边缘检测并Modelsim仿真,与MATLAB实现效果对比_第1张图片
采用上面模板对原图像A进行卷积,其中 Gx 为水平横向灰度值,Gy为垂直纵向灰度值
FPGA实现sobel边缘检测并Modelsim仿真,与MATLAB实现效果对比_第2张图片
2、由Gx和Gy,计算该点的灰度值,公式如下:

FPGA实现sobel边缘检测并Modelsim仿真,与MATLAB实现效果对比_第3张图片
由于公式涉及到开方运算,我们可调用IP核,也可对公式进行近似简化,以提高运算效率:
在这里插入图片描述
梯度方向的计算:
FPGA实现sobel边缘检测并Modelsim仿真,与MATLAB实现效果对比_第4张图片

3、设置阈值,小于阈值的G认为是边缘点。

1.3 应用

sobel边缘检测算法可在SIFT特征提取中使用。因为SIFT提取的特征点中含有边缘点,存在边缘响应的问题(不稳定的边缘点),我们即可在设置阈值,将不稳点边缘点剔除。FPGA实现sobel边缘检测并Modelsim仿真,与MATLAB实现效果对比_第5张图片

二、matlab实现sobel边缘检测

设置阈值:120;

clc;
clear all;
close all;

RGB = imread('flower.bmp');        %读取图片
gray = double(rgb2gray(RGB));     %灰度图

[ROW,COL, DIM] = size(gray);      %得到图像行列数
value = 120;                      %阈值设置
Sobel_img = zeros(ROW,COL);

for r = 2:ROW-1
    for c = 2:COL-1
        Gx = gray(r-1,c+1) + 2*gray(r,c+1) + gray(r+1,c+1) - gray(r-1,c-1) - 2*gray(r,c-1) - gray(r+1,c-1);
        Gy = gray(r-1,c-1) + 2*gray(r-1,c) + gray(r-1,c+1) - gray(r+1,c-1) - 2*gray(r+1,c) - gray(r+1,c+1);
        G = abs(Gx) + abs(Gy);
        %G = sqrt(Gx^2 + Gy^2);
        if(G > value)
            Sobel_img(r,c)=0;
        else
            Sobel_img(r,c)=255;
        end
    end
end

subplot(2,2,1); imshow(RGB);      title('原图');
subplot(2,2,2); imshow(gray/256);title('原图');
subplot(2,2,3); imshow(Sobel_img);title('Sobel');

imwrite(gray/256,'灰度图.bmp');
imwrite(Sobel_img,'sobel.bmp');

运行结果:
FPGA实现sobel边缘检测并Modelsim仿真,与MATLAB实现效果对比_第6张图片

三、FPGA实现sobel边缘检测

注意:加入value信号,进行阈值比较。
FPGA实现sobel边缘检测并Modelsim仿真,与MATLAB实现效果对比_第7张图片

3.1 3*3窗口生成

同高斯滤波,由于sobel边缘检测仍是33卷积运算,因此我们要生成33窗口。

3.2 sobel算法模块

流水并行处理:
第一级流水线并行:计算Gx模板左右列乘积和,计算Gy模板上下行乘积和
第二级流水并行:计算|Gx|和|Gy|——注意正负数的处理
第三级流水线:计算绝对值之和,得到最终的|G| = |Gx| + |Gy|

组合逻辑:阈值比较


FPGA实现sobel边缘检测并Modelsim仿真,与MATLAB实现效果对比_第8张图片


verilog代码如下:

module sobel(
    input            clk,
    input            rst_n,
	 input    [7:0]   value,
	 
    input      		iValid,

    input   [7:0]     sobel_11,sobel_12,sobel_13, //生成的3*3窗口数据
    input   [7:0]     sobel_21,sobel_22,sobel_23,
    input   [7:0]     sobel_31,sobel_32,sobel_33,

    output  			 sobel_de    ,//de同步信号
	 
    output  wire  [7:0]    sobel_data  // 高斯卷积:加权平均后的值

);

reg [2:0]           de_shift1 ;  

reg [9:0]     Gx1, Gx2 ,Gy1 ,Gy2 ,Gx,Gy;
reg [10:0]    G;    
reg [7:0]     sodel;
                                 

//---------------------------------------------------
//                   sobel三级流水线
//---------------------------------------------------


//clk1,计算Gx模板左右列乘积和,计算Gy模板上下行乘积和

always @ (posedge clk or negedge rst_n)
    if(!rst_n) begin
	     Gx1 <= 1'b0;
		  Gx2 <= 1'b0;
		  Gy1 <= 1'b0;
		  Gy2 <= 1'b0;
		  
	 end
	 else begin
	     Gx1 <= sobel_11 + (sobel_21 << 1) + sobel_31 ;
		  Gx2 <= sobel_13 + (sobel_23 << 1) + sobel_33 ;
		  Gy1 <= sobel_11 + (sobel_12 << 1) + sobel_13 ;
		  Gy2 <= sobel_31 + (sobel_32 << 1) + sobel_33 ;
	 end
	 
//clk2,计算 |Gx||Gy|,正负号的处理要注意
always @ (posedge clk or negedge rst_n)
    if(!rst_n) begin
	     Gx <= 1'b0;
		  Gy <= 1'b0;
		  end

	 else begin
	     Gx = (Gx1 > Gx2) ? (Gx1 - Gx2) : (Gx2 - Gx1) ;
		  Gy = (Gy1 > Gy2) ? (Gy1 - Gy2) : (Gy2 - Gy1) ;
		 end
		  
//	clk3,计算|Gx|+|Gy|

always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        G <= 1'd0;
    end
    else begin
        G <= Gx  + Gy  ;
    end
end
	  
//	阈值比较
always @(*)
    if(G > value)
	     sodel <= 8'b0;
	 else
	     sodel <= 8'd255;
	 
assign sobel_data = sodel;
	  
// 打拍做同步
always @(posedge clk or  negedge rst_n) begin
        if(!rst_n)begin
            de_shift1   <=  3'b0;
				
				end
        else begin
            de_shift1 <= {de_shift1[1:0], iValid};
				end
    end
    assign sobel_de   = de_shift1[2];
  endmodule

四、modelsim仿真

阈值设为120

// 实例化
sobel_top sobel_top(
    .clk             (clk),
    .rst_n           (rst_n),
    .iValid          (iValid),
    .iData           (gray),
	  .value           (8'd120),
    .oValid          (oValid),
    .oData           (oData)
);

波形和高斯滤波等分析方式相同。
FPGA实现sobel边缘检测并Modelsim仿真,与MATLAB实现效果对比_第9张图片

五、效果对比

原图:
FPGA实现sobel边缘检测并Modelsim仿真,与MATLAB实现效果对比_第10张图片
Matlab实现sobel边缘检测:
FPGA实现sobel边缘检测并Modelsim仿真,与MATLAB实现效果对比_第11张图片

FPGA实现sobel边缘检测:
FPGA实现sobel边缘检测并Modelsim仿真,与MATLAB实现效果对比_第12张图片

你可能感兴趣的:(matlab,fpga开发,图像处理)