本帖最后由 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 代码分析源代码如下: - clear;clear all;clc;
- image_in = imread('lena_1280x720.jpg'); [row,col,n] = size(image_in);
- image_gray = rgb2gray(image_in);
- image_edge_0=zeros(row,col); for i = 2:1:row-1
- for j = 2:1:col-1
- 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)));
- image_edge_d(i,j) = image_dilate_max(i,j) - image_erode_min(i,j) ; end
- end
- subplot(221);
- imshow(image_gray); title('the image gray image'); subplot(222);
- imshow(image_dilate_max); title('the image dilate image'); subplot(223);
- imshow(image_erode_min); title('the image erode image'); subplot(224);
- imshow(image_edge_d); title('the image edge image');
复制代码
2.2Verilog 代码分析- always@(posedge i_clk ornegedge i_rst_n) begin
- if(!i_rst_n) begin
- r_temp_max <= 'd0;
- end else begin
- r_temp_max <= (r_temp_11 >= r_temp_ 12 && r_temp_ 11 >= r_temp_ 13)?r_temp_ 11:
- (r_temp_ 12 >= r_temp_ 11 && r_temp_ 12 >= r_temp_ 13)?r_temp_ 12:
- (r_temp_ 13 >= r_temp_ 11 && r_temp_ 13 >= r_temp_ 12)?r_temp_ 13:'d0;
- end end
- always@(posedge i_clk ornegedge i_rst_n) begin
- if(!i_rst_n) begin
- r_temp_min <= 'd0;
- end else begin
- r_temp_min <= (r_temp_11 <= r_temp_ 12 && r_temp_ 11 <= r_temp_ 13)?r_temp_ 11:
- (r_temp_ 12 <= r_temp_ 11 && r_temp_ 12 <= r_temp_ 13)?r_temp_ 12:
- (r_temp_ 13 <= r_temp_ 11 && r_temp_ 13 <= r_temp_ 12)?r_temp_ 13:'d0;
- end end
- image_dilate_gray u_image_dilate_gray
- (
- .i_clk (i_clk ),
- .i_rst_n (i_rst_n ),
- .i_hsyn (i_hsyn ),
- .i_vsyn (i_vsyn ),
- .i_en (i_en ),
- .i_gray (i_gray ),
- .o_hs (dilate_hsyn ),
- .o_vs (dilate_vsyn ),
- .o_en (dilate_de ),
- .o_gray (dilate_data )
- );
- image_erode_gray u_image_erode_gray
- (
- .i_clk (i_clk ),
- .i_rst_n (i_rst_n ),
- .i_hsyn (i_hsyn ),
- .i_vsyn (i_vsyn ),
- .i_en (i_en ),
- .i_gray (i_gray ),
- .o_hs (erode_hsyn ),
- .o_vs (erode_vsyn ),
- .o_en (erode_de ),
- .o_gray (erode_data )
- );
- endmodule
复制代码
2.3 工程结构分析
我们将图像算法的模块做成 IP 后,在vivado 中进行工程的搭建,工程结构如图所示:
3 仿真及结果
3.1Matlab 实验结果
3.2Modelsim 实验结果
4 搭建 Vitis-sdk 工程
创建 soc_base sdk platform 和 APP 工程的过程不再重复,可以阅读 3-3-01_sdk_base_app。以下给出创建好 soc_base sdk platform 的截图和对应工程 APP 的截图。 4.1 创建 SDK Platform 工程
4.2SDK APP 工程
5 硬件连接硬件连接如图所示:
6 上板实验结果实验结果如图所示:
|