本帖最后由 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 更能准确检测图像边缘。
之后将 x ,y 方向的导数叠加。 2 设计分析2.1Matlab代码分析 源代码如下: - clear;clear all;clc;
- image_in = imread('lena_1280x720.jpg');
- image_gray = rgb2gray(image_in); [row,col] = size(image_gray);
- image_gray = im2double(image_gray);
- sobel_image = zeros(size(image_gray), 'like', image_gray); for i = 2:1:row-1%模板算子运算
- for j = 2:1:col-1
- sobel_image_x=...
- 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) ;
- sobel_image_y=...
- 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) ;
- sobel = abs(sobel_image_x)+abs(sobel_image_y);%取绝对值 if(sobel > 95/255)%阈值处理
- sobel_image(i,j) = 0; else
- sobel_image(i,j) = 1; end
- end
- end
- figure
- subplot(121);
- imshow(image_gray ), title('the original gray image'); subplot(122);
- imshow(sobel_image), title('the lap image image');
复制代码
2.2Verilog代码分析 - always@(posedge i_clk ornegedge i_rst_n) begin
- if(!i_rst_n) begin
- r_x1 <= 12'd0; r_x2 <= 12'd0;
- end else
- Begin//竖直取值
- 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;
- end end
- always@(posedge i_clk ornegedge i_rst_n) begin
- if(!i_rst_n) begin
- r_y1 <= 12'd0; r_y2 <= 12'd0;
- end else
- Begin//水平取值
- 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;
- end end
- always@(posedge i_clk ornegedge i_rst_n) begin
- if(!i_rst_n) begin
- sobel_x <= 'd0; end
- else if(r_x1 >= r_x2) Begin//取正值
- sobel_x <= r_x1 - r_x2;
- end else begin
- sobel_x <= r_x2 - r_x1; end
- end
- always@(posedge i_clk ornegedge i_rst_n) begin
- if(!i_rst_n) begin
- sobel_y <= 'd0; end
- else if(r_y1 >= r_y2) begin
- sobel_y <= r_y1 - r_y2;
- end else begin
- sobel_y <= r_y2 - r_y1; end
- end
复制代码
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 创建 SDKPlatform工程
4.2SDKAPP工程
5 硬件连接硬件连接如图所示:
6 上板实验结果实验结果如图所示:
|