【计算机视觉】图像分割与特征提取——基于Roberts、Prewitt、Sobel算子的图像分割实验

article/2025/11/9 3:44:16

8420b26844034fab91b6df661ae68671.png

个人简介: 

> 📦个人主页:赵四司机
> 🏆学习方向:JAVA后端开发 
> ⏰往期文章:SpringBoot项目整合微信支付
> 🔔博主推荐网站:牛客网 刷题|面试|找工作神器
> 📣种一棵树最好的时间是十年前,其次是现在!
> 💖喜欢的话麻烦点点关注喔,你们的支持是我的最大动力。

前言:

实验中要求能够自行评价各主要算子在无噪声条件下和噪声条件下的分割性能。能够掌握分割条件(阈值等)的选择。完成规定图像的处理并要求正确评价处理结果,能够从理论上作出合理的解释。通过实验体会一些主要的分割算子对图像处理的效果,以及各种因素对分割效果的影响。

目录

一:相关概念

1.什么是边缘

2.边缘检测算法

(1)一阶梯度算子

(2)二阶导数

二:使用Roberts算子进行分割

1.实验原理

2.代码实现

3.实验分析

三:使用Prewitt算子进行分割 

1.实验原理

2.代码实现

3.实验分析

四: 使用Sobel算子进行分割

1.实验原理

2.代码实现

3.实验分析


一:相关概念

1.什么是边缘

        什么是边缘?相信很多人都能说出什么是边缘或者指出一幅图片中哪些是边缘,但是如何用计算机视觉相关概念描述出来呢?首先我们先观察一下边缘有什么特点,你会发现所有边缘与其相邻的区域有很大的颜色/灰度越变,我们就可以通过这个特点将边缘区分出来,进而就可以做到对图像的分割。

        对灰度图像的分割常可基于像素灰度值的2个性质:不连续性和相似性。 区域内部的像素一般具有灰度相似性,而在区域之间的边界上一般具有灰度不连续性。

2.边缘检测算法

(1)一阶梯度算子

  • Sobel算子
  • Prewitt算子
  • Roberts算子

(2)二阶导数

  • 拉普拉斯算子(对噪音敏感)

  • 高斯-拉普拉斯算子(LOG)(对图像先进行滤波再求导数)

二:使用Roberts算子进行分割

1.实验原理

        调入并显示图像room.tif(或room.png)中图像;使用Roberts 算子对图像进行边缘检测处理; Roberts 算子为一对模板:

        相应的矩阵为:rh = [0 1;-1 0]; rv = [1 0;0 -1];这里的rh 为水平Roberts 算子,rv为垂直Roberts 算子。分别显示处理后的水平边界和垂直边界检测结果;用“欧几里德距离”和“街区距离”方式计算梯度的模,并显示检测结果;对于检测结果进行二值化处理,并显示处理结果;

        提示:先做检测结果的直方图,参考直方图中灰度的分布尝试确定阈值;应反复调节阈值的大小,直至二值化的效果最为满意为止。分别显示处理后的水平边界和垂直边界检测结果;将处理结果转化为“白底黑线条”的方式;给图像加上零均值的高斯噪声;对于噪声图像重复以上步骤。

2.代码实现

function Roberts(I_in)figure(1),subplot(121),imshow(I_in),title('原图');[row,col] = size(I_in);I=double(I_in);I(:, size(I_in, 2) + 1) = 195;I(size(I_in, 1) + 1, :) = 195;g = zeros(row,col);g_x=zeros(row,col);  % 水平方向g_y=zeros(row,col);  % 垂直方向for i=1:rowfor j=1:colx=abs(I(i+1,j+1)-I(i,j));y=abs(I(i+1,j)-I(i,j+1));sum=x+y;g(i,j) = sum;g_x(i,j)=x;g_y(i,j)=y;endendNumPixel = zeros(1,400);  % 建立一个256列的行向量,以统计各灰度级的像素个数for i = 1 : rowfor j = 1 : colk = g(i,j);  % k是像素点(i,j)的灰度值NumPixel(k+1) = NumPixel(k+1) + 1;  % 对应灰度值像素点数量加1 endendfigure(2),bar(NumPixel);  % 灰度图像的直方图figure(1),subplot(122),imshow(g,[]),title('卷积结果');I2=g;for i = 1 : rowfor j = 1 : colif I2(i,j) < 80I2(i,j) = 1;elseI2(i,j) = 0;endendendfigure(3),subplot(121),imshow(g_x,[]),title('水平边界检测结果');figure(3),subplot(122),imshow(g_y,[]),title('垂直边界检测结果');figure,imshow(I2),title('二值化图像');
end

