0


毕业设计-基于 MATLAB 的图像边缘检测算法的研究和实现

前言

 📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。

🚀对毕设有任何疑问都可以问学长哦!

选题指导: https://blog.csdn.net/qq_37340229/article/details/128243277

大家好,这里是海浪学长毕设专题,本次分享的课题是

🎯毕业设计-基于 MATLAB 的图像边缘检测算法的研究和实现

课题背景和意义

二十世纪五十年代,人们开始提出一些数字图像处理的技术,是通过计算机对图像 所包含的信息进行加工和处理后,使得图像中的信息能够为我们所用。从早期的报纸业, 到 1964 年,在航天领域中,有里程碑作用的“旅行者七号”太空船在太空中拍摄了月 球的照片,并回传给地球上的工作站成功处理,到现在的我们所能接触到的统计学、医学等等各种领域之中,数字图像处理已经迅速发展,并成为了我们不可或缺的重要技术 和研究对象。 图像处理中最关键的一步就是对图像信息进行分解,提取一些具有某种特征的图像 信息。图像的边缘负载的信息,能够在图像处理过程中起到识别的作用,这也正是他作 为图像基本特征的重要原因。与此同时,之于图像边缘在图像的要素中占有举足轻重的地位,相对的,对边缘进行检测的技术,也在处理图像的各种技术之中,作用不可小 觑。 图像边缘定义为图像中像素灰度有阶跃变化或屋顶变化的那些像素的集合。基于边 缘灰度的不连续性,遍历考察图像中单个像素点的局部灰度分布情况,利用一阶和二阶 导数来进行边缘检测。 在长期对图像边缘检测的研究中,不断涌现出了许多种图像边缘检测的方法。而到 目前为止,已经提出的各种方法,对于图像边缘检测的效果,都有自己的优点和不足, 也有自己的适用范围。并没有存在一种比较普遍适用的边缘检测方法。因此,对于寻找 和创造更新的、更有效的边缘检测方法仍然是图像处理中比较主流的方向。

实现技术思路

一、MATLAB概述

MATLAB简介

MATLAB 通常又可被称作是矩阵实验室(根据其英文全称 Matrix Laboratory 得名)。 作为一款用于计算数值和处理图形图像的软件系统,MATLAB 被应用在很多相关领域中,如在矩阵代数中,可利用 MATLAB 进行矩阵的计算,在数字信号处理领域中,可利用 MATLAB 进行动态仿真等等。

**MATLAB 的系统结构简介 **

MATLAB 的系统结构分为三个层次九个部分。如图

MATLAB 系统从下到上依次由基础层、仿真应用层、实时仿真层三个层次构成,其中基础层是整个系统的最基础的部分,我们下面具体介绍一下基础层。

**MATLAB 中常用的图像操作 **

1)imread 函数。

MATLAB 可让用户通过 imread()函数,自己导入要进行处理的目标图像,MATLAB 所支持的图像格式也是多种多样的,我们常见的有 BMP、JPEG、JPG、TIFF、HDF、PCX 等。

2)imwrite 函数。

MATLAB 中用 imwrite()函数输出图像,可将一个矩阵数据存储转换成为图像文件。以上提到的文件格式都支持。

3)imshow/image 函数 MATLAB 编程环境中,用户可以通过运行 imshow()、image()等函数,实现在屏幕上显示图像的操作。

4)图像类型转换函数。

在 MATLAB 中可以通过简单的运行一个函数而完成图像类型转换的操作。

5)edge 函数

这个函数只适用于处理灰度图像。函数定义为 edge(IAMGE,method)。其中,参数 IMAGE 为要进行处理的图像,method 为所要使用的图像边缘检测算法,可使用的方法,即字符串为sobel,prewitt,roberts,log 等。

**二、图像边缘检测 **

图像边缘检测的基本理论

1、图像的边缘

边缘的基本定义:图像的边缘实际上是一组像素的集合,而这些像素所在图像中的位置上,像素灰度出现了阶跃变化,或者是屋顶变化。根据边缘的定义及灰度变化形状,我们可以简单的将图像边缘归纳成两类,即阶跃状和屋顶状:

  1. 阶跃状边缘:处在这种类型的边缘上的像素点,都是位于图像中灰度发生阶跃变化的竖直台阶上的像素,连续性好,是一种较为理想的数字边缘模型。如图

  1. 屋顶状边缘:这种类型的图像边缘是一种平缓上升和下降的边缘。如图

