[X]关闭

[米联客-XILINX-H3_CZ08_7100] FPGA_图像入门连载-13FPGA 实现图像拉普拉斯边缘提取处

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

​ 软件版本: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 图像拉普拉斯边缘提取算法简介
算子简介
在一维连续集上有 函数 f(x), 我们可 以通过求导获得该 函数在任一点的斜率 ,根据 导数 的定义有 : 430956a78d5a42889d90e73f17d302d1.jpg 在二维连续数集上有函数 f(x,y),我们也可以通过求导获得该函数在 x ,y 分量的偏导
数,根据定义有
05470513926d4e47b351c2be75536106.jpg
边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。图像 属性中的显著变化通常反映了属性的重要事件和变化。 这些包括:
l 图像深度上的不连续
l 二维面方向不连续
l 物质属性变化
l 场景照明变化
边缘检测是图像处理和计算机视觉中,尤其是特征提取中的一个研究领域。
图像边缘检测大幅度地减少了数据量,并且剔除了可以认为不相关的信息,保留了图像重要的结构属性。有许 多方法用于边缘检测,它们的绝大部分可以划分为两类:基于查找一类和基于零穿越的一类。基于查找的方法通过 寻找图像一阶导数中的最大和最小值来检测边界,通常是将边界定位在梯度最大的方向。基于零穿越的方法通过寻 找图像二阶导数零穿越来寻找边界,通常是 Laplacian 过零点或者非线性差分表示的过零点。
拉普拉斯提取边缘属于使用二阶导提取边缘,它是一种各向同性的边缘提取算子。各向同性和就是指使用这一 个算子,就能对任何走向的界线和线条锐化,无方向。但他的缺点相比于一阶微分对噪声敏感。它对孤立像素的响 应要比边缘或线的响应更强烈,因此只适用于无噪声图像。一般在使用拉普拉斯算子提取边缘之前,先使用高斯平 滑图像,这一过程就称为 log 算子,拉普拉斯算子计算方法
La plac ian=(x+1,)+f(x-1,)+(x, y+1)+f(x,y-1)-4(x, y)
拉普拉斯边缘提取 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  ) * 4
                        
                        
I(i  ,j+1) * -1
                        
                        
I(i+1,j-1)*0
                        
                        
I(i+1,j) * -1
                        
                        
I(i+1,j+1)*0
                        

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); for i = 2:1:row-1
  4. for j = 2:1:col-1
  5. lap_image(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_image(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_image(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. figure
  10. subplot(121);
  11. imshow(image_in    ), title('the original gray image');
  12. subplot(122);
  13. imshow(lap_image), title('the lap image 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;
  4. sum_r2 <= 12'd0; sum_g2 <= 12'd0;   sum_b2 <= 12'd0;
  5. end
  6. else
  7. begin
  8. sum_r1 <= r_temp_ 12 + r_temp_21 + r_temp_23 + r_temp_32; sum_r2 <= {2'd0,r_temp_22,2'd0};

  9. sum_g1 <= g_temp_ 12 + g_temp_21 + g_temp_23 + g_temp_32; sum_g2 <= {2'd0,g_temp_22,2'd0};

  10. sum_b1 <= b_temp_ 12 + b_temp_21 + b_temp_23 + b_temp_32; sum_b2 <= {2'd0,b_temp_22,2'd0};
  11. end end

  12. assign    sum_r = sum_r2 - sum_r1;
  13. assign         sum_g = sum_g2 - sum_g1;
  14. assign         sum_b = sum_b2 - sum_b1;

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

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

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

2.3 工程结构分析

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

a457c76c8893497e998d9dee094ca9d4.jpg
3.2Modelsim实验结果

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

4.2SDKAPP工程

4574aa54fe1a4aafabbcf73a718b2b83.jpg
5 硬件连接
硬件连接如图所示:
68922413fcf847bebd7432aa37ca54c2.jpg
6 上板实验结果
实验结果如图所示:
e7c5f869c14745f0bbb0ebf65faeab2b.jpg



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

本版积分规则