3.实验分析

图3.1-1 灰度分布直方图

图3.1-2 水平边界与垂直边界检测结果

图3.1-3 room原图与卷积结果

图3.1-4 结果二值化

图3.1-5 加入高斯噪声后灰度分布直方图

图3.1-6 水平边界与垂直边界检测结果

图3.1-7 room加入高斯噪声原图与卷积结果

图3.1-8 卷积结果二值化

分析:

        可以看到,进行卷积后得到的图像灰度值大多集中在0-25之间,这是因为图像中边缘部分占的信息比较少,而平滑部分信息较多,当在梯度较小的区域做梯度幅值计算时,得到的结果会接近于0。从水平边界检测和垂直边界检测结果来看(见图3.1-2),可以看到Roberts算子对正45度和负45度的边缘检测效果较明显,其中水平方向检测正45度方向,垂直方向检测负45度方向。要注意的是,实验中发现当用uint8类型的矩阵来存储结果时,由于uint8类型存储的是0-255之间的值,而计算结果会大于255,此时会将大于255的值置为255,会造成一些信息丢失,得到的结果也不明显。对于水平和垂直的边缘,两个方向的检测结果都基本一致。

        在对卷积结果进行二值化处理时,从灰度分布图中可以得到大概的最小值阈值(即该阈值往后的灰度分布较少),但是将这个值作为阈值得到的图像会有较多非边缘部分信息(如房顶部分),此时就需要增大阈值,以过滤这些非边缘信息。

        加入高斯噪声之后,可以看到灰度值分布呈现很明显的正态分布,得到的卷积结果不理想,无论怎么调整阈值,噪声都会造成很大的影响。假如阈值过小,噪声会覆盖掉边缘信息,噪声过大则会将边缘部分过滤。罗伯特算法对于噪声较多的图片处理效果较差。

三:使用Prewitt算子进行分割 

1.实验原理

Prewitt算子的模板大小为3*3,其X方向和Y方向偏导数分别为:

梯度计算公式:

2.代码实现

function Prewitt(I_in)figure(1),subplot(121),imshow(I_in),title('原图');[row,col] = size(I_in);I=ones(row+2,col+2);for i=2:row+1for j=2:col+1I(i,j)=I_in(i-1,j-1);endendg = zeros(row,col);g_x=zeros(row,col);  % 水平方向g_y=zeros(row,col);  % 垂直方向for i=2:row+1for j=2:col+1x=abs(I(i-1,j-1)+I(i,j-1)+I(i+1,j-1)-(I(i-1,j+1)+I(i,j+1)+I(i+1,j+1)));y=abs(I(i-1,j-1)+I(i-1,j)+I(i-1,j+1)-(I(i+1,j-1)+I(i+1,j)+I(i+1,j+1)));sum=x+y;g(i-1,j-1) = sum;g_x(i-1,j-1)=x;g_y(i-1,j-1)=y;endendg(1,:) = 1;g(row,:) = 1; g(:,1) = 1;g(:,col) = 1;NumPixel = zeros(1,1000);  % 建立一个256列的行向量,以统计各灰度级的像素个数for i = 1 : rowfor j = 1 : colk = g(i,j);  % k是像素点(i,j)的灰度值NumPixel(k+1) = NumPixel(k+1) + 1;  % 对应灰度值像素点数量加1 endendfigure(2),bar(NumPixel);  % 灰度图像的直方图figure(1),subplot(122),imshow(g,[]),title('卷积结果');I2=g;for i = 1 : rowfor j = 1 : colif I2(i,j) < 100I2(i,j) = 1;elseI2(i,j) = 0;endendendfigure(3),subplot(121),imshow(g_x,[]),title('水平边界检测结果');figure(3),subplot(122),imshow(g_y,[]),title('垂直边界检测结果');figure,imshow(I2),title('二值化图像');
end

3.实验分析

图3.2-1 灰度值分布图

图3.2-2 水平与垂直边界检测结果

图3.2-3 原图与卷积结果

图3.2-4 卷积结果二值化

图3.2-5 加入高斯噪声后卷积结果灰度分布图

