问答 店铺
热搜: ZYNQ FPGA discuz

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

微信扫一扫 分享朋友圈

已有 42 人浏览分享

开启左侧

FPGA图像处理-图像中值滤波处理

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

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

本文简述了图像中值滤波的算法,讲解如何进行Verilog的算法实现,并进行上板实验。

2算法原理简介

中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。

中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。方法是用二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为:

image.jpg
3算法仿真
3.1Matlab算法仿真
3.1.1Matlab算法代码分析

源代码如下:

  1. clear;clear all;clc;
  2. image_in = imread('lena_1280x720.jpg');
  3. % [row,col,n] = size(image_in);
  4. image_gray  = rgb2gray(image_in);
  5. [row,col]         = size(image_gray);
  6. median_image         = zeros(size(image_gray), 'like', image_gray);
  7. for i = 2:1:row-1
  8.         for j = 2:1:col-1
  9.                 median_1 = [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) image_gray(i+1,j-1) image_gray(i+1,j) image_gray(i+1,j+1)];
  10.                
  11.                 median_o = sort(median_1);
  12.                
  13.                 median_image(i,j) = median_o(5);
  14.         end
  15. end
  16. image_gray1         = imnoise(image_gray,'salt & pepper',0.05);
  17. median_image1         = zeros(size(image_gray), 'like', image_gray);
  18. for i = 2:1:row-1
  19.         for j = 2:1:col-1
  20.                 median_1 = [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) image_gray1(i+1,j-1) image_gray1(i+1,j) image_gray1(i+1,j+1)];
  21.                
  22.                 median_o = sort(median_1);
  23.                
  24.                 median_image1(i,j) = median_o(5);
  25.         end
  26. end
  27. image_gray2         = imnoise(image_gray,'gaussian',0.05);
  28. median_image2         = zeros(size(image_gray), 'like', image_gray);
  29. for i = 2:1:row-1
  30.         for j = 2:1:col-1
  31.                 median_1 = [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) image_gray2(i+1,j-1) image_gray2(i+1,j) image_gray2(i+1,j+1)];
  32.                
  33.                 median_o = sort(median_1);
  34.                
  35.                 median_image2(i,j) = median_o(5);
  36.         end
  37. end
  38. figure
  39. subplot(321);
  40. imshow(image_gray  ), title('the original gray image');
  41. subplot(322);
  42. imshow(median_image), title('the median image');
  43. subplot(323);
  44. imshow(image_gray1), title('the salt & pepper image');
  45. subplot(324);
  46. imshow(median_image1), title('the median1 image');
  47. subplot(325);
  48. imshow(image_gray2), title('the gaussian image');
  49. subplot(326);
  50. imshow(median_image2), title('the median2 image');
复制代码
3.1.2Matlab实验结果
image.jpg

3.2Verilog算法仿真3.2.1Modelsim仿真3.2.1.1仿真执行

在件夹Algorithm_simulation下进行算法的仿真,分为sim,src和tb三个子文件夹。在sim文件夹下有win系统的快捷执行文件sim.bat,可以一键进行仿真,src文件下放的是Verilog的核心图像算法及其顶层与输入图像激励,tb文件下放的是测试激励文件及输出图像的保存。

双击执行sim文件夹下sim.bat,自动打开Modelsim仿真,自动添加仿真波形,执行完成后自动保存图像,仿真波形如图所示:


image.jpg

3.2.1.2仿真关键部分代码解析

Sim.do执行仿真代码,文件内容如下:

  1. #
  2. # Create work library
  3. #
  4. vlib work
  5. #
  6. # Compile sources
  7. #
  8. vlog "../src/*.v"
  9. vlog "../tb/*.v"
  10. #
  11. # Call vsim to invoke simulator
  12. #
  13. vsim -voptargs=+acc work.top_tb
  14. #
  15. # Add waves
  16. #
  17. do wave.do
  18. #
  19. # Run simulation
  20. #
  21. run -all
  22. #
  23. # End
复制代码