**边缘检测 **

根据图像边缘的定义我们知道,在图像的边缘位置拥有一个共同的特质,即像素的灰度有很大的变化。通过考察其一阶导数出现最大值的位置,以及二阶导数出现零交叉点的位置,即可判断边缘像素的位置。

图像边缘与一阶导数以及二阶导数的关系如图

**卷积理论 **

在处理图像时,普遍通过计算图像卷积以达到处理图像的目的,也就是遍历图像中的所有像素,使用每个像素的小领域生成最终的图像。

1、基本理论

在数学定义中,我们把计算两个函数的无穷积分的方法,叫做卷积。假定 P 是图像中的一个区域,大小为 3×3,矩阵 K 式作用在这个区域上的卷积核,大小也是 3×3。那么利用P和K 进行卷积,得到的该区域的新的中心像素值 P22则表示为:

2、Roberts 边缘检测算子

函数的梯度定义为:

Roberts 边缘检测算子的原理,是首先计算图像中所有相互垂直方向上的差分,然后利用差分进行像素梯度的计算,实际计算中所采用的像素,是处在区域对角线方向上的像素,取其差值,即:

图像的梯度为:

将算式简化得到:

所对应的卷积模板:

3、Roberts 算子检测图像边缘的实现

  1. 获取原图像的数据区指针。

  2. 新建一个缓冲区,用于进行图像处理的中间过程和缓存中间结果,其大小应该与原图像一样。初始化区域中的所有像素值,设置成 255.

  3. 核心算法的执行是在我们新建的缓冲区里面,用 Roberts 算子遍历图像中所有的像素点,分别计算其灰度值,再根据上述公式进行计算。

  4. 将缓冲区中的计算数据结果,复制到原图数据区。

实现代码如下:

clear; 
%清空工作区变量 
I = imread('cameraman.tif'); 
%读取待处理图像文件 
subplot(131),imshow(I),title(‘原图像’); 
%显示待处理图像文件 
image = rgb2gray(I); 
%将图片转换成灰度图像 
TempImage1 = edge ( image ,’Roberts’); 
%image 为将要进行边缘检测目标图像,所使用的方法是 Roberts 算子,而阈值则是
由系统自适应生成的 
subplot(132),imshow(TempImage1),title(‘Roberts 算子’); 
%显示 Roberts 自动阈值边缘检测效果图像 
TempImage 2 = edge ( image ,’Roberts’,0.07); 
% image 为将要进行边缘检测目标图像,所使用的方法是 Roberts 算子,而阈值设置
为 0.07 
subplot(133),imshow(TempImage2),title(‘Roberts 算子 阈值 0.07’); 
%处理效果图

处理效果对比图,如图。

**Sobel 边缘检测算子 **

1、基本理论

图像中某点处的梯度值,正比于与该点周围相临近的像素点之间的灰度差值。也就是说,像素的梯度值越大,则对应区域的灰度变化更为迅速,比如图像边缘等处。

Sobel 边缘检测算子在进行卷积操作的时候,所使用的卷积核大小为 3×3 的矩阵。通常使用的 Sobel 算子卷积模板,包括有水平方向和方向两种模板,如图。

利用 Sobel 算子检测图像边缘时,分别利用这两个模板对图像中的每个像素进行卷积,分别将中心像素与模板中心元素相对应,进行卷积运算。计算完成后,将两个卷积核所对应的计算结果进行比较,较大值为该点的输出位,然后选择合适的阈值以提取边缘。 对于一个图像模板邻域,如图:

水平方向卷积运算为

垂直方向卷积运算为:

梯度计算:

当我们对图像中某一些特定方向上的边缘进行检测时,Sobel 算子在模板的定义上,做了相应的改进,提供了比如应用于检测 45°或者是 135°方向上边缘的算子模板。

**Sobel 算子检测图像边缘的实现 **

  1. 获取原图像的数据区指针。

  2. 新建两个缓冲区,其大小与原图像一样,用于存储原图像及其副本,以供后面的计算处理。同时将这两个区域初始化为原图像的副本。

  3. 为两个缓存区域,分别设置一个用于卷积操作的 Sobel 算子模板,然后两个区域中,分别遍历副本图像中的所有像素,逐一进行卷积操作,计算结果。

  4. 将上一步骤中所得到的两个缓存区域中的结果进行比较,将较大值重新赋值给图像中的像素点。

  5. 将缓冲区中选择的图像复制到原图像数据区。