图3.2-6 加入高斯噪声后水平边界和垂直边界检测结果

图3.2-7 加入高斯噪声后原图及卷积结果

图3.2-8 卷积结果二值化

分析:

        相较于Roberts算子,Prewitt算子采用的是3*3的模板,因此需要处理图像边界问题,在Roberts算子中我处理边界的方式是在最后一列和最后一行添加一个普遍像素值195,在Prewitt算子中由于选取得是模板中心位置,所以需要再图像像素矩阵四周添加像素点,我选择的是在四周添加1。在横向和纵向的边缘检测Prewitt算子要比Roberts算子要强,从图3.2-2中可以看到,Prewitt算子的x方向检测主要检测纵向边缘信息,y方向主要检测横向边缘信息,对于斜边的检测两个方向基本一致。从图3.2-4中可以看到,Prewitt算子的边缘检测能力要比Roberts算子要强,在一些细节方面Prewitt算子保留得更到位,Roberts算子会造成一些边缘信息的丢失,特别是灰度变化梯度较小的区域。

        在处理带噪声的图片上,由于Prewitt算子采用了3*3的模板,其对噪声的处理能力也更强,相较于图3.1-8,图3.2-8的处理效果更好,在去除了部分的噪声后边缘信息仍能看出来,但是噪声还是很明显。

四: 使用Sobel算子进行分割

1.实验原理

Sobel算子考察它上下、左右邻点灰度的加权差。与之接近的邻点的权重:

用卷积模板来实现:

Sobel算子结合了高斯平滑和微分求导,相当于先做了平滑再做边缘提取,有抑制噪声的作用。

另一个角度:Sobel算子在Prewitt算子的基础上增加了权重的概念认为相邻点的距离远近对当前像素点的影响是不同的,距离越近的像素点对应当前像素的影响越大,从而实现图像锐化并突出边缘轮廓。 

2.代码实现

function Sobel(I_in)figure(1),subplot(121),imshow(I_in),title('原图');[row,col] = size(I_in);I=ones(row+2,col+2);for i=2:row+1for j=2:col+1I(i,j)=I_in(i-1,j-1);endendg = zeros(row,col);g_x=zeros(row,col);  % 水平方向g_y=zeros(row,col);  % 垂直方向for i=2:row+1for j=2:col+1x=abs(I(i-1,j-1)+2*I(i,j-1)+I(i+1,j-1)-(I(i-1,j+1)+2*I(i,j+1)+I(i+1,j+1)));y=abs(I(i-1,j-1)+2*I(i-1,j)+I(i-1,j+1)-(I(i+1,j-1)+2*I(i+1,j)+I(i+1,j+1)));sum=x+y;g(i-1,j-1) = sum;g_x(i-1,j-1)=x;g_y(i-1,j-1)=y;endendg(1,:) = 1;g(row,:) = 1; g(:,1) = 1;g(:,col) = 1;NumPixel = zeros(1,1500);  % 建立一个256列的行向量,以统计各灰度级的像素个数for i = 1 : rowfor j = 1 : colk = g(i,j);  % k是像素点(i,j)的灰度值NumPixel(k+1) = NumPixel(k+1) + 1;  % 对应灰度值像素点数量加1 endendfigure(2),bar(NumPixel);  % 灰度图像的直方图figure(1),subplot(122),imshow(g,[]),title('卷积结果');I2=g;for i = 1 : rowfor j = 1 : colif I2(i,j) < 280I2(i,j) = 1;elseI2(i,j) = 0;endendendfigure(3),subplot(121),imshow(g_x,[]),title('水平边界检测结果');figure(3),subplot(122),imshow(g_y,[]),title('垂直边界检测结果');figure,imshow(I2),title('二值化图像');
end

3.实验分析

图3.3-1 Sobel算子处理结果灰度分布直方图

图3.3-2 水平边界和垂直边界检测结果

图3.3-3 room原图及Robel算子处理结果

图3.3-4 二值化结果

图3.3-5 加入高斯噪声后图像灰度分布图

图3.3-6 加入高斯噪声后水平及垂直边界检测结果

图3.3-7 加入高斯噪声后原图及卷积化结果

图3.3-8 二值化结果

