[X]关闭

[米联客-XILINX-H3_CZ08_7100] FPGA_图像入门连载-21FPGA 实现图像灰度形态学梯度边缘

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

​软件版本: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 图像灰度形态学梯度边缘提取算法简介
我们前面介绍了二值图像的形态学操作,腐蚀和膨胀,针对灰度图像,可以采取类似腐蚀和膨胀的操作,就可 以得到灰度图像的边缘信息。数学形态学(Mathematical   Morphology),是基于积分几何和几何概率理论建立的关于 图像形状和尺寸的研究方法,其实质是一种非线性滤波方法。数学形态学的方法应用于视觉图象的处理就是用具有 一定形状、大小的结构元素去探测、度量和提取图象中的对应形状,以达到对图像进行处理、分析、识别的目的。 数学形态学处理能简化图像数据,在保持图像基本形状特性的同时去除不相干的结构。
灰度数学形态是二值数学形态对灰度图像的自然扩展。
灰度图像的腐蚀和膨胀实际上是用滑动模板去遍历图像中的每一个元素,并用这个区域中的最大值或最小值去 代替窗口中的某个元素值,若取得是最大值,则是膨胀操作,若取得是最小值,则是腐蚀操作。在窗内求最大值或 最小值时,只有元素值不为 0 的位置才参与求最大值或最小值。
对灰度图像进行先膨胀后腐蚀就可以得到灰度形态学梯度边缘信息。
形态学提取图像轮廓有 3 种方法,即(符号⊕表示膨胀运算,Θ 表示腐蚀运算):
1)f⊕b − f
2)f − fΘb
3)f⊕b − fΘb

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

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


  4. image_edge_0=zeros(row,col); for i = 2:1:row-1
  5. for j = 2:1:col-1
  6. image_erode_min(i,j) =min(min(image_gray(i-1:i+1,j-1:j+1)));  image_dilate_max(i,j)=max(max(image_gray(i-1:i+1,j-1:j+1)));
  7. image_edge_d(i,j) = image_dilate_max(i,j) - image_erode_min(i,j) ; end
  8. end

  9. subplot(221);
  10. imshow(image_gray); title('the image gray image'); subplot(222);
  11. imshow(image_dilate_max); title('the image dilate image'); subplot(223);
  12. imshow(image_erode_min); title('the image erode image'); subplot(224);
  13. imshow(image_edge_d); title('the image edge image');
复制代码

2.2Verilog 代码分析
  1. always@(posedge i_clk ornegedge i_rst_n) begin
  2. if(!i_rst_n) begin
  3. r_temp_max <= 'd0;
  4. end    else    begin
  5. r_temp_max      <= (r_temp_11 >= r_temp_ 12 && r_temp_ 11 >= r_temp_ 13)?r_temp_ 11:
  6. (r_temp_ 12 >= r_temp_ 11 && r_temp_ 12 >= r_temp_ 13)?r_temp_ 12:
  7. (r_temp_ 13 >= r_temp_ 11 && r_temp_ 13 >= r_temp_ 12)?r_temp_ 13:'d0;
  8. end end

  9. always@(posedge i_clk ornegedge i_rst_n) begin
  10. if(!i_rst_n) begin
  11. r_temp_min <= 'd0;
  12. end    else    begin
  13. r_temp_min      <= (r_temp_11 <= r_temp_ 12 && r_temp_ 11 <= r_temp_ 13)?r_temp_ 11:
  14. (r_temp_ 12 <= r_temp_ 11 && r_temp_ 12 <= r_temp_ 13)?r_temp_ 12:
  15. (r_temp_ 13 <= r_temp_ 11 && r_temp_ 13 <= r_temp_ 12)?r_temp_ 13:'d0;
  16. end end

  17. image_dilate_gray u_image_dilate_gray
  18. (
  19.         .i_clk                        (i_clk                                ),
  20.         .i_rst_n                (i_rst_n                        ),
  21.         .i_hsyn                    (i_hsyn                                ),
  22.         .i_vsyn                    (i_vsyn                                ),
  23.         .i_en                    (i_en                                ),
  24.         .i_gray                        (i_gray                                ),
  25.         .o_hs                    (dilate_hsyn                ),
  26.         .o_vs                    (dilate_vsyn                ),
  27.         .o_en                    (dilate_de                        ),        
  28.         .o_gray                        (dilate_data                )
  29. );

  30. image_erode_gray u_image_erode_gray
  31. (
  32.         .i_clk                        (i_clk                                ),
  33.         .i_rst_n                (i_rst_n                        ),
  34.         .i_hsyn                    (i_hsyn                                ),
  35.         .i_vsyn                    (i_vsyn                                ),
  36.         .i_en                    (i_en                                ),
  37.         .i_gray                        (i_gray                                ),
  38.         .o_hs                    (erode_hsyn                        ),
  39.         .o_vs                    (erode_vsyn                        ),
  40.         .o_en                    (erode_de                        ),        
  41.         .o_gray                        (erode_data                 )
  42. );

  43. endmodule
复制代码

2.3 工程结构分析
我们将图像算法的模块做成 IP 后,在vivado 中进行工程的搭建,工程结构如图所示:
53602acf733547bd8d794bc69f5ffc22.jpg
3 仿真及结果
3.1Matlab 实验结果
2198b075f4074440b4edb6ccb7754ad5.jpg
3.2Modelsim 实验结果
4cc4568a9b1a40c1b5f3191339fd28d0.jpg
4 搭建 Vitis-sdk 工程
创建 soc_base  sdk  platform  和 APP  工程的过程不再重复,可以阅读 3-3-01_sdk_base_app。以下给出创建好 soc_base sdk platform 的截图和对应工程 APP 的截图。
4.1 创建 SDK Platform 工程
09a824e4db3b4a13b85e2d7144cc99a2.jpg
4.2SDK APP 工程
b85c693eac34475ca2c276fc6d750b9f.jpg

5 硬件连接
硬件连接如图所示:

0b87ee3536024f1faec8e5a2b9c4a3d2.jpg
6 上板实验结果
实验结果如图所示:
b49ca49d28dc40ecafa432530f777b86.jpg




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

本版积分规则