资源描述
边缘检测的多种方法
——综合课程设计(通信组)设计报告
小组成员:
04011013 丁相程
04011011 毛东宇
本次课程设计基本目标是在边缘检测例程的基础上添加多种边缘检测算法,并实现算法之间的切换;另外将底色加入边缘检测图中并改为黑白色以更直观的看到边缘检测效果。
一. 硬件部分
1、 添加模块
类似实验二和实验二补充,在例程的基础上,添加一个AXI GPIO,名称为led_8bit,再添加一个AXI GPIO,名称为sw_5bit,进行相关的模块定义。
整体模块
添加的模块
2、 管教绑定
由于我所添加的模块不是顶层模块,所以除了在本层模块中需要管教绑定外,顶层模块同样需要管教绑定。
在VDMA_wrapper_i中添加
sws_8bits_tri_i,
leds_8bits_tri_o,
input [7:0]sws_8bits_tri_i;
output [7:0]leds_8bits_tri_o;
wire [7:0]sws_8bits_tri_i;
wire [7:0]leds_8bits_tri_o;
.sws_8bits_tri_i(sws_8bits_tri_i),
.leds_8bits_tri_o(leds_8bits_tri_o),
在顶层文件中添加
leds_8bits_tri_o,
sws_8bits_tri_i,
output [7:0]leds_8bits_tri_o;
input [7:0]sws_8bits_tri_i;
.leds_8bits_tri_o(leds_8bits_tri_o),
.sws_8bits_tri_i(sws_8bits_tri_i));
二. 软件部分
1、 添加硬件开关相应程序(类似实验二及补充)
添加头文件
#include "xgpio.h"
在main函数中
添加定义
XGpio dip, led;
int i, dip_check;
添加开关读取及led显示程序
dip_check = XGpio_DiscreteRead(&dip, 1);
xil_printf("DIP Switch Status %x\r\n", dip_check);
XGpio_DiscreteWrite(&led, 1, dip_check);
添加边缘检测算法切换程序(仅作为例子)
if(dip_check==0x00){
}
拨码开关0对应原图,1对应Sobel,2对应laplacian,4对应prewitt,8对应log
2、 原图显示程序
原图显示程序命名为VideoCopy函数
在对各个像素点逐行逐列的扫描中,直接将输入赋值给输出,完成原图像素点的复制。
3、四种边缘检测算法
(1) Sobel(索贝尔)边缘检测算子
-1
0
1
-2
0
2
-1
0
1
-1
-2
-1
0
0
0
1
2
1
(2) Prewitt(普瑞维特)边缘检测算子
-1
0
1
-1
0
1
-1
0
1
-1
-1
-1
0
0
0
1
1
1
(3) Laplacian(拉普拉斯)边缘检测算子
0
-1
0
-1
4
-1
0
-1
-1
-1
-1
-1
-1
8
-1
-1
-1
-1
(4) log边缘检测算子
此算子尝试了多种方法
1) x,y方向算子相同
2) x,y方向算子不同
4、更改边缘检测算法
(1) 根据实际检测情况更改阈值
sobel算法阈值为10
prewitt算法阈值为7
laplacian算法阈值为12
log算法阈值为12
(2) 将底色加入图像,并改为黑白色(此时边缘更加清楚)
当特征值小于阈值,不赋值为0,而是赋值为原先此像素点的像素值(加入底色),若三原色赋值为同一基色的像素值(如均赋值为红色的像素值),则底色变为黑白。
三.实验现象及分工情况
拨动相应开关,相应led灯亮。显示屏显示原图,Sobel边缘检测图,laplacian边缘检测图,prewitt边缘检测图,log边缘检测图。其中sobel和prewitt效果相似,laplacian只有对细微边缘较敏感,大多数边缘检测不出来。另外,log边缘检测算子更换了两个,但是显示图像完全不正确,直接就是白色雪花图。
另外,根据代码推测,边缘应当是白色(三原色均是最大的强度),但是实验出来边缘为彩色,猜测由于边缘一直的晃动,三原色的边缘并不相同。
丁相程:主要编程工作,报告撰写。
毛东宇:题目确定,程序修改。
5
展开阅读全文