[X]关闭

[米联客-XILINX-H3_CZ08_7100] FPGA_图像入门连载-12FPGA 实现图像拉普拉斯锐化处理

文档创建者:FPGA课程
浏览次数:93
最后更新: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 的匹配模板如下:

                        
I(i-1,j-1)*0
                        
                        
I(i-1,j) * -1
                        
                        
I(i-1,j+1)*0
                        
                        
I(i  ,j-1) * -1
                        
                        
I(i,j  ) *5
                        
                        
I(i  ,j+1) * -1
                        
                        
I(i+1,j-1)*0
                        
                        
I(i+1,j) * -1
                        
                        
I(i+1,j+1)*0
                        

其中, I(i,j  ) 表示当前像素。
拉普拉斯算子是一个是 n 维欧几里德空间中的一个二阶微分算子,它的定义如下:

9ea6d44849d54ea48576d1a37b9a5b25.jpg
在 x 方向上
029fbfd97b04470aa920ff552787be44.jpg

在 y 方向上
bcc27145ef43440f9955a4c0c3d683e4.jpg

合起来就是
1b11b6202c7240a1bba486743e484b34.jpg
拉普拉斯强调的是图像中灰度的突变,并不强调图像的灰度缓变

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

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

  3. lap_image       = zeros(size(image_in), 'like', image_in); lap_image0     = zeros(size(image_in), 'like', image_in); for i = 2:1:row-1
  4. for j = 2:1:col-1
  5. lap_image0(i,j,1)=... image_in(i-1,j,1)+...  image_in(i,j-1,1)+...  image_in(i,j+1,1)+... image_in(i+1,j,1)-...  image_in(i,j    ,1)*4;

  6. lap_image0(i,j,2)=... image_in(i-1,j,2)+...  image_in(i,j-1,2)+...  image_in(i,j+1,2)+... image_in(i+1,j,2)-...  image_in(i,j    ,2)*4;

  7. lap_image0(i,j,3)=... image_in(i-1,j,3)+...  image_in(i,j-1,3)+...  image_in(i,j+1,3)+... image_in(i+1,j,3)-...  image_in(i,j    ,3)*4;
  8. end end
  9. lap_image = image_in - lap_image0;%去掉背景色

  10. image_in1       = imnoise(image_in,'salt & pepper',0.05); %对图像加入噪声
  11. lap_image1    = zeros(size(image_in), 'like', image_in); lap_image11 = zeros(size(image_in), 'like', image_in);  for i = 2:1:row-1
  12. for j = 2:1:col-1
  13. lap_image1(i,j ,1)=...  image_in1(i-1,j,1)+...  image_in1(i,j-1,1)+...  image_in1(i,j+1,1)+... image_in1(i+1,j,1)-...  image_in1(i,j    ,1)*4;

  14. lap_image1(i,j ,2)=...  image_in1(i-1,j,2)+...  image_in1(i,j-1,2)+...  image_in1(i,j+1,2)+... image_in1(i+1,j,2)-...  image_in1(i,j    ,2)*4;

  15. lap_image1(i,j ,3)=...  image_in1(i-1,j,3)+...  image_in1(i,j-1,3)+...  image_in1(i,j+1,3)+... image_in1(i+1,j,3)-...  image_in1(i,j    ,3)*4;
  16. end end
  17. lap_image11 = image_in1 - lap_image1;

  18. image_in2       = imnoise(image_in,'gaussian',0.05);
  19. lap_image2    = zeros(size(image_in), 'like', image_in); lap_image22 = zeros(size(image_in), 'like', image_in);  for i = 2:1:row-1
  20. for j = 2:1:col-1
  21. lap_image2(i,j ,1)=...  image_in2(i-1,j,1)+...  image_in2(i,j-1,1)+...  image_in2(i,j+1,1)+... image_in2(i+1,j,1)-...  image_in2(i,j    ,1)*4;

  22. lap_image2(i,j ,2)=...  image_in2(i-1,j,2)+...  image_in2(i,j-1,2)+...  image_in2(i,j+1,2)+... image_in2(i+1,j,2)-...  image_in2(i,j    ,2)*4;
  23. lap_image2(i,j ,3)=...  image_in2(i-1,j,3)+...  image_in2(i,j-1,3)+...  image_in2(i,j+1,3)+... image_in2(i+1,j,3)-...  image_in2(i,j    ,3)*4;
  24. end end
  25. lap_image22 = image_in2 - lap_image2;

  26. figure
  27. subplot(321);
  28. imshow(image_in    ), title('the original gray image');
  29. subplot(322);
  30. imshow(lap_image), title('the lap image image'); subplot(323);
  31. imshow(image_in1), title('the salt & pepper image'); subplot(324);
  32. imshow(lap_image11), title('the lap image1 image'); subplot(325);
  33. imshow(image_in2), title('the gaussian image'); subplot(326);
  34. imshow(lap_image22), title('the lap image2 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;
  4. end    else    begin
  5. sum_r1 <= r_temp_ 12 + r_temp_21 + r_temp_23 + r_temp_32; sum_r2 <= {2'd0,r_temp_22,2'd0} + {4'd0,r_temp_22};

  6. sum_g1 <= g_temp_ 12 + g_temp_21 + g_temp_23 + g_temp_32; sum_g2 <= {2'd0,g_temp_22,2'd0} + {4'd0,g_temp_22};
  7. sum_b1 <= b_temp_ 12 + b_temp_21 + b_temp_23 + b_temp_32; sum_b2 <= {2'd0,b_temp_22,2'd0} + {4'd0,b_temp_22};
  8. end end

  9. assign    sum_r = sum_r2 - sum_r1;
  10. assign      sum_g = sum_g2 - sum_g1;
  11. assign      sum_b = sum_b2 - sum_b1;

  12. always@(posedge i_clk ornegedge i_rst_n) begin
  13. if(!i_rst_n) begin
  14. lap_r <= 8'd0; end
  15. else if(sum_r[11:8] > 0) begin
  16. lap_r <= 8'd255; end
  17. else if(sum_r2 < sum_r1) begin
  18. lap_r <= 8'd0;
  19. end    else    begin
  20. lap_r <= sum_r[7:0]; end
  21. end

  22. always@(posedge i_clk ornegedge i_rst_n) begin
  23. if(!i_rst_n) begin
  24. lap_g <= 8'd0; end
  25. else if(sum_g[11:8] > 0) begin
  26. lap_g <= 8'd255; end
  27. else if(sum_g2 < sum_g1) begin
  28. lap_g <= 8'd0;
  29. end    else    begin
  30. lap_g <= sum_g[7:0];
  31. end end

  32. always@(posedge i_clk ornegedge i_rst_n) begin
  33. if(!i_rst_n) begin
  34. lap_b <= 8'd0; end
  35. else if(sum_b[11:8] > 0) begin
  36. lap_b <= 8'd255; end
  37. else if(sum_b2 < sum_b1) begin
  38. lap_b <= 8'd0;
  39. end    else    begin
  40. lap_b <= sum_b[7:0];
  41. end end
复制代码

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

9fd629d891844ce8bc796ac39e9dcbb6.jpg

3.2Modelsim实验结果

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

bb72bc749d2c449f8c3de488459a3fbd.jpg
5 硬件连接
硬件连接如图所示:
3c24ada642bb48d3b2630f7ca220543f.jpg
6 上板实验结果
实验结果如图所示:

efbcb64f5f3f427595b9d6593405ce46.jpg



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

本版积分规则