编程实现:

clear; 
%清空工作区变量 
I = imread('cameraman.tif'); 
%读取待处理图像文件 
subplot(131),imshow(I),title(‘原图像’); 
%显示待处理图像文件 
image = rgb2gray(I); 
%将图片转换成灰度图像 
BW1 = edge ( image ,’Sobel’); 
%image 为将要进行边缘检测目标图像,所使用的方法是 Sobel 算子,而阈值则是由
系统自适应生成的 
subplot(132),imshow(BW1),title(‘Sobel 算子’); 
%显示处理后图像 
BW2 = edge ( image ,’Sobel’,0.07); 
% image 为将要进行边缘检测目标图像,所使用的方法是 Sobel 算子,而阈值设置为
0.07 
subplot(133),imshow(BW2),title(‘Sobel 算子 阈值 0.07’); 
%阈值为 0.07 的 Sobel 算子处理后图像

处理效果对比图,如图:

**Prewitt 边缘检测算子 **

1、基本理论

根据临近影响像素的影响作用大小,而赋予不同的权值,即离中心像素越近的像素,影响越大,权值也就越大。

Prewitt 算子模板,如下图

2、Prewitt 算子检测图像边缘的实现

  1. 获取原图像的数据区指针。

  2. 新建两个缓冲区,其大小与原图像一样,用于存储原图像及其副本,以供后面的计算处理。同时将这两个区域初始化为原图像的副本。

  3. 为两个缓存区域,在每个区域中单独设置一个用于卷积操作的 Prewitt 模板,然后两个区域中,分别遍历副本图像中的所有像素,逐一进行卷积操作,计算结果。

  4. 将上一步骤中所得到的两个缓存区域中的结果进行比较,将较大值重新赋值给图像中的像素点。

  5. 将缓冲区中选择的图像复制到原图像数据区。

编程实现:

clear; 
%清空工作区变量 
I = imread('cameraman.tif'); 
%读取待处理图像文件 
subplot(131),imshow(I),title(‘原图像’); 
%显示待处理图像文件 
image = rgb2gray(I); 
%将图片转换成灰度图像 
IMAGE1 = edge ( image ,’Prewitt’); 
%image 为将要进行边缘检测目标图像,所使用的方法是 Prewitt 算子,而阈值则是
由系统自适应生成的 
subplot(132),imshow(IMAGE1),title(‘Prewitt 算子’); 
%显示 Prewitt 自动阈值边缘检测效果图像 
IMAGE2 = edge ( image , ‘Prewitt’,0.05); 
% image 为将要进行边缘检测目标图像,所使用的方法是 Prewitt 算子,而阈值设置
为 0.05 
subplot(133),imshow(IMAGE2),title(‘Prewitt 算子 阈值 0.05’); 
%输出阈值为 0.05 的 Prewitt 算子,边缘检测处理后图像

处理效果对比图,如图

**Canny 边缘检测算子 **

1、基本理论

首先使用一定的方法来平滑图像,降低目标图像的噪声,在完成图像降噪处理之后,而后再计算、考察导数。使用一个成为信噪比(SNR)作为一个较为客观的评判标准,当然参数值越大越好。

  1. 高的定位精度。如果检测结果图像中的边缘点,与之对应的真实边缘点之间的距离越小,他们越接近,那么就可以说明该算法的定位精度就越高。

  1. 边缘响应次数最少。降低边缘检测处理时,多个像素对单一像素边缘发生响应这种情况发生的概率,也就是要尽量做到一个像素对该边缘产生响应。

Canny 算子流程图,如图:

实现效果图样例

边缘检测算法:

我是海浪学长,创作不易,欢迎点赞、关注、收藏、留言。

毕设帮助,疑难解答,欢迎打扰!

最后


本文转载自: https://blog.csdn.net/qq_37340229/article/details/128667363
版权归原作者 HaiLang_IT 所有, 如有侵权,请联系我们删除。

“毕业设计-基于 MATLAB 的图像边缘检测算法的研究和实现”的评论:

还没有评论