图像输入代码部分:

  1. reg                 en;
  2. reg [12:0]         h_syn_cnt = 'd0;
  3. reg [12:0]         v_syn_cnt = 'd0;
  4. reg [23:0]         image [0 : H_ACTIVE*V_ACTIVE-1];
  5. reg [31:0]         image_cnt = 'd0;
  6. //读取txt文件到image数组中
  7. initial begin
  8.         $readmemh("../matlab_src/image_720_1280_3.txt", image);
  9. end
  10. // 行扫描计数器
  11. always@(posedge i_clk)
  12. begin
  13.         if(h_syn_cnt == H_TOTAL_TIME-1)
  14.         h_syn_cnt <= 0;
  15.     else
  16.         h_syn_cnt <= h_syn_cnt + 1;
  17. end
  18. // 列扫描计数器
  19. always@(posedge i_clk)
  20. begin
  21.         if(h_syn_cnt == H_TOTAL_TIME-1)
  22.         begin
  23.         if(v_syn_cnt == V_TOTAL_TIME-1)
  24.             v_syn_cnt <= 0;
  25.         else
  26.             v_syn_cnt <= v_syn_cnt + 1;
  27.         end
  28. end
  29. // 行同步控制
  30. always@(posedge i_clk)
  31. begin
  32.     if(h_syn_cnt < H_SYNC_TIME)
  33.         o_hsyn <= 0;
  34.     else
  35.         o_hsyn <= 1;
  36. end
  37. // 场同步控制
  38. always@(posedge i_clk)
  39. begin
  40.     if(v_syn_cnt < V_SYNC_TIME)
  41.         o_vsyn <= 0;
  42.     else
  43.         o_vsyn <= 1;
  44. end
  45. // 坐标使能.
  46. always@(posedge i_clk)
  47. begin
  48.     if(v_syn_cnt >= V_SYNC_TIME + V_BACK_PORCH && v_syn_cnt < V_SYNC_TIME + V_BACK_PORCH + V_ACTIVE)
  49.     begin
  50.         if(h_syn_cnt >= H_SYNC_TIME + H_BACK_PORCH && h_syn_cnt < H_SYNC_TIME + H_BACK_PORCH + H_ACTIVE)
  51.             en <= 1;
  52.         else
  53.             en <= 0;
  54.     end
  55.     else
  56.         en <= 0;
  57. end
  58. always@(posedge i_clk)
  59. begin
  60.     if(en)
  61.         begin
  62.                 o_r                 <= image[image_cnt][23:16];
  63.                 o_g                 <= image[image_cnt][15:8];
  64.                 o_b                 <= image[image_cnt][7:0];
  65.             image_cnt         <= image_cnt + 1;
  66.         end
  67.         else if(image_cnt == H_ACTIVE*V_ACTIVE)
  68.         begin
  69.                 o_r                 <= 8'h00;
  70.                 o_g                 <= 8'h00;
  71.                 o_b                 <= 8'h00;
  72.             image_cnt         <= 'd0;
  73.         end        
  74.     else
  75.         begin
  76.                 o_r                 <= 8'h00;
  77.                 o_g                 <= 8'h00;
  78.                 o_b                 <= 8'h00;
  79.             image_cnt         <= image_cnt;
  80.         end        
  81. end
  82. always@(posedge i_clk)
  83. begin
  84.         // if(image_cnt >= H_ACTIVE*V_ACTIVE)
  85.                 // o_en <= 0;
  86.         // else
  87.                 o_en <= en;
  88. end
复制代码

图像输出保存代码部分:

  1. reg             clk;
  2. reg             rst_n;
  3. integer                 image_txt;
  4. reg [31:0]                 pixel_cnt;
  5. wire[23:0]          data;
  6. wire            de;
  7. top u_top
  8. (
  9.     .i_clk                              (clk                ),
  10.     .i_rst_n                      (rst_n              ),
  11.     .o_gray_data             (data               ),
  12.     .o_gray_de               (de                 )
  13. );
  14. always #(1) clk = ~clk;
  15. initial
  16. begin
  17.         clk   = 1;
  18.     rst_n = 0;         
  19.         #100
  20.     rst_n = 1;
  21.         
  22. end
  23. glbl glbl();
  24. initial
  25. begin
  26.     image_txt = $fopen("../matlab_src/image_720_1280_3_out.txt");
  27. end
  28. always@(posedge clk or negedge rst_n)
  29. begin
  30.     if(!rst_n)
  31.         begin
  32.         pixel_cnt <= 0;
  33.     end
  34.     else if(de)
  35.         begin
  36.         pixel_cnt = pixel_cnt + 1;
  37.         $fwrite(image_txt,"%h\n",data);
  38.     end
  39. end
  40. always@(posedge clk )
  41. begin
  42.         if(pixel_cnt == 720*1280)
  43.         begin
  44.                 $display("*******************************************************************************");               
  45.                 $display("*** Success:image_720_1280_3_out.txt is output complete! %t", $realtime, "ps***");
  46.                 $display("*******************************************************************************");
  47.                         $fclose(image_txt);
  48.                 $stop;
  49.         end        
  50. end
复制代码
3.2.2Modelsim实验结果

matlab查看输入输出的图像代码部分:

  1. clear;clear all;clc;
  2. row = 720;  
  3. col = 1280;  
  4. n   = 3;   
  5. image_sim_pass = uint8(zeros(row,col,n));
  6. fid = fopen('image_720_1280_3_out.txt','r');
  7. for x = 1:row
  8.     for y = 1:col
  9.         RGB = fscanf(fid,'%s',1);
  10.         image_sim_pass(x,y,1) = uint8(hex2dec(RGB(1:2)));
  11.         image_sim_pass(x,y,2) = uint8(hex2dec(RGB(3:4)));
  12.         image_sim_pass(x,y,3) = uint8(hex2dec(RGB(5:6)));              
  13.     end
  14. end
  15. fclose(fid);
  16. image_1 = imread('lena_1280x720.jpg');
  17. subplot(121);
  18. imshow(image_1), title('The original image');
  19. subplot(122);
  20. imshow(image_sim_pass),title('After processing images');
  21. imwrite(image_sim_pass,'lena_720x128_sim_pass.jpg');   
