[X]关闭

[米联客-XILINX-H3_CZ08_7100] FPGA_图像入门连载-9FPGA 实现图像均值滤波处理

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

​软件版本: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 图像均值滤波算法简介
均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的各 个像素值,即对待处理的当前像素点(x ,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像 素的均值,再把该均值赋予当前像素点(x ,y),作为处理后图像在该点上的灰度 g(x ,y),即
g(x, y) = Σ f (x, y) / m
m 为该模板中包含当前像素在内的像素总个数。图像处理的模板在上一讲介绍过,3x3 或 5x5 的模板都可以用 于均值滤波。
2 设计分析
2.1Matlab代码分析
源代码如下:
  1. 源代码如下:

  2. clear;clear all;clc;

  3. image_in = imread('lena_1280x720.jpg'); % [row,col,n] = size(image_in);

  4. image_gray    = rgb2gray(image_in);
  5. image_gray             = im2double(image_gray); %变为双精度类型
  6. average_image       = zeros(row,col);
  7. for i = 2:1:row-1
  8. for j = 2:1:col-1
  9. average_image(i,j) = (...
  10. image_gray(i-1,j-1)+image_gray(i-1,j)+image_gray(i-1,j+1)+...   image_gray(i,j-1)    +image_gray(i,j)    +image_gray(i,j+1)    +...
  11. image_gray(i+1,j-1)+image_gray(i+1,j)+image_gray(i+1,j+1))/9;%取中值 end
  12. end

  13. image_gray1   = imnoise  加入椒盐噪声
  14. image_gray1           = im2double  变为双精度
  15. average_image1     = zeros(row,col);
  16. for i = 2:1:row-1
  17. for j = 2:1:col-1
  18. average_image1(i,j) = (...
  19. image_gray1(i-1,j-1)+image_gray1(i-1,j)+image_gray1(i-1,j+1)+...   image_gray1(i,j-1)    +image_gray1(i,j)    +image_gray1(i,j+1)    +...
  20. image_gray1(i+1,j-1)+image_gray1(i+1,j)+image_gray1(i+1,j+1))/9;%取中值 end
  21. end

  22. image_gray2   = imnoise(image_gray,'gaussian',0.05); %加入高斯噪声 image_gray2           = im2double(image_gray2);
  23. average_image2     = zeros(row,col);
  24. for i = 2:1:row-1
  25. for j = 2:1:col-1
  26. average_image2(i,j) = (...
  27. image_gray2(i-1,j-1)+image_gray2(i-1,j)+image_gray2(i-1,j+1)+...   image_gray2(i,j-1)    +image_gray2(i,j)    +image_gray2(i,j+1)    +...
  28. image_gray2(i+1,j-1)+image_gray2(i+1,j)+image_gray2(i+1,j+1))/9;%取中值 end
  29. end

  30. figure
  31. subplot(321);
  32. imshow(image_gray    ), title('the original gray image');
  33. subplot(322);
  34. imshow(average_image), title('the average image'); subplot(323);
  35. imshow(image_gray1), title('the salt & pepper image'); subplot(324);
  36. imshow(average_image1), title('the average1 image'); subplot(325);
  37. imshow(image_gray2), title('the gaussian image'); subplot(326);
  38. imshow(average_image2), title('the average2 image');
复制代码
2.2Verilog代码分析
  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. );

  18. image_template u_g_template
  19. (
  20.         .i_clk                        (i_clk                                ),
  21.         .i_rst_n                (i_rst_n                        ),
  22.         .i_en                        (i_en                                ),
  23.         .i_data                        (i_g                                ),
  24.         .o_en                        (                                        ),
  25.         .o_temp_11                (g_temp_11                        ),
  26.         .o_temp_12                (g_temp_12                        ),
  27.         .o_temp_13                (g_temp_13                        ),        
  28.         .o_temp_21                (g_temp_21                        ),
  29.         .o_temp_22                (g_temp_22                        ),
  30.         .o_temp_23                (g_temp_23                        ),               
  31.         .o_temp_31                (g_temp_31                        ),
  32.         .o_temp_32                (g_temp_32                        ),
  33.         .o_temp_33                (g_temp_33                        )
  34. );

  35. image_template u_b_template
  36. (
  37.         .i_clk                        (i_clk                                ),
  38.         .i_rst_n                (i_rst_n                        ),
  39.         .i_en                        (i_en                                ),
  40.         .i_data                        (i_b                                ),
  41.         .o_en                        (                                        ),
  42.         .o_temp_11                (b_temp_11                        ),
  43.         .o_temp_12                (b_temp_12                        ),
  44.         .o_temp_13                (b_temp_13                        ),        
  45.         .o_temp_21                (b_temp_21                        ),
  46.         .o_temp_22                (b_temp_22                        ),
  47.         .o_temp_23                (b_temp_23                        ),               
  48.         .o_temp_31                (b_temp_31                        ),
  49.         .o_temp_32                (b_temp_32                        ),
  50.         .o_temp_33                (b_temp_33                        )
  51. );

  52. always@(posedge i_clk or negedge i_rst_n)
  53. begin
  54.     if(!i_rst_n)
  55.         begin
  56.         sum_r <= 12'd0;
  57.         sum_g <= 12'd0;
  58.         sum_b <= 12'd0;
  59.     end
  60.     else
  61.         begin
  62.         sum_r <= r_temp_11 +
  63.                          r_temp_12 +
  64.                          r_temp_13 +
  65.                          r_temp_21 +
  66.                          r_temp_22 +
  67.                          r_temp_23 +
  68.                          r_temp_31 +
  69.                          r_temp_32 +
  70.                          r_temp_33;
  71.         sum_g <= g_temp_11 +
  72.                          g_temp_12 +
  73.                          g_temp_13 +
  74.                          g_temp_21 +
  75.                          g_temp_22 +
  76.                          g_temp_23 +
  77.                          g_temp_31 +
  78.                          g_temp_32 +
  79.                          g_temp_33 ;
  80.         sum_b <= b_temp_11 +
  81.                          b_temp_12 +
  82.                          b_temp_13 +
  83.                          b_temp_21 +
  84.                          b_temp_22 +
  85.                          b_temp_23 +
  86.                          b_temp_31 +
  87.                          b_temp_32 +
  88.                          b_temp_33 ;
  89.     end
  90. end

  91. div_gen_0 u_r_div(
  92.     .aclk                                         (i_clk                                ),
  93.     .s_axis_divisor_tvalid  (i_en_d[1]                        ),
  94.     .s_axis_divisor_tdata   (8'd9                                ),
  95.     .s_axis_dividend_tvalid (i_en_d[1]                        ),
  96.     .s_axis_dividend_tdata  ({4'd0,sum_r[11:0]} ),
  97.     .m_axis_dout_tvalid     (avg_r_valid                ),
  98.     .m_axis_dout_tdata      (avg_r                                )
  99. );

  100. div_gen_0 u_g_div(
  101.     .aclk                                         (i_clk                                ),
  102.     .s_axis_divisor_tvalid  (i_en_d[1]                        ),
  103.     .s_axis_divisor_tdata   (8'd9                                ),
  104.     .s_axis_dividend_tvalid (i_en_d[1]                        ),
  105.     .s_axis_dividend_tdata  ({4'd0,sum_g[11:0]} ),
  106.     .m_axis_dout_tvalid     (avg_g_valid                ),
  107.     .m_axis_dout_tdata      (avg_g                                )
  108. );

  109. div_gen_0 u_b_div(
  110.     .aclk                                         (i_clk                                ),
  111.     .s_axis_divisor_tvalid  (i_en_d[1]                        ),
  112.     .s_axis_divisor_tdata   (8'd9                                ),
  113.     .s_axis_dividend_tvalid (i_en_d[1]                        ),
  114.     .s_axis_dividend_tdata  ({4'd0,sum_b[11:0]} ),
  115.     .m_axis_dout_tvalid     (avg_b_valid                ),
  116.     .m_axis_dout_tdata      (avg_b                                )
  117. );


  118. endmodule
复制代码

2.3 工程结构分析
我们将图像算法的模块做成 IP 后,在vivado 中进行工程的搭建,工程结构如图所示:
8ddab7d15e714bba8965a4294497461b.jpg
3 仿真及结果
3.1Matlab实验结果

d31086ca8be54711a45a331ce31c633e.jpg

3.2Modelsim实验结果

7ce84c42c7024c30a1c221bb78b4a2e7.jpg
4 搭建 Vitis-sdk 工程
创建 soc_base  sdk  platform  和 APP  工程的过程不再重复,可以阅读 3-3-01_sdk_base_app。以下给出创建好 soc_base sdk platform 的截图和对应工程 APP 的截图。

4.1 创建 SDKPlatform工程
47046f9268b647c59f716a4cc3d0e0fd.jpg
4.2SDKAPP工程

ca5ff6ca9a12405fa83af81ffea06b52.jpg
5 硬件连接
硬件连接如图所示:

dcb71aa80c10406292fca4e2d0fc79d9.jpg
6 上板实验结果
实验结果如图所示:
9cee79c38f12410aa24ef00681e19652.jpg


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

本版积分规则