FPGA图像处理之边缘检测算法的实现

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

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

  1. 边缘检测算子

一阶:Roberts Cross算子,Prewitt算子,Sobel算子,Kirsch算子,罗盘算子;二阶:Marr-Hildreth,在梯度方向的二阶导数过零点,Canny算子,Laplacian算子。今天我们要讲的是基于Sobel算子的边缘检测的FPGA算法的实现。

  1. Sobel算子实现

Sobel算法是像素图像边缘检测中最重要的算子之一,在机器学习、数字媒体、计算机视觉等信息科技领域起着举足轻重的作用。在技术上,它是一个离散的一阶差分算子,用来计算图像亮度函数的一阶梯度之近似值。在图像的任何一点使用此算子,将会产生该点对应的梯度矢量或是其法矢量

Soble边缘检测算法比较简,实际应用中效率比canny边缘检测效率要高,但是边缘不如Canny检测的准确,但是很多实际应用的场合,sobel边缘却是首选,尤其是对效率要求较高,而对细纹理不太关心的时候。

Soble边缘检测通常带有方向性,可以只检测竖直边缘或垂直边缘或都检测。

-1

0

+1

-2

0

+2

-1

0

+1

Sobel算子 x方向

+1

+2

+1

0

0

0

-1

-2

-1

    Y方向  

(i-1,j-1)

( i,j-1)

(i+1,j-1)

(i-1,j)

(i,j)

(i+1,j)

(i-1,j+1)

(i,j+1)

(i+1,j+1)

原始图像P

实现步骤:

 1.Gx = P ★Sobelx   -- 原始图像与Sobel算子X方向卷积;

 2.  Gy= P★Sobely   -- 原始图像与Sobel算子Y方向卷积;