复制代码
image.jpg

4工程实现4.1Verilog代码分析
变量声明
  1. reg        [3:0]                i_hsyn_d;
  2. reg        [3:0]                i_vsyn_d;
  3. reg        [3:0]                i_en_d;
  4. wire [7:0]        r_temp_11;
  5. wire [7:0]        r_temp_12;
  6. wire [7:0]        r_temp_13;
  7. wire [7:0]        r_temp_21;
  8. wire [7:0]        r_temp_22;
  9. wire [7:0]        r_temp_23;
  10. wire [7:0]        r_temp_31;
  11. wire [7:0]        r_temp_32;
  12. wire [7:0]        r_temp_33;
  13. wire [7:0]        g_temp_11;
  14. wire [7:0]        g_temp_12;
  15. wire [7:0]        g_temp_13;
  16. wire [7:0]        g_temp_21;
  17. wire [7:0]        g_temp_22;
  18. wire [7:0]        g_temp_23;
  19. wire [7:0]        g_temp_31;
  20. wire [7:0]        g_temp_32;
  21. wire [7:0]        g_temp_33;
  22. wire [7:0]        b_temp_11;
  23. wire [7:0]        b_temp_12;
  24. wire [7:0]        b_temp_13;
  25. wire [7:0]        b_temp_21;
  26. wire [7:0]        b_temp_22;
  27. wire [7:0]        b_temp_23;
  28. wire [7:0]        b_temp_31;
  29. wire [7:0]        b_temp_32;
  30. wire [7:0]        b_temp_33;
  31. reg  [7:0]        r_temp_max_1;
  32. reg  [7:0]        r_temp_med_1;
  33. reg  [7:0]        r_temp_min_1;
  34. reg  [7:0]        r_temp_max_2;
  35. reg  [7:0]        r_temp_med_2;
  36. reg  [7:0]        r_temp_min_2;
  37. reg  [7:0]        r_temp_max_3;
  38. reg  [7:0]        r_temp_med_3;
  39. reg  [7:0]        r_temp_min_3;
  40. reg  [7:0]        r_temp_max_min;
  41. reg  [7:0]        r_temp_med_med;
  42. reg  [7:0]        r_temp_min_max;
  43. reg  [7:0]        r_med;
  44. reg  [7:0]        g_temp_max_1;
  45. reg  [7:0]        g_temp_med_1;
  46. reg  [7:0]        g_temp_min_1;
  47. reg  [7:0]        g_temp_max_2;
  48. reg  [7:0]        g_temp_med_2;
  49. reg  [7:0]        g_temp_min_2;
  50. reg  [7:0]        g_temp_max_3;
  51. reg  [7:0]        g_temp_med_3;
  52. reg  [7:0]        g_temp_min_3;
  53. reg  [7:0]        g_temp_max_min;
  54. reg  [7:0]        g_temp_med_med;
  55. reg  [7:0]        g_temp_min_max;
  56. reg  [7:0]        g_med;
  57. reg  [7:0]        b_temp_max_1;
  58. reg  [7:0]        b_temp_med_1;
  59. reg  [7:0]        b_temp_min_1;
  60. reg  [7:0]        b_temp_max_2;
  61. reg  [7:0]        b_temp_med_2;
  62. reg  [7:0]        b_temp_min_2;
  63. reg  [7:0]        b_temp_max_3;
  64. reg  [7:0]        b_temp_med_3;
  65. reg  [7:0]        b_temp_min_3;
  66. reg  [7:0]        b_temp_max_min;
  67. reg  [7:0]        b_temp_med_med;
  68. reg  [7:0]        b_temp_min_max;
  69. reg  [7:0]        b_med;
复制代码
输出赋值语句
  1. assign o_hs = i_hsyn_d[3];
  2. assign o_vs = i_vsyn_d[3];
  3. assign o_en = i_en_d[3]        ;
  4. assign o_r        = r_med;
  5. assign o_g        = g_med;
  6. assign o_b        = b_med;
