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


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

一、sobel边缘检测算法

1.1 初识sobel边缘检测

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

1.2 sobel原理

1、Sobel 提供了x水平和y垂直两个方向的滤波模板。
在这里插入图片描述
采用上面模板对原图像A进行卷积,其中 Gx 为水平横向梯度幅值,Gy为垂直方向梯度幅值。(梯度:灰度值的变化情况,梯度幅值相当于2个相邻像素灰度值之间的差异。)在这里插入图片描述
2、由Gx和Gy,计算该点的梯度幅值,公式如下:

在这里插入图片描述
由于公式涉及到开方运算,我们可调用IP核,也可对公式进行近似简化,以提高运算效率:
在这里插入图片描述
梯度方向的计算:
在这里插入图片描述

3、设置阈值,大于阈值的梯度值G设置黑色,也就是边缘点。(因为梯度值越大,说明变化越快)

1.3 应用

sobel边缘检测算法可在SIFT特征提取中使用。因为SIFT提取的特征点中含有边缘点,存在边缘响应的问题(不稳定的边缘点),我们即可在设置阈值,将不稳点边缘点剔除。在这里插入图片描述

二、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边缘检测

注意:加入value信号,进行阈值比较。
在这里插入图片描述

3.1 3*3窗口生成

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

3.2 sobel算法模块

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

组合逻辑:阈值比较(二值化)


在这里插入图片描述


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  // sobel算子:加权平均后的值

);

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,计算G = |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)
);

波形和高斯滤波等分析方式相同。
在这里插入图片描述

五、效果对比

原图:
在这里插入图片描述
Matlab实现sobel边缘检测:
在这里插入图片描述

FPGA实现sobel边缘检测:
在这里插入图片描述

  • 7
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fighting_FPGA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值