[X]关闭

[米联客-XILINX-H3_CZ08_7100] FPGA_图像入门连载-5FPGA 实现图像 log 对数变换

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

​ 软件版本: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 图像对数变换算法简介
对数变换可以将图像的低灰度值部分扩展,显示出低灰度部分更多的细节,将其高灰度值部分压缩,减少高灰 度值部分的细节,从而达到强调图像低灰度部分的目的。
图像对数变换一般公式为:
g = c*log(1 + f)
其中 c 为常数系数,f 为像素值范围 0~255。
如图所示,对数曲线在像素值较低的区域斜率较大,像素值较高的区域斜率比较低,所以图像经过对数变换之 后,在较暗的区域对比度将得到提升,因而能增强图像暗部的细节。
517ac9d0fdf74d3491ae796d7a94bd0d.jpg
2 设计分析
2.1Matlab代码分析
源代码如下:
  1. clear;clear all;clc;

  2. % g = c*log(1 + f)  

  3. num = 256;

  4. f = [0:1:255];

  5. c =40;

  6. g = c*log(1+f);

  7. %=================================================================
  8. fid = fopen('log_para_256.coe','w');

  9. fprintf(fid,'memory_initialization_radix = 10;\n');
  10. fprintf(fid,'memory_initialization_vector =\n');

  11. for n = 1:num
  12.         log(n) = round(g(n));
  13. end

  14. for n = 1: num - 1
  15.     fprintf(fid,'%d, \n',log(n));
  16. end

  17. fprintf(fid,'%d;',log(256));
  18. fclose(fid);

  19. %=================================================================
  20. fid1 = fopen('../src/image_rom_log_para.v','w');

  21. fprintf(fid1,'module image_rom_log_para\n');
  22. fprintf(fid1,'(\n');
  23. fprintf(fid1,'        input                    clka,\n');
  24. fprintf(fid1,'        input                [7:0]        addra,\n');
  25. fprintf(fid1,'        input                                ena,\n');
  26. fprintf(fid1,'        output                [7:0]        douta\n');
  27. fprintf(fid1,');\n');
  28. fprintf(fid1,'reg [7:0] DATA;\n');
  29. fprintf(fid1,'assign        douta = DATA;\n');
  30. fprintf(fid1,'always@(*)\n');
  31. fprintf(fid1,'begin\n');
  32. fprintf(fid1,'        case(addra)\n');

  33. for n = 1:num
  34.         log(n) = round(g(n));
  35. end

  36. for n = 1: num
  37.     fprintf(fid1,'%d : DATA <= %d; \n',n-1,log(n));
  38. end
  39. fprintf(fid1,'         default:   DATA<= 0;\n');
  40. fprintf(fid1,'        endcase\n');
  41. fprintf(fid1,'end\n');
  42. fprintf(fid1,'endmodule\n');
  43. fclose(fid1);
  44. %=================================================================

  45. hold on
  46. plot(f);
  47. plot(g);
  48. legend('f','log g');
  49. hold off
复制代码

2.2Verilog代码分析
由于提前使用 matlab 计算好了log 系数,这里代码很简单直接查表就行。
  1. //同步输出使能信号
  2. assign o_hs = i_hsyn; assign o_vs = i_vsyn; assign o_en = i_en;

  3. image_rom_log_para u  i  r (
  4. .clka(i_clk              ),
  5. .addra      (i_r          ),
  6. .ena (1'b1                ),
  7. .douta      (o_r         )
  8. );

  9. image_rom_log_para u_i_g (
  10. .clka(i_clk              ),
  11. .addra      (i_g         ),
  12. .ena (1'b1                ),
  13. .douta      (o_g        )
  14. );

  15. image_rom_log_para u  i  b (
  16. .clka(i_clk              ),
  17. .addra      (i_g         ),
  18. .ena (1'b1                ),
  19. .douta      (o_b        )
  20. );
复制代码

3 工程结构分析
aa747e2f82e1467fa949b06ee3402ac8.jpg
4 仿真及结果
4.1Matlab实验结果
d813dc9c2c1d4f16b7018eb964721bb1.jpg
4.2Modelsim实验结果

2155f04423514192a939d13bacc464a4.jpg
5 搭建 Vitis-sdk 工程
创建 soc_base  sdk  platform  和 APP  工程的过程不再重复,可以阅读 3-3-01_sdk_base_app。以下给出创建好 soc_base sdk platform 的截图和对应工程 APP 的截图。
5.1 创建 SDKPlatform工程
5a6203c0019e4208bfef2686fc1cad7d.jpg
5.2SDKAPP工程

537148ae4ffb42b78f43266b4e9f27c3.jpg

6 硬件连接
硬件连接如图所示:
f4461ad8ee044029a079de517118c1b4.jpg
7 上板实验结果
实验结果如图所示:

48bfa5a5bf414438a661fed32632bf58.jpg


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

本版积分规则