复制代码
信号进行同步处理
  1. always@(posedge i_clk )
  2. begin
  3.         i_hsyn_d <=        {i_hsyn_d[2:0],i_hsyn};
  4.         i_vsyn_d <=        {i_vsyn_d[2:0],i_vsyn};
  5.         i_en_d         <=        {i_en_d[2: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. );
复制代码
Rgb通道均执行中值查找算法
  1. always@(posedge i_clk or negedge i_rst_n)
  2. begin
  3.     if(!i_rst_n)
  4.         begin
  5.         r_temp_max_1 <= 'd0;
  6.                 r_temp_med_1 <= 'd0;
  7.                 r_temp_min_1 <= 'd0;
  8.                 r_temp_max_2 <= 'd0;
  9.                 r_temp_med_2 <= 'd0;
  10.                 r_temp_min_2 <= 'd0;
  11.                 r_temp_max_3 <= 'd0;
  12.                 r_temp_med_3 <= 'd0;
  13.                 r_temp_min_3 <= 'd0;
  14.         end        
  15.     else
  16.         begin
  17.                 r_temp_max_1 <= (r_temp_11 >= r_temp_12 && r_temp_11 >= r_temp_13)? r_temp_11:
  18.                                                 (r_temp_12 >= r_temp_11 && r_temp_12 >= r_temp_13)? r_temp_12:
  19.                                                 (r_temp_13 >= r_temp_11 && r_temp_13 >= r_temp_12)? r_temp_13:'d0;
  20.                 r_temp_med_1 <= (r_temp_11 >= r_temp_12 && r_temp_11 <= r_temp_13 || r_temp_11 <= r_temp_12 && r_temp_11 >= r_temp_13)? r_temp_11:
  21.                                                 (r_temp_12 >= r_temp_11 && r_temp_12 <= r_temp_13 || r_temp_12 <= r_temp_11 && r_temp_12 >= r_temp_13)? r_temp_12:
  22.                                                 (r_temp_13 >= r_temp_11 && r_temp_13 <= r_temp_12 || r_temp_13 <= r_temp_11 && r_temp_13 >= r_temp_12)? r_temp_13:'d0;
  23.                 r_temp_min_1 <= (r_temp_11 <= r_temp_12 && r_temp_11 <= r_temp_13)? r_temp_11:
  24.                                                 (r_temp_12 <= r_temp_11 && r_temp_12 <= r_temp_13)? r_temp_12:
  25.                                                 (r_temp_13 <= r_temp_11 && r_temp_13 <= r_temp_12)? r_temp_13:'d0;
  26.                 r_temp_max_2 <= (r_temp_21 >= r_temp_22 && r_temp_21 >= r_temp_23)? r_temp_21:
  27.                                                 (r_temp_22 >= r_temp_21 && r_temp_22 >= r_temp_23)? r_temp_22:
  28.                                                 (r_temp_23 >= r_temp_21 && r_temp_23 >= r_temp_22)? r_temp_23:'d0;
  29.                 r_temp_med_2 <= (r_temp_21 >= r_temp_22 && r_temp_21 <= r_temp_23 || r_temp_21 <= r_temp_22 && r_temp_21 >= r_temp_13)? r_temp_21:
  30.                                                 (r_temp_22 >= r_temp_21 && r_temp_22 <= r_temp_23 || r_temp_22 <= r_temp_21 && r_temp_22 >= r_temp_13)? r_temp_22:
  31.                                                 (r_temp_23 >= r_temp_21 && r_temp_23 <= r_temp_22 || r_temp_23 <= r_temp_21 && r_temp_23 >= r_temp_12)? r_temp_23:'d0;
  32.                 r_temp_min_2 <= (r_temp_21 <= r_temp_22 && r_temp_21 <= r_temp_23)? r_temp_21:
  33.                                                 (r_temp_22 <= r_temp_21 && r_temp_22 <= r_temp_23)? r_temp_22:
  34.                                                 (r_temp_23 <= r_temp_21 && r_temp_23 <= r_temp_22)? r_temp_23:'d0;
  35.                 r_temp_max_3 <= (r_temp_31 >= r_temp_32 && r_temp_31 >= r_temp_33)? r_temp_31:
  36.                                                 (r_temp_32 >= r_temp_31 && r_temp_32 >= r_temp_33)? r_temp_32:
  37.                                                 (r_temp_33 >= r_temp_31 && r_temp_33 >= r_temp_32)? r_temp_33:'d0;
  38.                 r_temp_med_3 <= (r_temp_31 >= r_temp_32 && r_temp_31 <= r_temp_33 || r_temp_31 <= r_temp_32 && r_temp_31 >= r_temp_33)? r_temp_31:
  39.                                                 (r_temp_32 >= r_temp_31 && r_temp_32 <= r_temp_33 || r_temp_32 <= r_temp_31 && r_temp_32 >= r_temp_33)? r_temp_32:
  40.                                                 (r_temp_33 >= r_temp_31 && r_temp_33 <= r_temp_32 || r_temp_33 <= r_temp_31 && r_temp_33 >= r_temp_32)? r_temp_33:'d0;
  41.                 r_temp_min_3 <= (r_temp_31 <= r_temp_32 && r_temp_31 <= r_temp_33)? r_temp_31:
  42.                                                 (r_temp_32 <= r_temp_31 && r_temp_32 <= r_temp_33)? r_temp_32:
  43.                                                 (r_temp_33 <= r_temp_31 && r_temp_33 <= r_temp_32)? r_temp_33:'d0;
  44.         end
  45. end
  46. always@(posedge i_clk or negedge i_rst_n)
  47. begin
  48.     if(!i_rst_n)
  49.         begin
  50.         r_temp_max_min <= 'd0;
  51.                 r_temp_med_med <= 'd0;
  52.                 r_temp_min_max <= 'd0;
  53.         end        
  54.     else
  55.         begin
  56.         r_temp_max_min <= (r_temp_max_1 <= r_temp_max_2 && r_temp_max_1 <= r_temp_max_3)? r_temp_max_1:
  57.                                   (r_temp_max_2 <= r_temp_max_1 && r_temp_max_2 <= r_temp_max_3)? r_temp_max_2:
  58.                                   (r_temp_max_3 <= r_temp_max_1 && r_temp_max_3 <= r_temp_max_2)? r_temp_max_3:'d0;
  59.                 r_temp_med_med <= (r_temp_med_1 >= r_temp_med_2 && r_temp_med_1 <= r_temp_med_3 || r_temp_med_1 <= r_temp_med_2 && r_temp_med_1 >= r_temp_med_3)? r_temp_med_1:
  60.                                   (r_temp_med_2 >= r_temp_med_1 && r_temp_med_2 <= r_temp_med_3 || r_temp_med_2 <= r_temp_med_1 && r_temp_med_2 >= r_temp_med_3)? r_temp_med_2:
  61.                                   (r_temp_med_3 >= r_temp_med_1 && r_temp_med_3 <= r_temp_med_2 || r_temp_med_3 <= r_temp_med_1 && r_temp_med_3 >= r_temp_med_2)? r_temp_med_3:'d0;
  62.                 r_temp_min_max <= (r_temp_min_1 >= r_temp_min_2 && r_temp_min_1 >= r_temp_min_3)? r_temp_min_1:
  63.                                   (r_temp_min_2 >= r_temp_min_1 && r_temp_min_2 >= r_temp_min_3)? r_temp_min_2:
  64.                                                   (r_temp_min_3 >= r_temp_min_1 && r_temp_min_3 >= r_temp_min_2)? r_temp_min_3:'d0;
  65.         end                                          
  66. end
  67. always@(posedge i_clk or negedge i_rst_n)
  68. begin
  69.     if(!i_rst_n)
  70.         begin
  71.         g_temp_max_1 <= 'd0;
  72.                 g_temp_med_1 <= 'd0;
  73.                 g_temp_min_1 <= 'd0;
  74.                 g_temp_max_2 <= 'd0;
  75.                 g_temp_med_2 <= 'd0;
  76.                 g_temp_min_2 <= 'd0;
  77.                 g_temp_max_3 <= 'd0;
  78.                 g_temp_med_3 <= 'd0;
  79.                 g_temp_min_3 <= 'd0;
  80.         end        
  81.     else
  82.         begin
  83.                 g_temp_max_1 <= (g_temp_11 >= g_temp_12 && g_temp_11 >= g_temp_13)? g_temp_11:
  84.                                                 (g_temp_12 >= g_temp_11 && g_temp_12 >= g_temp_13)? g_temp_12:
  85.                                                 (g_temp_13 >= g_temp_11 && g_temp_13 >= g_temp_12)? g_temp_13:'d0;
  86.                 g_temp_med_1 <= (g_temp_11 >= g_temp_12 && g_temp_11 <= g_temp_13 || g_temp_11 <= g_temp_12 && g_temp_11 >= g_temp_13)? g_temp_11:
  87.                                                 (g_temp_12 >= g_temp_11 && g_temp_12 <= g_temp_13 || g_temp_12 <= g_temp_11 && g_temp_12 >= g_temp_13)? g_temp_12:
  88.                                                 (g_temp_13 >= g_temp_11 && g_temp_13 <= g_temp_12 || g_temp_13 <= g_temp_11 && g_temp_13 >= g_temp_12)? g_temp_13:'d0;
  89.                 g_temp_min_1 <= (g_temp_11 <= g_temp_12 && g_temp_11 <= g_temp_13)? g_temp_11:
  90.                                                 (g_temp_12 <= g_temp_11 && g_temp_12 <= g_temp_13)? g_temp_12:
  91.                                                 (g_temp_13 <= g_temp_11 && g_temp_13 <= g_temp_12)? g_temp_13:'d0;
  92.                 g_temp_max_2 <= (g_temp_21 >= g_temp_22 && g_temp_21 >= g_temp_23)? g_temp_21:
  93.                                                 (g_temp_22 >= g_temp_21 && g_temp_22 >= g_temp_23)? g_temp_22:
  94.                                                 (g_temp_23 >= g_temp_21 && g_temp_23 >= g_temp_22)? g_temp_23:'d0;
  95.                 g_temp_med_2 <= (g_temp_21 >= g_temp_22 && g_temp_21 <= g_temp_23 || g_temp_21 <= g_temp_22 && g_temp_21 >= g_temp_23)? g_temp_21:
  96.                                                 (g_temp_22 >= g_temp_21 && g_temp_22 <= g_temp_23 || g_temp_22 <= g_temp_21 && g_temp_22 >= g_temp_23)? g_temp_22:
  97.                                                 (g_temp_23 >= g_temp_21 && g_temp_23 <= g_temp_22 || g_temp_23 <= g_temp_21 && g_temp_23 >= g_temp_22)? g_temp_23:'d0;
  98.                 g_temp_min_2 <= (g_temp_21 <= g_temp_22 && g_temp_21 <= g_temp_23)? g_temp_21:
  99.                                                 (g_temp_22 <= g_temp_21 && g_temp_22 <= g_temp_23)? g_temp_22:
  100.                                                 (g_temp_23 <= g_temp_21 && g_temp_23 <= g_temp_22)? g_temp_23:'d0;
  101.                 g_temp_max_3 <= (g_temp_31 >= g_temp_32 && g_temp_31 >= g_temp_33)? g_temp_31:
  102.                                                 (g_temp_32 >= g_temp_31 && g_temp_32 >= g_temp_33)? g_temp_32:
  103.                                                 (g_temp_33 >= g_temp_31 && g_temp_33 >= g_temp_32)? g_temp_33:'d0;
  104.                 g_temp_med_3 <= (g_temp_31 >= g_temp_32 && g_temp_31 <= g_temp_33 || g_temp_31 <= g_temp_32 && g_temp_31 >= g_temp_33)? g_temp_31:
  105.                                                 (g_temp_32 >= g_temp_31 && g_temp_32 <= g_temp_33 || g_temp_32 <= g_temp_31 && g_temp_32 >= g_temp_33)? g_temp_32:
  106.                                                 (g_temp_33 >= g_temp_31 && g_temp_33 <= g_temp_32 || g_temp_33 <= g_temp_31 && g_temp_33 >= g_temp_32)? g_temp_33:'d0;
  107.                 g_temp_min_3 <= (g_temp_31 <= g_temp_32 && g_temp_31 <= g_temp_33)? g_temp_31:
  108.                                                 (g_temp_32 <= g_temp_31 && g_temp_32 <= g_temp_33)? g_temp_32:
  109.                                                 (g_temp_33 <= g_temp_31 && g_temp_33 <= g_temp_32)? g_temp_33:'d0;
  110.         end
  111. end
  112. always@(posedge i_clk or negedge i_rst_n)
  113. begin
  114.     if(!i_rst_n)
  115.         begin
  116.         g_temp_max_min <= 'd0;
  117.                 g_temp_med_med <= 'd0;
  118.                 g_temp_min_max <= 'd0;
  119.         end        
  120.     else
  121.         begin
  122.         g_temp_max_min <= (g_temp_max_1 <= g_temp_max_2 && g_temp_max_1 <= g_temp_max_3)? g_temp_max_1:
  123.                                   (g_temp_max_2 <= g_temp_max_1 && g_temp_max_2 <= g_temp_max_3)? g_temp_max_2:
  124.                                   (g_temp_max_3 <= g_temp_max_1 && g_temp_max_3 <= g_temp_max_2)? g_temp_max_3:'d0;
  125.                 g_temp_med_med <= (g_temp_med_1 >= g_temp_med_2 && g_temp_med_1 <= g_temp_med_3 || g_temp_med_1 <= g_temp_med_2 && g_temp_med_1 >= g_temp_med_3)? g_temp_med_1:
  126.                                   (g_temp_med_2 >= g_temp_med_1 && g_temp_med_2 <= g_temp_med_3 || g_temp_med_2 <= g_temp_med_1 && g_temp_med_2 >= g_temp_med_3)? g_temp_med_2:
  127.                                   (g_temp_med_3 >= g_temp_med_1 && g_temp_med_3 <= g_temp_med_2 || g_temp_med_3 <= g_temp_med_1 && g_temp_med_3 >= g_temp_med_2)? g_temp_med_3:'d0;
  128.                 g_temp_min_max <= (g_temp_min_1 >= g_temp_min_2 && g_temp_min_1 >= g_temp_min_3)? g_temp_min_1:
  129.                                   (g_temp_min_2 >= g_temp_min_1 && g_temp_min_2 >= g_temp_min_3)? g_temp_min_2:
  130.                               (g_temp_min_3 >= g_temp_min_1 && g_temp_min_3 >= g_temp_min_2)? g_temp_min_3:'d0;
  131.         end
  132. end
  133. always@(posedge i_clk or negedge i_rst_n)
  134. begin
  135.     if(!i_rst_n)
  136.         begin
  137.         b_temp_max_1 <= 'd0;
  138.                 b_temp_med_1 <= 'd0;
  139.                 b_temp_min_1 <= 'd0;
  140.                 b_temp_max_2 <= 'd0;
  141.                 b_temp_med_2 <= 'd0;
  142.                 b_temp_min_2 <= 'd0;
  143.                 b_temp_max_3 <= 'd0;
  144.                 b_temp_med_3 <= 'd0;
  145.                 b_temp_min_3 <= 'd0;
  146.         end        
  147.     else
  148.         begin
  149.                 b_temp_max_1 <= (b_temp_11 >= b_temp_12 && b_temp_11 >= b_temp_13)? b_temp_11:
  150.                                                 (b_temp_12 >= b_temp_11 && b_temp_12 >= b_temp_13)? b_temp_12:
  151.                                                 (b_temp_13 >= b_temp_11 && b_temp_13 >= b_temp_12)? b_temp_13:'d0;
  152.                 b_temp_med_1 <= (b_temp_11 >= b_temp_12 && b_temp_11 <= b_temp_13 || b_temp_11 <= b_temp_12 && b_temp_11 >= b_temp_13)? b_temp_11:
  153.                                                 (b_temp_12 >= b_temp_11 && b_temp_12 <= b_temp_13 || b_temp_12 <= b_temp_11 && b_temp_12 >= b_temp_13)? b_temp_12:
  154.                                                 (b_temp_13 >= b_temp_11 && b_temp_13 <= b_temp_12 || b_temp_13 <= b_temp_11 && b_temp_13 >= b_temp_12)? b_temp_13:'d0;
  155.                 b_temp_min_1 <= (b_temp_11 <= b_temp_12 && b_temp_11 <= b_temp_13)? b_temp_11:
  156.                                                 (b_temp_12 <= b_temp_11 && b_temp_12 <= b_temp_13)? b_temp_12:
  157.                                                 (b_temp_13 <= b_temp_11 && b_temp_13 <= b_temp_12)? b_temp_13:'d0;
  158.                 b_temp_max_2 <= (b_temp_21 >= b_temp_22 && b_temp_21 >= b_temp_23)? b_temp_21:
  159.                                                 (b_temp_22 >= b_temp_21 && b_temp_22 >= b_temp_23)? b_temp_22:
  160.                                                 (b_temp_23 >= b_temp_21 && b_temp_23 >= b_temp_22)? b_temp_23:'d0;
  161.                 b_temp_med_2 <= (b_temp_21 >= b_temp_22 && b_temp_21 <= b_temp_23 || b_temp_21 <= b_temp_22 && b_temp_21 >= b_temp_23)? b_temp_21:
  162.                                                 (b_temp_22 >= b_temp_21 && b_temp_22 <= b_temp_23 || b_temp_22 <= b_temp_21 && b_temp_22 >= b_temp_23)? b_temp_22:
  163.                                                 (b_temp_23 >= b_temp_21 && b_temp_23 <= b_temp_22 || b_temp_23 <= b_temp_21 && b_temp_23 >= b_temp_22)? b_temp_23:'d0;
  164.                 b_temp_min_2 <= (b_temp_21 <= b_temp_22 && b_temp_21 <= b_temp_23)? b_temp_21:
  165.                                                 (b_temp_22 <= b_temp_21 && b_temp_22 <= b_temp_23)? b_temp_22:
  166.                                                 (b_temp_23 <= b_temp_21 && b_temp_23 <= b_temp_22)? b_temp_23:'d0;
  167.                 b_temp_max_3 <= (b_temp_31 >= b_temp_32 && b_temp_31 >= b_temp_33)? b_temp_31:
  168.                                                 (b_temp_32 >= b_temp_31 && b_temp_32 >= b_temp_33)? b_temp_32:
  169.                                                 (b_temp_33 >= b_temp_31 && b_temp_33 >= b_temp_32)? b_temp_33:'d0;
  170.                 b_temp_med_3 <= (b_temp_31 >= b_temp_32 && b_temp_31 <= b_temp_33 || b_temp_31 <= b_temp_32 && b_temp_31 >= b_temp_33)? b_temp_31:
  171.                                                 (b_temp_32 >= b_temp_31 && b_temp_32 <= b_temp_33 || b_temp_32 <= b_temp_31 && b_temp_32 >= b_temp_33)? b_temp_32:
  172.                                                 (b_temp_33 >= b_temp_31 && b_temp_33 <= b_temp_32 || b_temp_33 <= b_temp_31 && b_temp_33 >= b_temp_32)? b_temp_33:'d0;
  173.                 b_temp_min_3 <= (b_temp_31 <= b_temp_32 && b_temp_31 <= b_temp_33)? b_temp_31:
  174.                                                 (b_temp_32 <= b_temp_31 && b_temp_32 <= b_temp_33)? b_temp_32:
  175.                                                 (b_temp_33 <= b_temp_31 && b_temp_33 <= b_temp_32)? b_temp_33:'d0;
  176.         end
  177. end
  178. always@(posedge i_clk or negedge i_rst_n)
  179. begin
  180.     if(!i_rst_n)
  181.         begin
  182.         b_temp_max_min <= 'd0;
  183.                 b_temp_med_med <= 'd0;
  184.                 b_temp_min_max <= 'd0;
  185.         end        
  186.     else
  187.         begin
  188.         b_temp_max_min <= (b_temp_max_1 <= b_temp_max_2 && b_temp_max_1 <= b_temp_max_3)? b_temp_max_1:
  189.                                   (b_temp_max_2 <= b_temp_max_1 && b_temp_max_2 <= b_temp_max_3)? b_temp_max_2:
  190.                                   (b_temp_max_3 <= b_temp_max_1 && b_temp_max_3 <= b_temp_max_2)? b_temp_max_3:'d0;
  191.                 b_temp_med_med <= (b_temp_med_1 >= b_temp_med_2 && b_temp_med_1 <= b_temp_med_3 || b_temp_med_1 <= b_temp_med_2 && b_temp_med_1 >= b_temp_med_3)? b_temp_med_1:
  192.                                   (b_temp_med_2 >= b_temp_med_1 && b_temp_med_2 <= b_temp_med_3 || b_temp_med_2 <= b_temp_med_1 && b_temp_med_2 >= b_temp_med_3)? b_temp_med_2:
  193.                                   (b_temp_med_3 >= b_temp_med_1 && b_temp_med_3 <= b_temp_med_2 || b_temp_med_3 <= b_temp_med_1 && b_temp_med_3 >= b_temp_med_2)? b_temp_med_3:'d0;
  194.                 b_temp_min_max <= (b_temp_min_1 >= b_temp_min_2 && b_temp_min_1 >= b_temp_min_3)? b_temp_min_1:
  195.                                   (b_temp_min_2 >= b_temp_min_1 && b_temp_min_2 >= b_temp_min_3)? b_temp_min_2:
  196.                                                   (b_temp_min_3 >= b_temp_min_1 && b_temp_min_3 >= b_temp_min_2)? b_temp_min_3:'d0;
  197.         end
  198. end                                                                        
  199.                                  
  200. always@(posedge i_clk or negedge i_rst_n)
  201. begin
  202.     if(!i_rst_n)
  203.         begin
  204.         r_med <= 'd0;
  205.                 g_med <= 'd0;
  206.                 b_med <= 'd0;
  207.         end        
  208.     else
  209.         begin
  210.         r_med <= (r_temp_max_min >= r_temp_med_med && r_temp_max_min <= r_temp_min_max || r_temp_max_min <= r_temp_med_med && r_temp_max_min >= r_temp_min_max)? r_temp_max_min:
  211.                          (r_temp_med_med >= r_temp_max_min && r_temp_med_med <= r_temp_min_max || r_temp_med_med <= r_temp_max_min && r_temp_med_med >= r_temp_min_max)? r_temp_med_med:
  212.                          (r_temp_min_max >= r_temp_max_min && r_temp_min_max <= r_temp_med_med || r_temp_min_max <= r_temp_max_min && r_temp_min_max >= r_temp_med_med)? r_temp_min_max:'d0;
  213.                 g_med <= (g_temp_max_min >= g_temp_med_med && g_temp_max_min <= g_temp_min_max || g_temp_max_min <= g_temp_med_med && g_temp_max_min >= g_temp_min_max)? g_temp_max_min:
  214.                          (g_temp_med_med >= g_temp_max_min && g_temp_med_med <= g_temp_min_max || g_temp_med_med <= g_temp_max_min && g_temp_med_med >= g_temp_min_max)? g_temp_med_med:
  215.                          (g_temp_min_max >= g_temp_max_min && g_temp_min_max <= g_temp_med_med || g_temp_min_max <= g_temp_max_min && g_temp_min_max >= g_temp_med_med)? g_temp_min_max:'d0;
  216.                 b_med <= (b_temp_max_min >= b_temp_med_med && b_temp_max_min <= b_temp_min_max || b_temp_max_min <= b_temp_med_med && b_temp_max_min >= b_temp_min_max)? b_temp_max_min:
  217.                          (b_temp_med_med >= b_temp_max_min && b_temp_med_med <= b_temp_min_max || b_temp_med_med <= b_temp_max_min && b_temp_med_med >= b_temp_min_max)? b_temp_med_med:
  218.                                  (b_temp_min_max >= b_temp_max_min && b_temp_min_max <= b_temp_med_med || b_temp_min_max <= b_temp_max_min && b_temp_min_max >= b_temp_med_med)? b_temp_min_max:'d0;
  219.         end
  220. end
复制代码
4.2工程结构

工程结构如图所示:


image.jpg

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

5上板实验
image.jpg

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

image.jpg





























































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

本版积分规则

0

关注

0

粉丝

271

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

  • 微信公众平台

  • 扫描访问手机版