分析:

        对于Sobel算子,其原理与Prewitt算子基本一致,不同的是Sobel算子Sobel算子在Prewitt算子的基础上增加了权重的概念认为相邻点的距离远近对当前像素点的影响是不同的,距离越近的像素点对应当前像素的影响越大,从而实现图像锐化并突出边缘轮廓。其结合了高斯平滑和微分求导,相当于先做了平滑再做边缘提取,有抑制噪声的作用。在不添加噪声的情况下,可以看到Sobel算子的处理效果与Prewitt算子基本一致,但是加入高斯噪声之后,可以看到明显的差别,Sobel算子对噪声具有平滑作用,其边缘信息相较于Prewitt算子更清晰。


http://chatgpt.dhexx.cn/article/r1LyNTxK.shtml

相关文章

边缘检测——Prewitt算子

垂直水平方向边缘 垂直水平方向的Prewitt算子是可分离的卷积核。 45、135方向边缘 算子不可分割。 缺点 没有充分利用边缘的梯度方向最后输出的边缘二值图&#xff0c;只是简单地利用阈值进行处理。如果阈值过大&#xff0c;则会损失很多边缘信息&#xff1b;如果阈值过…

数字图像处理(19): 边缘检测算子(Roberts算子、Prewitt算子、Sobel算子 和 Laplacian算子)

目录 1 边缘检测的基本原理 2 边缘检测算子分类 3 梯度 3.1 图像梯度 3.2 梯度算子 4 Roberts 算子 4.1 基本原理 4.2 代码示例 5 Prewitt 算子 5.1 基本原理 5.2 代码示例 6 Sobel 算子 6.1 基本原理 6.2 代码示例 7 Laplacian 算子 7.1 基本原理 7.2 代码示…

python数字图像处理——边缘检测算子(Laplacian算子、Roberts算子、Prewitt算子和Sobel算子)

1.Laplacian算子 拉普拉斯&#xff08;Laplacian&#xff09;算子是n维欧几里德空间中的一个二阶微分算子&#xff0c;常用于图像增强领域和边缘提取。它通过灰度差分计算邻域内的像素&#xff0c;基本流程是&#xff1a;判断图像中心像素灰度值与它周围其他像素的灰度值&…

Prewitt算子边缘检测原理及实现

写在前面 Prewitt算子同样也是一种一阶微分算子&#xff0c;利用像素点上下左右邻点灰度差&#xff0c;在边缘处达到极值检测边缘&#xff0c;对噪声具有平滑的作用。 原理 其原理是在图像空间利用两个方向模板与图像进行邻域卷积来完成的&#xff0c;这两个方向模板一个检测…

Prewitt和Sobel算子

在3*3模板中&#xff1a; 我如下定义水平、垂直和两对角线方向的梯度&#xff1a; 该定义下的算子称之为Prewitt算子&#xff1a; Sobel算子是在Prewitt算子的基础上改进的&#xff0c;在中心系数上使用一个权值2&#xff0c;相比较Prewitt算子&#xff0c;Sobel模板能够较好…

Prewitt边缘检测算子

Prewitt算子也是一种一阶微分算子&#xff0c;用于边缘检测。与Robert使用22的模板不同&#xff0c;Prewitt算子使用的是33的模板&#xff0c;利用像素点上下、左右邻点的灰度差来检测边缘&#xff0c;故其边缘检测结果在水平方向和垂直方向均比Robert算子更加明显。 其数学表…

图像边缘检测之Prewitt算子

Prewitt 算子 1. 原理 Prewitt算子是一种图像边缘检测的微分算子&#xff0c;其原理是利用特定区域内像素灰度值产生的差分实现边缘检测。由于Prewitt算子采用 3x3 模板对区域内的像素值进行计算&#xff0c;而Robert算子的模板为 2x2&#xff0c;故Prewitt算子的边缘检测结果…

华为--配置本地环回接口地址

该实验紧接上一节实验 网络拓扑图如下 AR1环回接口配置 AR2环回接口配置 AR3环回接口配置 配置AR1回环接口路由 配置AR2回环接口路由 配置AR3回环接口路由 在AR1上测试回环接口的连通性 在AR2上测试回环接口的连通性 在AR3上测试回环接口的连通性 测试成功 转载于:https://my.o…

【LINUX】ifconfig只有本地环回地址问题的解决方法

问题描述&#xff1a; ifconfig只有lo&#xff0c;没有看到ens33 ifconfig -a看到了ens33&#xff0c;但是没有地址 解决方法&#xff1a; &#xff08;1&#xff09;stop network-manager sudo service network-manager stop &#xff08;2&#xff09;删除旧有的网络配置…

