[X]关闭

[米联客-XILINX-H3_CZ08_7100] FPGA_图像入门连载-8FPGA 实现图像 3x3_5x5 算子模板

文档创建者:FPGA课程
浏览次数:22
最后更新:2024-10-17
文档课程分类-AMD-ZYNQ
AMD-ZYNQ: ZYNQ-FPGA部分 » 2_FPGA实验篇(仅旗舰) » 8-FPGA图像入门
本帖最后由 FPGA课程 于 2024-10-17 13:24 编辑

​ 软件版本:VIVADO2021.1
操作系统:WIN10 64bit
硬件平台:适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA
实验平台:米联客-MLK-H3-CZ08-7100开发板
板卡获取平台:https://milianke.tmall.com/
登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!



1 算子模板简介
在图像处理过程中,常常需要对图像进行滤波操作,进行滤波操作需要使用算子模板,也可以称之为扫描窗模 板,一般有 3x3、5x5、7x7 等模板形式。本文重在阐述算子模板的概念及使用 verilog 来描述其产生过程。下面咱们 从图像上来认识算子模板。
如图所示,展示了一个宽度为 15 个像素,高度为 8 个像素的图片,每个白色方块代表一个像素。

                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
实际的图像处理过程中会选定一个模板,假设使用 3x3 的模板,如图所示,灰色代表图像的边界,蓝色框表示 3x3 的模板,对整幅图像进行扫窗操作,在图之中标注了第一个和最后一个模板扫描的操作位置。

5b02c97691364206a325b4f131c2da6c.jpg
我们从图中可以观察到边界一行的像素是无法进行运算的,这个也是扫窗的一个缺点,无法对边界进行处理, 而且随着算子的变大边界无法处理的像素也会变多。后面进行具体操作时,会提出一种补充处理的方法。如图所示, 对浅灰色的边界进行扩展,就是图中的深灰色部分内容,一般简单处理,有复制边界为零的,也可以将原来的边界 进行复制。
9b4db147361140cebd9747f380f554cd.jpg
使用 5x5 的模板,如下图所示:

21c8626ce943442f878c516478830fbd.jpg
使用 5x5 的模板边界进行扩展
e7886f806de042bfb48ebff21663c5d4.jpg
前面已经分析了算子模板的原理,下面来介绍一下如何使用 verilog 来描述。我们使用FIFO 来缓存图像的行数 据,如果取 3x3  的模板,那么至少需要两个深度大于图像行数据的长度的 FIFO,通过首尾相连的形式来缓存两行 数据,等第三行数据到来之时,同时输出三行数据。注意,最后的 FIFO 输出数据是最早的数据,也就是第一行的 数据,如图所示:

b5235daaf70e409d978df2e92fc2ab02.jpg

