[X]关闭

[米联客-XILINX-H3_CZ08_7100] FPGA_图像入门连载-14FPGA 实现图像 sobel 算子边缘提

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

​ 软件版本: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 图像 sobel 算子边缘提取算法简介
所谓边缘是指其周围像素灰度急剧变化的那些象素的集合,它是图像最基本的特征。边缘存在于目标、背景和 区域之间,所以,它是图像分割所依赖的最重要的依据。由于边缘是位置的标志,对灰度的变化不敏感,因此,边 缘也是图像匹配的重要的特征。sobel  算子利用像素点上下左右四个方向像素权重算法,根据在边缘点处达到极值 这一现象进行边缘检测。Sobel  算子对噪声具有平滑作用,提供较为精确的边缘方向信息,是一种较为常见的边缘 检测方法。
Soble 边缘检测通常带有方向性,可以只检测竖直边缘或垂直边缘或都检测。 所以我们先定义两个梯度方向的系数:
kx=0;ky=1;% horizontal
kx=1;ky=0;% vertical
kx=1;ky=1;% both
然后我们来计算梯度图像,我们知道边缘点其实就是图像中灰度跳变剧烈的点,所以先计算梯度图像,然后将 梯度图像中较亮的那一部分提取出来就是简单的边缘部分。Sobel 算子是prewitt 算子的改进形式,改进之处在于sobel 算子认为,邻域的像素对当前像素产生的影响不是等价的,所以距离不同的像素具有不同的权值,对算子结果产生 的影响也不同。一般来说,距离越远,产生的影响越小。正因为 Sobel 算子对于像素的位置的影响做了加权,与 Prewitt 算子、Roberts 算子相比因此效果更好。相比较 Prewitt 算子,Sobel 模板能够较好的抑制(平滑)噪声。 sobel 要比 prewitt 更能准确检测图像边缘。

947e99d297ab40949dacddb598c6dda9.jpg
之后将 x ,y 方向的导数叠加。
2 设计分析
2.1Matlab代码分析
源代码如下:
  1. clear;clear all;clc;

  2. image_in = imread('lena_1280x720.jpg');

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

  4. image_gray    = im2double(image_gray);
  5. sobel_image = zeros(size(image_gray), 'like', image_gray); for i = 2:1:row-1%模板算子运算
  6. for j = 2:1:col-1
  7. sobel_image_x=...
  8. image_gray(i-1,j+1)      +... image_gray(i    ,j+1)*2 +... image_gray(i+1,j+1)      -... image_gray(i-1,j-1)      -...   image_gray(i    ,j-1)*2 -...   image_gray(i+1,j-1)     ;

  9. sobel_image_y=...
  10. image_gray(i-1,j-1)      +... image_gray(i-1,j    )*2 +... image_gray(i-1,j+1)      -... image_gray(i+1,j-1)      -... image_gray(i+1,j    )*2 -... image_gray(i+1,j+1)    ;

  11. sobel = abs(sobel_image_x)+abs(sobel_image_y);%取绝对值 if(sobel > 95/255)%阈值处理
  12. sobel_image(i,j) = 0; else
  13. sobel_image(i,j) = 1; end

  14. end
  15. end

  16. figure
  17. subplot(121);
  18. imshow(image_gray ), title('the original gray image'); subplot(122);
  19. imshow(sobel_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. r_x1 <= 12'd0; r_x2 <= 12'd0;
  4. end else
  5. Begin//竖直取值
  6. r_x1 <= r_temp_11 + r_temp_21 + r_temp_21 + r_temp_31; r_x2 <= r_temp_13 + r_temp_23 + r_temp_23 + r_temp_33;
  7. end end

  8. always@(posedge i_clk ornegedge i_rst_n) begin
  9. if(!i_rst_n) begin
  10. r_y1 <= 12'd0; r_y2 <= 12'd0;
  11. end else
  12. Begin//水平取值
  13. r_y1 <= r_temp_11 + r_temp_ 12 + r_temp_12 + r_temp_ 13; r_y2 <= r_temp_31 + r_temp_32 + r_temp_32 + r_temp_33;
  14. end end

  15. always@(posedge i_clk ornegedge i_rst_n) begin
  16. if(!i_rst_n) begin
  17. sobel_x <= 'd0; end
  18. else if(r_x1 >= r_x2) Begin//取正值
  19. sobel_x <= r_x1 - r_x2;
  20. end    else    begin
  21. sobel_x <= r_x2 - r_x1; end
  22. end
  23. always@(posedge i_clk ornegedge i_rst_n) begin
  24. if(!i_rst_n) begin
  25. sobel_y <= 'd0; end
  26. else if(r_y1 >= r_y2) begin
  27. sobel_y <= r_y1 - r_y2;
  28. end    else    begin
  29. sobel_y <= r_y2 - r_y1; end
  30. end
复制代码

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

d7a05f6a249d4f35a4c1ce0a0601cdef.jpg

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

e3b5653fe0874788886a74026805236a.jpg

5 硬件连接
硬件连接如图所示:
77d786600aab4490b508234962953365.jpg
6 上板实验结果
实验结果如图所示: fed22de42ddd422eb1e3bd9f69edd4ea.jpg

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

本版积分规则