问答 店铺
热搜: ZYNQ FPGA discuz

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

微信扫一扫 分享朋友圈

已有 35 人浏览分享

开启左侧

FPGA图像处理-图像拉普拉斯边缘提取处理

[复制链接]
35 0
安路-FPGA课程
安路课程: 图像算法 » 图像新手入门实验
安路系列: EG4
本帖最后由 UT发布 于 2025-4-2 16:06 编辑

软件版本:Anlogic -TD5.6.1-64bit
操作系统:WIN10 64bit
硬件平台:适用安路(Anlogic)FPGA
登录米联客”FPGA社区-www.uisrc.com视频课程、答疑解惑!
1概述

本文简述了图像拉普拉斯边缘提取的算法,讲解如何进行Verilog的算法实现,并进行上板实验。

2算法原理简介

边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。 这些包括:

1、图像深度上的不连续
2、二维面方向不连续
3、物质属性变化
4、场景照明变化

边缘检测是图像处理和计算机视觉中,尤其是特征提取中的一个研究领域。

图像边缘检测大幅度地减少了数据量,并且剔除了可以认为不相关的信息,保留了图像重要的结构属性。有许多方法用于边缘检测,它们的绝大部分可以划分为两类:基于查找一类和基于零穿越的一类。基于查找的方法通过寻找图像一阶导数中的最大和最小值来检测边界,通常是将边界定位在梯度最大的方向。基于零穿越的方法通过寻找图像二阶导数零穿越来寻找边界,通常是Laplacian过零点或者非线性差分表示的过零点。

拉普拉斯边缘提取3x3的匹配模板如下:

image.jpg
3工程实现
3.1Verilog代码分析

变量声明

  1. reg        [2:0]                i_hsyn_d;
  2. reg        [2:0]                i_vsyn_d;
  3. reg        [2:0]                i_en_d;
  4. wire [11:0]                sum_r;
  5. wire [11:0]                sum_g;
  6. wire [11:0]                sum_b;
  7. reg [11:0]                sum_r1;
  8. reg [11:0]                sum_g1;
  9. reg [11:0]                sum_b1;
  10. reg [11:0]                sum_r2;
  11. reg [11:0]                sum_g2;
  12. reg [11:0]                sum_b2;
  13. reg [7:0]                lap_r;
  14. reg [7:0]                lap_g;
  15. reg [7:0]                lap_b;
  16. wire [7:0]        r_temp_11;
  17. wire [7:0]        r_temp_12;
  18. wire [7:0]        r_temp_13;
  19. wire [7:0]        r_temp_21;
  20. wire [7:0]        r_temp_22;
  21. wire [7:0]        r_temp_23;
  22. wire [7:0]        r_temp_31;
  23. wire [7:0]        r_temp_32;
  24. wire [7:0]        r_temp_33;
  25. wire [7:0]        g_temp_11;
  26. wire [7:0]        g_temp_12;
  27. wire [7:0]        g_temp_13;
  28. wire [7:0]        g_temp_21;
  29. wire [7:0]        g_temp_22;
  30. wire [7:0]        g_temp_23;
  31. wire [7:0]        g_temp_31;
  32. wire [7:0]        g_temp_32;
  33. wire [7:0]        g_temp_33;
  34. wire [7:0]        b_temp_11;
  35. wire [7:0]        b_temp_12;
  36. wire [7:0]        b_temp_13;
  37. wire [7:0]        b_temp_21;
  38. wire [7:0]        b_temp_22;
  39. wire [7:0]        b_temp_23;
  40. wire [7:0]        b_temp_31;
  41. wire [7:0]        b_temp_32;
  42. wire [7:0]        b_temp_33;
复制代码
输出赋值
  1. assign o_hs = i_hsyn_d[2];
  2. assign o_vs = i_vsyn_d[2];
  3. assign o_en = i_en_d[2]        ;
  4. assign o_r        = lap_r;
  5. assign o_g        = lap_g;
  6. assign o_b        = lap_b;
复制代码
信号同步化
  1. always@(posedge i_clk )
  2. begin
  3.         i_hsyn_d <=        {i_hsyn_d[1:0],i_hsyn};
  4.         i_vsyn_d <=        {i_vsyn_d[1:0],i_vsyn};
  5.         i_en_d         <=        {i_en_d[1:0],i_en};
  6.             
  7. end
复制代码
调用3x3模板
  1. image_template u_r_template
  2. (
  3.         .i_clk                        (i_clk                                ),
  4.         .i_rst_n                (i_rst_n                        ),
  5.         .i_en                        (i_en                                ),
  6.         .i_data                        (i_r                                ),
  7.         .o_en                        (                                        ),
  8.         .o_temp_11                (r_temp_11                        ),
  9.         .o_temp_12                (r_temp_12                        ),
  10.         .o_temp_13                (r_temp_13                        ),        
  11.         .o_temp_21                (r_temp_21                        ),
  12.         .o_temp_22                (r_temp_22                        ),
  13.         .o_temp_23                (r_temp_23                        ),               
  14.         .o_temp_31                (r_temp_31                        ),
  15.         .o_temp_32                (r_temp_32                        ),
  16.         .o_temp_33                (r_temp_33                        )
  17. );