2 设计分析
2.1Verilog代码分析
第一节介绍了 3x3 的模板和 5x5 的模板,本节描述,如何控制 FIFO 使其数据进行对齐的。
  1. parameter  H_ACTIVE = 1280; //图像宽度                              
  2. parameter  V_ACTIVE = 720;  //图像高度

  3. reg  [10:0]        h_cnt;
  4. reg  [10:0]        v_cnt;

  5. wire [7:0]        fifo_1_in;
  6. wire                 fifo_1_wr_en;
  7. wire                 fifo_1_rd_en;
  8. wire [7:0]        fifo_1_out;

  9. wire [7:0]        fifo_2_in;
  10. wire                 fifo_2_wr_en;
  11. wire                 fifo_2_rd_en;
  12. wire [7:0]        fifo_2_out;

  13. `ifdef TEMPLATE_5X5
  14. wire [7:0]        fifo_3_in;
  15. wire                 fifo_3_wr_en;
  16. wire                 fifo_3_rd_en;
  17. wire [7:0]        fifo_3_out;

  18. wire [7:0]        fifo_4_in;
  19. wire                 fifo_4_wr_en;
  20. wire                 fifo_4_rd_en;
  21. wire [7:0]        fifo_4_out;
  22. `endif


  23. //显示区域行计数
  24. always@(posedge i_clk or negedge i_rst_n)
  25. begin
  26.     if(!i_rst_n)
  27.         begin
  28.         h_cnt <= 11'd0;
  29.     end
  30.     else if(i_en)
  31.         begin
  32.                 if(h_cnt == H_ACTIVE - 1'b1)
  33.                         h_cnt <= 11'd0;
  34.                 else
  35.                         h_cnt <= h_cnt + 11'd1;
  36.     end
  37. end

  38. //显示区域场计数
  39. always@(posedge i_clk or negedge i_rst_n)
  40. begin
  41.     if(!i_rst_n)
  42.         begin
  43.         v_cnt <= 11'd0;
  44.     end
  45.     else if(h_cnt == H_ACTIVE - 1'b1)
  46.         begin
  47.                 if(v_cnt == V_ACTIVE - 1'b1)
  48.                         v_cnt <= 11'd0;
  49.                 else
  50.                         v_cnt <= v_cnt + 11'd1;
  51.     end
  52. end


  53. assign fifo_1_in        = i_data;
  54. assign fifo_1_wr_en        = (v_cnt < V_ACTIVE - 1) ? i_en : 1'b0;
  55. assign fifo_1_rd_en        = (v_cnt > 0) ? i_en : 1'b0;

  56. assign fifo_2_in        = fifo_1_out;
  57. assign fifo_2_wr_en        = fifo_1_rd_en;
  58. assign fifo_2_rd_en        = (v_cnt > 1) ? i_en : 1'b0;

  59. `ifdef TEMPLATE_5X5
  60. assign fifo_3_in        = fifo_2_out;
  61. assign fifo_3_wr_en        = fifo_2_rd_en;
  62. assign fifo_3_rd_en        = (v_cnt > 2) ? i_en : 1'b0;

  63. assign fifo_4_in        = fifo_3_out;
  64. assign fifo_4_wr_en        = fifo_3_rd_en;
  65. assign fifo_4_rd_en        = (v_cnt > 3) ? i_en : 1'b0;
  66. `endif

  67. fifo_generator_0 u_fifo_1(
  68.         .clk                (i_clk                        ),
  69.         .srst                (!i_rst_n                ),
  70.         .din                 (fifo_1_in                ),
  71.         .wr_en                (fifo_1_wr_en        ),
  72.         .rd_en                (fifo_1_rd_en        ),
  73.         .dout                 (fifo_1_out                ),
  74.         .full                 (                                ),
  75.         .empty                (                                ),
  76.         .data_count        (                                )
  77. );

  78. fifo_generator_0 u_fifo_2(
  79.         .clk                (i_clk                        ),
  80.         .srst                (!i_rst_n                ),
  81.         .din                 (fifo_2_in                ),
  82.         .wr_en                (fifo_2_wr_en        ),
  83.         .rd_en                (fifo_2_rd_en        ),
  84.         .dout                 (fifo_2_out                ),  
  85.         .full                 (                                ),
  86.         .empty                (                                ),
  87.         .data_count        (                                )
  88. );

  89. `ifdef TEMPLATE_5X5
  90. fifo_generator_0 u_fifo_3(
  91.         .clk                (i_clk                        ),
  92.         .srst                (!i_rst_n                ),
  93.         .din                 (fifo_3_in                ),
  94.         .wr_en                (fifo_3_wr_en        ),
  95.         .rd_en                (fifo_3_rd_en        ),
  96.         .dout                 (fifo_3_out                ),  
  97.         .full                 (                                ),
  98.         .empty                (                                ),
  99.         .data_count        (                                )
  100. );

  101. fifo_generator_0 u_fifo_4(
  102.         .clk                (i_clk                        ),
  103.         .srst                (!i_rst_n                ),
  104.         .din                 (fifo_4_in                ),
  105.         .wr_en                (fifo_4_wr_en        ),
  106.         .rd_en                (fifo_4_rd_en        ),
  107.         .dout                 (fifo_4_out                ),  
  108.         .full                 (                                ),
  109.         .empty                (                                ),
  110.         .data_count        (                                )
  111. );
  112. `endif

  113. `ifdef TEMPLATE_3X3
  114. always@(posedge i_clk or negedge i_rst_n)
  115. begin
  116.     if(!i_rst_n)
  117.         begin
  118.                 o_temp_11        <= 8'd0;
  119.                 o_temp_12        <= 8'd0;
  120.                 o_temp_13        <= 8'd0;
  121.                
  122.                 o_temp_21        <= 8'd0;
  123.                 o_temp_22        <= 8'd0;
  124.                 o_temp_23        <= 8'd0;
  125.                
  126.                 o_temp_31        <= 8'd0;
  127.                 o_temp_32        <= 8'd0;
  128.                 o_temp_33        <= 8'd0;
  129.     end
  130.         else
  131.         begin
  132.                 o_temp_11        <= o_temp_12;
  133.                 o_temp_12        <= o_temp_13;
  134.                 o_temp_13        <= fifo_2_out;
  135.                
  136.                 o_temp_21        <= o_temp_22;
  137.                 o_temp_22        <= o_temp_23;
  138.                 o_temp_23        <= fifo_1_out;
  139.                
  140.                 o_temp_31        <= o_temp_32;
  141.                 o_temp_32        <= o_temp_33;
  142.                 o_temp_33        <= i_data;        
  143.         end
  144. end

  145. always@(posedge i_clk or negedge i_rst_n)
  146. begin
  147.     if(!i_rst_n)
  148.         begin
  149.                 o_en        <= 1'b0;
  150.     end
  151.         else if((v_cnt > 1)&&(h_cnt > 1))
  152.         begin
  153.                 o_en        <= i_en;
  154.         end
  155.         else
  156.         begin
  157.                 o_en        <= 1'b0;
  158.         end        
  159. end
  160. `endif

  161. `ifdef TEMPLATE_5X5
  162. always@(posedge i_clk or negedge i_rst_n)
  163. begin
  164.     if(!i_rst_n)
  165.         begin
  166.                 o_temp_11        <= 8'd0;
  167.                 o_temp_12        <= 8'd0;
  168.                 o_temp_13        <= 8'd0;
  169.                 o_temp_14        <= 8'd0;
  170.                 o_temp_15        <= 8'd0;
  171.                 o_temp_21        <= 8'd0;
  172.                 o_temp_22        <= 8'd0;
  173.                 o_temp_23        <= 8'd0;
  174.                 o_temp_24        <= 8'd0;
  175.                 o_temp_25        <= 8'd0;
  176.                 o_temp_31   <= 8'd0;
  177.                 o_temp_32   <= 8'd0;
  178.                 o_temp_33   <= 8'd0;
  179.                 o_temp_34   <= 8'd0;
  180.                 o_temp_35   <= 8'd0;
  181.                 o_temp_41   <= 8'd0;
  182.                 o_temp_42   <= 8'd0;
  183.                 o_temp_43   <= 8'd0;
  184.                 o_temp_44        <= 8'd0;
  185.                 o_temp_45   <= 8'd0;
  186.                 o_temp_51   <= 8'd0;
  187.                 o_temp_52   <= 8'd0;
  188.                 o_temp_53   <= 8'd0;
  189.                 o_temp_54   <= 8'd0;
  190.                 o_temp_55   <= 8'd0;
  191.     end            
  192.         else            
  193.         begin
  194.                 o_temp_11        <= o_temp_12;
  195.                 o_temp_12        <= o_temp_13;
  196.                 o_temp_13        <= o_temp_14;
  197.                 o_temp_14        <= o_temp_15;
  198.                 o_temp_15        <= fifo_4_out;
  199.                
  200.                 o_temp_21        <= o_temp_22;
  201.                 o_temp_22        <= o_temp_23;
  202.                 o_temp_23        <= o_temp_24;
  203.                 o_temp_24        <= o_temp_25;
  204.                 o_temp_25        <= fifo_3_out;
  205.                
  206.                 o_temp_31   <= o_temp_32;
  207.                 o_temp_32   <= o_temp_33;
  208.                 o_temp_33   <= o_temp_34;
  209.                 o_temp_34   <= o_temp_35;
  210.                 o_temp_35   <= fifo_2_out;
  211.                
  212.                 o_temp_41   <= o_temp_42;
  213.                 o_temp_42   <= o_temp_43;
  214.                 o_temp_43   <= o_temp_44;
  215.                 o_temp_44        <= o_temp_45;
  216.                 o_temp_45   <= fifo_1_out;
  217.                
  218.                 o_temp_51   <= o_temp_52;
  219.                 o_temp_52   <= o_temp_53;
  220.                 o_temp_53   <= o_temp_54;
  221.                 o_temp_54   <= o_temp_55;
  222.                 o_temp_55   <= i_data;
  223.         end
  224. end

  225. always@(posedge i_clk or negedge i_rst_n)
  226. begin
  227.     if(!i_rst_n)
  228.         begin
  229.                 o_en        <= 1'b0;
  230.     end
  231.         else if((v_cnt > 3)&&(h_cnt > 3))
  232.         begin
  233.                 o_en        <= i_en;
  234.         end
  235.         else
  236.         begin
  237.                 o_en        <= 1'b0;
  238.         end        
  239. end
  240. `endif
  241. endmodule
复制代码

3 仿真及结果
3.1Vivadosim实验结果
3x3 的模板仿真图:
b2b30644ffea40a4a876291fc09ac56f.jpg
565a131149ff4523bae76395888fe136.jpg
a8c8cd154d71460da10b538cbcefd746.jpg
5x5 的模板仿真图:
d311a655b66c410285ca30ff5f606af7.jpg
55dcc772538748a398f334b7f8be4bfb.jpg

5b5d6ca899d54fcbbc85d694b60b9500.jpg


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

本版积分规则