怎么判断一个ipv4地址是 私有地址,环回地址,实验地址,TEST-NET地址,本地链路地址?

问题的提出&#xff1a; 理论讲解(黄色的为上题的答案&#xff09;&#xff1a; IP地址分为五类&#xff1a; A类保留给政府机构&#xff0c;B类分配给中等规模的公司&#xff0c;C类分配给任何需要的人&#xff0c;D类用于组播&#xff0c;E类用于实验&#xff0c;各类可容纳…

回环地址 127.0.0.1

控制台输入ping 127.0.0.1。 $ ping 127.0.0.1 PING 127.0.0.1 (127.0.0.1): 56 data bytes 64 bytes from 127.0.0.1: icmp_seq0 ttl64 time0.080 ms 64 bytes from 127.0.0.1: icmp_seq1 ttl64 time0.093 ms 64 bytes from 127.0.0.1: icmp_seq2 ttl64 time0.074 ms 64 byte…

环回接口 环回地址 环回路由

网络协议的数据链路层的一些重点我们来讲解一下。这此我们主要讲解的是环回接口的问题。环回接口&#xff08;loopback&#xff09;:路由器上的一个逻辑、虚拟接口.路由器默认没有任何环回接口.此接口允许运行在同一台主机上的客户程序和服务器程序通过TCP/IP进行通信.一般系统…

什么是环回接口(Loopback Interface、环回地址)

2.7 环回接口 大多数的产品都支持环回接口&#xff08;Loopback Interface&#xff09;&#xff0c;以允许运行在同一台主机上的客户程序和服务器程序通过TCP/IP进行通信。 A类网络号 127就是为环回接口预留的。根据惯例&#xff0c;大多数系统把 IP地址127.0.0.1分配给这个接…

特殊IP地址——环回地址

环回地址&#xff08;Loopback Address&#xff09;127.0.0.1---127.255.255.254 是一种特殊的 IP 地址&#xff0c;它允许计算机的软件组件在本地主机上进行网络通信&#xff0c;也称作本地回环地址。 在计算机网络中&#xff0c;环回地址是一个虚拟地址&#xff0c;它不属于任…

“谁告诉你环回地址就是127.0.0.1?” “老师就是这么说的。”

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「专栏简介」&#xff1a;此文章已录入专栏《计算机网络零基础快速入门》 环回地址是本地的「虚拟接口」&#xff0c;默认不会宕掉。 我们经…

带头结点单链表、不带头结点单链表(头指针单链表)

1、头结点和头指针的区别 1.1区别&#xff1a; 头指针表明了链表的结点&#xff0c;可以唯一确定一个单链表。 头指针指向链表的第一个结点&#xff0c;其记录第一个存储数据的结点的地址。 头结点是点链表的第一个结点&#xff0c;若单链表有头结点&#xff0c;则头指针指向头…

不带头结点的单链表------C语言实现

1 /****************************************************/ 3 File name&#xff1a;no_head_link.c4 Author&#xff1a;SimonKly Version:0.1 Date: 2017.5.205 Description&#xff1a;不带头节点的单链表6 Funcion List: 7 ***************************************…

单链表的头结点的作用

问题&#xff1a;在单链表中使用“头结点”&#xff0c;这个哑结点始终是链表的第一个元素&#xff0c;这个技巧的利与弊&#xff1f; 链表中第一个结点的存储位置叫做头指针&#xff0c;那么整个链表的存取就必须从头指针开始进行了。之后的每一个结点&#xff0c;其实就是上…

【数据结构】单链表之带头结点的单链表

一、单链表相关知识点介绍&#xff1a; 1. 结点&#xff1a;结点就是单链表中研究的数据元素&#xff0c;结点中存储数据的部分称为数据域&#xff0c;存储直接后继地址的部分称为指针域。 2. 头结点&#xff1a;引入头结点的目的是&#xff0c;将链表首元结点的插入和删除操作…

【链表】带头节点和不带头节点单链表的区别

目录 &#x1f354;当链表的结点只包含一个指针域时&#xff0c;叫做单链表 &#x1f354;不论带不带头节点&#xff0c;所有的链表都要有个头指针&#xff01; &#x1f35f;带头结点的链表的头指针指向的是头结点&#xff0c;头结点的指针域指向首元结点 &#x1f35f;不带…