复制代码
调用3x3模板
  1. image_template u_g_template
  2. (
  3.         .i_clk                        (i_clk                                ),
  4.         .i_rst_n                (i_rst_n                        ),
  5.         .i_en                        (i_en                                ),
  6.         .i_data                        (i_g                                ),
  7.         .o_en                        (                                        ),
  8.         .o_temp_11                (g_temp_11                        ),
  9.         .o_temp_12                (g_temp_12                        ),
  10.         .o_temp_13                (g_temp_13                        ),        
  11.         .o_temp_21                (g_temp_21                        ),
  12.         .o_temp_22                (g_temp_22                        ),
  13.         .o_temp_23                (g_temp_23                        ),               
  14.         .o_temp_31                (g_temp_31                        ),
  15.         .o_temp_32                (g_temp_32                        ),
  16.         .o_temp_33                (g_temp_33                        )
  17. );
复制代码
调用3x3模板
  1. image_template u_b_template
  2. (
  3.         .i_clk                        (i_clk                                ),
  4.         .i_rst_n                (i_rst_n                        ),
  5.         .i_en                        (i_en                                ),
  6.         .i_data                        (i_b                                ),
  7.         .o_en                        (                                        ),
  8.         .o_temp_11                (b_temp_11                        ),
  9.         .o_temp_12                (b_temp_12                        ),
  10.         .o_temp_13                (b_temp_13                        ),        
  11.         .o_temp_21                (b_temp_21                        ),
  12.         .o_temp_22                (b_temp_22                        ),
  13.         .o_temp_23                (b_temp_23                        ),               
  14.         .o_temp_31                (b_temp_31                        ),
  15.         .o_temp_32                (b_temp_32                        ),
  16.         .o_temp_33                (b_temp_33                        )
  17. );
复制代码
执行加法运算
  1. always@(posedge i_clk or negedge i_rst_n)
  2. begin
  3.     if(!i_rst_n)
  4.         begin
  5.         sum_r1 <= 12'd0;
  6.         sum_g1 <= 12'd0;
  7.         sum_b1 <= 12'd0;
  8.                 sum_r2 <= 12'd0;
  9.         sum_g2 <= 12'd0;
  10.         sum_b2 <= 12'd0;
  11.     end
  12.     else
  13.         begin
  14.         sum_r1 <= r_temp_12 + r_temp_21 + r_temp_23 + r_temp_32;
  15.                 sum_r2 <= {2'd0,r_temp_22,2'd0};
  16.                
  17.         sum_g1 <= g_temp_12 + g_temp_21 + g_temp_23 + g_temp_32;
  18.                 sum_g2 <= {2'd0,g_temp_22,2'd0};        
  19.                
  20.         sum_b1 <= b_temp_12 + b_temp_21 + b_temp_23 + b_temp_32;
  21.                 sum_b2 <= {2'd0,b_temp_22,2'd0};
  22.     end
  23. end
复制代码
执行减法运算
  1. assign  sum_r = sum_r2 - sum_r1;
  2. assign         sum_g = sum_g2 - sum_g1;
  3. assign         sum_b = sum_b2 - sum_b1;
复制代码
求取r通道的拉普拉斯边缘
  1. always@(posedge i_clk or negedge i_rst_n)
  2. begin
  3.     if(!i_rst_n)
  4.         begin
  5.         lap_r <= 8'd0;
  6.     end
  7.     else if(sum_r[11:8] > 0)
  8.         begin
  9.         lap_r <= 8'd255;
  10.     end
  11.     else if(sum_r2 < sum_r1)
  12.         begin
  13.         lap_r <= 8'd0;
  14.     end
  15.         else
  16.         begin
  17.         lap_r <= sum_r[7:0];
  18.     end        
  19. end
复制代码
求取g通道的拉普拉斯边缘
  1. always@(posedge i_clk or negedge i_rst_n)
  2. begin
  3.     if(!i_rst_n)
  4.         begin
  5.         lap_g <= 8'd0;
  6.     end
  7.     else if(sum_g[11:8] > 0)
  8.         begin
  9.         lap_g <= 8'd255;
  10.     end
  11.     else if(sum_g2 < sum_g1)
  12.         begin
  13.         lap_g <= 8'd0;
  14.     end
  15.         else
  16.         begin
  17.         lap_g <= sum_g[7:0];
  18.     end        
  19. end
复制代码
求取b通道的拉普拉斯边缘
  1. always@(posedge i_clk or negedge i_rst_n)
  2. begin
  3.     if(!i_rst_n)
  4.         begin
  5.         lap_b <= 8'd0;
  6.     end
  7.     else if(sum_b[11:8] > 0)
  8.         begin
  9.         lap_b <= 8'd255;
  10.     end
  11.     else if(sum_b2 < sum_b1)
  12.         begin
  13.         lap_b <= 8'd0;
  14.     end
  15.         else
  16.         begin
  17.         lap_b <= sum_b[7:0];
  18.     end        
  19. end
复制代码
3.2工程结构
工程结构如图所示:
image.jpg

图像数据通过摄像头采集进来,先缓存在fifo中,然后通过写状态机,将图像数据送进DDR进行缓存,缓存后的图像数据从DDR中取出,通过读状态机送出到fifo中,然后算法处理模块在fifo中取出数据,完成数据处理后送到LCD进行显示输出。

4上板实验
image.jpg

点击下载后,可以看到正常的输出如下所示,摄像头的分辨率为640x480

image.jpg






您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0

关注

0

粉丝

270

主题
精彩推荐
热门资讯
网友晒图
图文推荐

  • 微信公众平台

  • 扫描访问手机版