基于Sobel算法的边缘检测设计与实现
1、边缘检测
针对的时灰度图像,顾名思义,检测图像的边缘,是针对图像像素点的一种计算,目的时标识数字图像中灰度变化明显的点,图像的边缘检测,在保留了图像的重要结构信息的同时,剔除了可以认为不相关的信息,大幅度减少了数据量,便于图像的传输和处理;
边缘检查的方法大致可以分为两类:基于查找的一类,通过寻找图像一阶导数中最大值和最小值来检测边界,包括Sobel算法、Roberts Cross算法等;基于零穿越的一类,通过寻找图像二阶导数零穿越来寻找边界,包括Canny算法,Laplacian算法等。
Sobel算法:准确率比较低,但是效率比较高;
详细见下面网址:
https://blog.csdn.net/great_yzl/article/details/119709699
Soble算法的核心就是Sobel算子,该算子包含两组3x3的矩阵;
对于图像而言,取3行3列的图像数据,将图像数据与对应位置的算子的值相乘再相加,得到x方向的Gx,和y方向的Gy,将得到的Gx和Gy,平方后相加,再取算术平方根,得到Gxy,近似值为Gx和Gy绝对值之和,将计算得到的Gxy与我们设定的阈值相比较,Gxy如果大于阈值,表示该点为边界点,此点显示黑点,否则显示白点。
2、实验设计
我们将Sobel算法在图像边缘检查中的实现分为4步,第1步,通过Gx、Gy的计算公式结合FIFO求和算法求取Gx、Gy的值;第2步,求得Gx、Gy的绝对值;第3步,将Gx、Gy带入Gxy计算公式,求得Gxy的值;第4步,将求得的Gxy与设定的阈值相比较,当Gxy大于等于阈值,赋值rgb为黑色,否则, rgb赋值为白色。
图片正在经过Sobel算法之后,输出的图片相比于输入时的图片会少2行2列数据,这是因为在求取Gx、Gy时,要使用FIFO求和算法,该算法只有在第2行或第2列数据输入时才开始执行,第0、1行或第0、1列不会进行求和运算,更无数据输出,所以会缺失的2行2列。
2.1 实验目标
实验目标:使用Matlab软件将图片转换为灰度图像,并且将灰度图像的高 3 位取出存放为txt 文本 ,PC机通过串口RS232传输图片数据给FPGA,FPGA通过Sobel算法检测出图片的边缘轮廓,将处理后的图片在VGA显示器上显示出来。
实验要求:VGA显示模式:640x480@60;传入图片分辨率大小100x100。
2.2 图片预处理
在进行Sobel算法之前,先要将图片进行一下预处理,将彩色图片转换成灰度图像,并且将灰度图像的高 3 位取出存放为txt 文本,图解和代码;
matlab代码:
clc; %清理命令行窗口clear all; %清理工作区image = imread('D:\FPGA\FPGA_Basic_Pro\sobel\matalb\curry_logo.bmp'); %使用imread函数读取图片数据figure;imshow(image); %窗口显示图片
R = image(:,:,1); %提取图片中的红色层生成灰度图像figure;imshow(R); %窗口显示灰色图像[ROW,COL] = size(R); %灰色图像大小参数data = zeros(1,ROW*COL); %定义一个初值为0的数组,存储转换后的图片数据for r = 1:ROWfor c = 1 : COLdata((r-1)*COL+c) = bitshift(R(r,c),-5); %红色层数据右移5位end
endfid = fopen('D:\FPGA\FPGA_Basic_Pro\sobel\matalb\logo.txt','w+'); %打开或新建一个txt文件for i = 1:ROW*COLfprintf(fid,'%02x' ,data(i)); %写入图片数据
end
fclose(fid);