请选择 进入手机版 | 继续访问电脑版
[X]关闭

[米联客-XILINX-H3_CZ08_7100] FPGA_图像入门连载-11FPGA 实现图像高斯滤波处理

文档创建者:FPGA课程
浏览次数:125
最后更新: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 图像高斯滤波算法简介
高斯滤波在图像处理的概念下,将图像频域处理和时域处理相联系,作为低通滤波器使用,可以将低频能量滤 去,起到图像平滑作用。高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的降噪过程。 通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和模板邻域内的其他像 素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(3x3、5x5)扫描图像中的每一个像素,用模板确 定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
高斯滤波的 3x3 的匹配模板如下:

                        
I(i-1,j-1)
                        
                        
I(i-1,j) * 2
                        
                        
I(i-1,j+1)
                        
                        
I(i  ,j-1) * 2
                        
                        
I(i,j  ) * 4
                        
                        
I(i  ,j+1) * 2
                        
                        
I(i+1,j-1)
                        
                        
I(i+1,j) * 2
                        
                        
I(i+1,j+1)
                        

其中, I(i,j  ) 表示当前像素。
在图像处理中,高斯滤波有两种实现方式,一是用离散化窗口滑窗卷积,另一种通过傅里叶变换。最常见的是 第一种滑窗实现,只有当离散化的窗口非常大,用滑窗计算量非常大的情况下,可能会考虑基于傅里叶变换的实现 方法。卷积中每个像素点的值都是由其本身和领域内的其他像素经过加权平均后得到。上述匹配模板为二维数组所 存放的系数,对于窗口模板大小为(2k+1)x(2k+1),各个元素的计算公式为
311abb9e6eda45cc913c98dca9fdf3b3.jpg
后经过归一化出路为
a2e7032c94fa4406b4a0af024140fad6.jpg

2 设计分析
2.1Matlab代码分析
源代码如下:
  1. clear;clear all;clc;

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

  3. image_gray    = rgb2gray(image_in);
  4. [row,col]         = size(image_gray);

  5. image_gray     = im2double(image_gray);
  6. gaussion_image      = zeros(size(image_gray), 'like', image_gray);
  7. for i = 2:1:row-1
  8. for j = 2:1:col-1
  9. gaussion_image(i,j) = (...
  10. image_gray(i-1,j-1)+image_gray(i-1,j)*2+image_gray(i-1,j+1)+...
  11. image_gray(i,j-1)*2+image_gray(i,j    )*4+image_gray(i,j+1)*2+...    image_gray(i+1,j-1)+image_gray(i+1,j)*2+image_gray(i+1,j+1))/16;
  12. end end
  13. image_gray1   = imnoise(image_gray,'salt & pepper',0.05);%加入椒盐噪声 image_gray1           = im2double(image_gray1); %转换为双精度
  14. gaussion_image1 = zeros(row,col); for i = 2:1:row-1
  15. for j = 2:1:col-1
  16. gaussion_image1(i,j) = (...
  17. image_gray1(i-1,j-1)+image_gray1(i-1,j)*2+image_gray1(i-1,j+1)+...    image_gray1(i,j-1)    +image_gray1(i,j)    *4+image_gray1(i,j+1)    +...  image_gray1(i+1,j-1)+image_gray1(i+1,j)*2+image_gray1(i+1,j+1))/9;
  18. end end

  19. image_gray2   = imnoise(image_gray,'gaussian',0.05); image_gray2           = im2double(image_gray2);
  20. gaussion_image2 = zeros(row,col);
  21. for i = 2:1:row-1
  22. for j = 2:1:col-1
  23. gaussion_image2(i,j) = (...
  24. image_gray2(i-1,j-1)+image_gray2(i-1,j)*2+image_gray2(i-1,j+1)+...    image_gray2(i,j-1)*2+image_gray2(i,j)    *4+image_gray2(i,j+1)*2 +... image_gray2(i+1,j-1)+image_gray2(i+1,j)*2+image_gray2(i+1,j+1))/9;
  25. end end

  26. figure
  27. subplot(321);
  28. imshow(image_gray    ), title('the original gray image');
  29. subplot(322);
  30. imshow(gaussion_image), title('the gaussion image'); subplot(323);
  31. imshow(image_gray1), title('the salt & pepper image'); subplot(324);
  32. imshow(gaussion_image1), title('the gaussion1 image'); subplot(325);
  33. imshow(image_gray2), title('the gaussian image'); subplot(326);
  34. imshow(gaussion_image2), title('the gaussion2 image');
复制代码

2.2Verilog代码分析
  1. always@(posedge i_clk ornegedge i_rst_n) begin
  2. if(!i_rst_n) begin
  3. sum_r1 <= 12'd0;  sum_g1 <= 12'd0; sum_b1 <= 12'd0; sum_r2 <= 12'd0;  sum_g2 <= 12'd0; sum_b2 <= 12'd0; sum_r3 <= 12'd0;  sum_g3 <= 12'd0; sum_b3 <= 12'd0;
  4. end    else    begin
  5. sum_r1 <= r_temp_ 11*1 + r_temp_ 12*2 + r_temp_ 13*1; sum_r2 <= r_temp_21*2 + r_temp_22*4 + r_temp_23*2; sum_r3 <= r_temp_31*1 + r_temp_32*2 + r_temp_33*1;

  6. sum_g1 <= g_temp_ 11*1 + g_temp_12*2 + g_temp_ 13*1; sum_g2 <= g_temp_21*2 + g_temp_22*4 + g_temp_23*2; sum_g3 <= g_temp_31*1 + g_temp_32*2 + g_temp_33*1;

  7. sum_b1 <= b_temp_ 11*1 + b_temp_12*2 + b_temp_ 13*1; sum_b2 <= b_temp_21*2 + b_temp_22*4 + b_temp_23*2; sum_b3 <= b_temp_31*1 + b_temp_32*2 + b_temp_33*1;
  8. end end

  9. always@(posedge i_clk ornegedge i_rst_n)
  10. begin
  11. if(!i_rst_n) begin
  12. sum_r <= 12'd0;  sum_g <= 12'd0; sum_b <= 12'd0;
  13. end    else    begin
  14. sum_r <= sum_r1 + sum_r2 + sum_r3;    sum_g <= sum_g1 + sum_g2 + sum_g3; sum_b <= sum_b1 + sum_b2 + sum_b3;
  15. end end

  16. always@(posedge i_clk ornegedge i_rst_n) begin
  17. if(!i_rst_n) begin
  18. gau_r <= 8'd0;  gau_g <= 8'd0; gau_b <= 8'd0;
  19. end    else    begin
  20. gau_r <= sum_r >> 4;  gau_g <= sum_g >> 4; gau_b <= sum_b >> 4;
  21. end end
复制代码

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

66abe25844bb4dcc9bbae2980bac901b.jpg
3.2Modelsim实验结果

7f8e8257f73843fca4e44a6f5c185486.jpg

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

0487ed119c00458d949c5bb8da043542.jpg

5 硬件连接
硬件连接如图所示:
560d685282914cde82420317f683b62c.jpg
6 上板实验结果
实验结果如图所示:
21f63c9bcb91495d99ba9943ec1267c4.jpg


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

本版积分规则