3.![image.png](https://ucc.alicdn.com/pic/developer-ecology/dnfmyqknx5cmo_2209a5e9192e4d3585af0e8f46680718.png)

  1. 阈值比较形成边缘查找后的二值图像。

  2. C语言实现

/* Sobel template

a00 a01 a02

a10 a11 a12

a20 a21 a22

*/

unsigned char a00, a01, a02;

unsigned char a10, a11, a12;

unsigned char a20, a21, a22;

void MySobel(IplImage* gray, IplImage* gradient)

{
   

CvScalar color ;

for (int i=1; i<gray->height-1; ++i)

{
   

for (int j=1; j<gray->width-1; ++j)

{
   

a00 = cvGet2D(gray, i-1, j-1).val[0];

a01 = cvGet2D(gray, i-1, j).val[0];

a02 = cvGet2D(gray, i-1, j+1).val[0];

a10 = cvGet2D(gray, i, j-1).val[0];

a11 = cvGet2D(gray, i, j).val[0];

a12 = cvGet2D(gray, i, j+1).val[0];

a20 = cvGet2D(gray, i+1, j-1).val[0];

a21 = cvGet2D(gray, i+1, j).val[0];

a22 = cvGet2D(gray, i+1, j+1).val[0];

// x方向上的近似导数  卷积运算

double ux = a20 * (1) + a10 * (2) + a00 * (1)

+ (a02 * (-1) + a12 * (-2) + a22 * (-1));

// y方向上的近似导数  卷积运算

double uy = a02 * (1) + a01 * (2) + a00 * (1)

+ a20 * (-1) + a21 * (-2) + a22 * (-1);

color.val[0] = sqrt(ux*ux + uy*uy);

cvSet2D(gradient, i, j, color);

}

}

}

//注释:该程序需要在安装Opencv软件下运行。

  1. Matlab边缘检测的实现
ps=imread('lena.jpg'); %读取图像

subplot(1,3,1)

imshow(ps);

title('原图像');

ps=rgb2gray(ps);

[m,n]=size(ps); %用Sobel微分算子进行边缘检测

pa = edge(ps,'sobel');

subplot(1,3,2);

imshow(pa);

title('Sobel边缘检测得到的图像');

结果:

效果图

  1. FPGA实现

    硬件平台:小梅哥AC620开发板,4.3英寸TFT显示屏

    软件:Quartus 13.0

我将在FPGA程序中注释,表示实现过程。我们使用的图像为480x272。

/*

Filename    : Sobel.v

Compiler    : Quartus II 13.0

Description: implement Sobel Edge Detector

Release     :

*/



modulesobel (

  input            iCLK,

  input            iRST_N,

  input     [7:0] iTHRESHOLD,

  input            iDVAL,

  input     [9:0] iDATA,

  output reg       oDVAL,

  output reg [9:0] oDATA

);

//----------------------------------------------------

// 将Sobel算子换算成有符号数(signed)

//----------------------------------------------------

// maskx

parameterX1 = 8'hff, X2 = 8'h00, X3 = 8'h01;

parameterX4 = 8'hfe, X5 = 8'h00, X6 = 8'h02;

parameterX7 = 8'hff, X8 = 8'h00, X9 = 8'h01;



// masky

parameterY1 = 8'h01, Y2 = 8'h02, Y3 = 8'h01;

parameterY4 = 8'h00, Y5 = 8'h00, Y6 = 8'h00;

parameterY7 = 8'hff, Y8 = 8'hfe, Y9 = 8'hff;



wire  [7:0] Line0;

wire  [7:0] Line1;

wire  [7:0] Line2;



wire  [17:0] Mac_x0;

wire  [17:0] Mac_x1;

wire  [17:0] Mac_x2;



wire  [17:0] Mac_y0;

wire  [17:0] Mac_y1;

wire  [17:0] Mac_y2;



wire  [19:0] Pa_x;

wire  [19:0] Pa_y;



wire  [15:0] Abs_mag;

//---------------------------------------------

// 实现3x3矩阵原始图像 P

//---------------------------------------------

LineBufferLineBuffer_inst (

  .clken(iDVAL),

  .clock(iCLK),

  .shiftin(iDATA[9:2]),

  .taps0x(Line0),

  .taps1x(Line1),

  .taps2x(Line2)

);

//--------------------------------------------

// Gx = P★Sobelx

// x方向卷积运算实现

//---------------------------------------------

MAC_3 x0(

  .aclr3(!iRST_N),

  .clock0(iCLK),

  .dataa_0(Line0),

  .datab_0(X9),

  .datab_1(X8),

  .datab_2(X7),

  .result(Mac_x0)

);



MAC_3 x1(

  .aclr3(!iRST_N),

  .clock0(iCLK),

  .dataa_0(Line1),

  .datab_0(X6),

  .datab_1(X5),

  .datab_2(X4),

  .result(Mac_x1)

);



MAC_3 x2(

  .aclr3(!iRST_N),

  .clock0(iCLK),

  .dataa_0(Line2),

  .datab_0(X3),

  .datab_1(X2),

  .datab_2(X1),

  .result(Mac_x2)

);

PA_3 pa0(

  .clock(iCLK),

  .data0x(Mac_x0),

  .data1x(Mac_x1),

  .data2x(Mac_x2),

  .result(Pa_x)

);



//---------------------------------------------------

// Gy =P★Sobely

// y方向卷积运算的实现

//---------------------------------------------------

// Y

MAC_3 y0(

  .aclr3(!iRST_N),

  .clock0(iCLK),

  .dataa_0(Line0),

  .datab_0(Y9),

  .datab_1(Y8),

  .datab_2(Y7),

  .result(Mac_y0)

);



MAC_3 y1(

  .aclr3(!iRST_N),

  .clock0(iCLK),

  .dataa_0(Line1),

  .datab_0(Y6),

  .datab_1(Y5),

  .datab_2(Y4),

  .result(Mac_y1)

);



MAC_3 y2(

  .aclr3(!iRST_N),

  .clock0(iCLK),

  .dataa_0(Line2),

  .datab_0(Y3),

  .datab_1(Y2),

  .datab_2(Y1),

  .result(Mac_y2)

);

PA_3 pa1(

  .clock(iCLK),

  .data0x(Mac_y0),

  .data1x(Mac_y1),

  .data2x(Mac_y2),

  .result(Pa_y)

);

//-----------------------------------------------

// 得到G

//-----------------------------------------------

SQRTsqrt0 (

  .clk(iCLK),

  .radical(Pa_x * Pa_x + Pa_y * Pa_y),

  .q(Abs_mag)

);

//-------------------------------------------------

// 阈值比较

//-------------------------------------------------

always@(posedgeiCLK, negedge iRST_N) begin

  if (!iRST_N)

    oDVAL<= 0;

  else begin

    oDVAL <= iDVAL;



    if (iDVAL)

      oDATA <= (Abs_mag > iTHRESHOLD) ? 0: 1023;

    else

      oDATA <= 0;

  end

end



endmodule

IP设置

image.png

LineBufferIP设置

image.png

MAC_3 IP的设置

image.png

PA_3 IP的设置

FPGA基于Sobel算子图像边缘检测的实现结果:

image.png

lena原图

image.png

阈值3

image.png

阈值5

image.png

阈值7

  1. 引用文档

1---------------------------------------------------------------------百度百科

2基于FPGA的Sobel边缘检测的实现--------------------------------NingHeChuan

相关文章
|
2月前
|
canal 算法 vr&ar
【图像处理】基于电磁学优化算法的多阈值分割算法研究(Matlab代码实现)
【图像处理】基于电磁学优化算法的多阈值分割算法研究(Matlab代码实现)
121 1
|
2月前
|
存储 算法 生物认证
基于Zhang-Suen算法的图像细化处理FPGA实现,包含testbench和matlab验证程序
本项目基于Zhang-Suen算法实现图像细化处理,支持FPGA与MATLAB双平台验证。通过对比,FPGA细化效果与MATLAB一致,可有效减少图像数据量,便于后续识别与矢量化处理。算法适用于字符识别、指纹识别等领域,配套完整仿真代码及操作说明。
|
4月前
|
存储 算法 数据安全/隐私保护
基于FPGA的图像退化算法verilog实现,分别实现横向和纵向运动模糊,包括tb和MATLAB辅助验证
本项目基于FPGA实现图像运动模糊算法,包含横向与纵向模糊处理流程。使用Vivado 2019.2与MATLAB 2022A,通过一维卷积模拟点扩散函数,完成图像退化处理,并可在MATLAB中预览效果。
|
9月前
|
算法 数据安全/隐私保护 计算机视觉
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。
|
8月前
|
算法 数据安全/隐私保护 异构计算
基于LSB最低有效位的音频水印嵌入提取算法FPGA实现,包含testbench和MATLAB对比
本项目展示了一种基于FPGA的音频水印算法,采用LSB(最低有效位)技术实现版权保护与数据追踪功能。使用Vivado2019.2和Matlab2022a开发,完整代码含中文注释及操作视频。算法通过修改音频采样点的最低有效位嵌入水印,人耳难以察觉变化。然而,面对滤波或压缩等攻击时,水印提取可能受影响。该项目运行效果无水印干扰,适合实时应用场景,核心逻辑简单高效,时间复杂度低。
|
监控 算法 数据安全/隐私保护
基于三帧差算法的运动目标检测系统FPGA实现,包含testbench和MATLAB辅助验证程序
本项目展示了基于FPGA与MATLAB实现的三帧差算法运动目标检测。使用Vivado 2019.2和MATLAB 2022a开发环境,通过对比连续三帧图像的像素值变化,有效识别运动区域。项目包括完整无水印的运行效果预览、详细中文注释的代码及操作步骤视频,适合学习和研究。
|
算法 异构计算
FPGA强化(10):基于Sobel算法的边缘检测(二)
FPGA强化(10):基于Sobel算法的边缘检测(二)
201 0
|
7月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于FPGA的SNN脉冲神经网络之LIF神经元verilog实现,包含testbench
本项目展示了 LIF(Leaky Integrate-and-Fire)神经元算法的实现与应用,含无水印运行效果预览。基于 Vivado2019.2 开发,完整代码配有中文注释及操作视频。LIF 模型模拟生物神经元特性,通过积分输入信号并判断膜电位是否达阈值产生脉冲,相较于 Hodgkin-Huxley 模型更简化,适合大规模神经网络模拟。核心程序片段示例,助您快速上手。
|
10月前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的变步长LMS自适应滤波器verilog实现,包括testbench
### 自适应滤波器仿真与实现简介 本项目基于Vivado2022a实现了变步长LMS自适应滤波器的FPGA设计。通过动态调整步长因子,该滤波器在收敛速度和稳态误差之间取得良好平衡,适用于信道均衡、噪声消除等信号处理应用。Verilog代码展示了关键模块如延迟单元和LMS更新逻辑。仿真结果验证了算法的有效性,具体操作可参考配套视频。
362 74
|
8月前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的2ASK+帧同步系统verilog开发,包含testbench,高斯信道,误码统计,可设置SNR
本内容展示了基于Vivado2019.2的算法仿真效果,包括设置不同信噪比(SNR=8db和20db)下的结果及整体波形。同时,详细介绍了2ASK调制解调技术的原理与实现,即通过改变载波振幅传输二进制信号,并提供数学公式支持。此外,还涉及帧同步理论,用于确定数据帧起始位置。最后,给出了Verilog核心程序代码,实现了2ASK解调与帧同步功能,结合DDS模块生成载波信号,完成信号处理流程。
163 0

热门文章

最新文章