实验5 图像分割

news2025/2/24 11:20:58

1. 实验目的

①掌握图像分割的含义与目的;
②掌握迭代法、最大类间方差法、直方图法等阈值分割方法;
③掌握霍夫变换、区域生长法、区域分裂与合并法的原理,并能编程实现。

2. 实验内容

①调用Matlab / Python+OpenCV中的相关函数,分别通过实验法、直方图法、大津算法确定阈值,实现图像的全局阈值分割。
②调用Matlab / Python+OpenCV中的霍夫变换函数,检测图像中的直线和圆。
③自行编写代码,实现区域生长法及区域分裂与合并算法。

3. 实验过程

3.1 全局阈值分割
3.1.1迭代法

初始化一个阈值,通过迭代法求出最佳阈值,使用最佳阈值对图像进行分割,并显示原图和分割结果(参考图1)。
(1) 主要调用的函数、功能及参数说明

函数名函数功能参数说明
imread(A)读取图片A:图片在文件夹的位置
rgb2gray(A)灰度转化A:图片
mean(A)求列或行的平均数A:矩阵
mean2(image)对整一个矩阵求像素平均值image:图片
find(A)查找非零元素的索引和值A:查找条件
abs(A)返回数组A中每个元素的绝对值和复数的模A:矩阵
(2) 源代码及实验结果(添加必要注释)
A= imread('lena.png');
image=rgb2gray(A);%灰度转化
T=mean2(image);%取均值作为初始阈值
done=false;%定义跳出循环的量
 
i=0;
%while循环进行迭代
while ~done
    r1=find(image<=T);%小于阈值的部分
    r2=find(image>T);%大于阈值的部分
    Tnew=(mean(image(r1))+mean(image(r2)))/2;%计算分割后两部分的阈值均值的均值
    done=abs(Tnew-T)<1;%判断迭代是否收敛
    T=Tnew;%如不收敛,则将分割后的均值的均值作为新的阈值进行循环计算
    i=i+1;
end
%这两步是将图像转换成二值图像
image(r1)=0;%将小于阈值的部分赋值为0
image(r2)=1;%将大于阈值的部分赋值为1   
 
subplot(121);imshow(A);title('原图')
subplot(122);imshow(image,[]);title('迭代处理后')

在这里插入图片描述
(3) 总结(总结实验法步骤,对实验结果进行分析)
当目标与背景的面积相差较大时,更好地选择是将初始阈值T设置为最大灰度值和最小灰度值的中间值。

3.1.2最大类间方差法

使用最大类间方差法求出最佳阈值后,使用最佳阈值对图像进行分割,并显示原图和分割结果(参考图2)
(1) 主要调用的函数、功能及参数说明

函数名函数功能参数说明
graythresh采用OTSU算法来获取全局阈值,自动选取阈...

(2) 源代码及实验结果(添加必要注释)

I = imread('lena.png');
T = graythresh(I); %采用OTSU算法来获取全局阈值,自动选取阈值
K = im2bw(I, T);%二值化
figure;
subplot(121), imshow(I);title('原图')
subplot(122), imshow(K);title('最大类间方差法')

在这里插入图片描述
(3) 总结(总结最大类间差分算法步骤,对实验结果进行分析)
最大类间差分算法是根据图像的灰度特性,将图像分为前景和背景两个部分。当取最佳阈值时,两部分之间的差别应该是最大的,前景和背景之间的类间方差如果越大,就说明构成图像的两个部分之间的差别越大。

3.1.3直方图法

首先得到图像的直方图,选出最佳阈值后,使用最佳阈值对图像进行分割,并显示原图和分割结果(参考下图)。

在这里插入图片描述
(1) 主要调用的函数、功能及参数说明

函数名函数功能参数说明
imread(A)读取图片A:图片在文件夹的位置
rgb2gray(A)灰度转化A:图片

(2) 源代码及实验结果(添加必要注释)

A = imread('lena.png');
image=rgb2gray(A);%灰度转化
 
[m,n]=size(image);%测量图像尺寸参数
GK=zeros(1,256); %预创建存放灰度出现概率的向量
for k=0:255
     GK(k+1)=length(find(image==k))/(m*n);%计算每级灰度出现的概率,将其存入GK中相应位置
end
 
subplot(2,2,1);imshow(image);title('灰度图像')
grid on;%显示网格线
axis on;%显示坐标系
 
subplot(2,2,2),bar(0:255,GK,'g')%绘制直方图
title('灰度直方图')
xlabel('灰度值')
ylabel(' 出现概率')
 
image2=im2bw(A,150/255);
subplot(2,2,3),imshow(image2);title('阈值150的分割图像')
grid on;
axis on;
 
image3=im2bw(A,200/255);
subplot(2,2,4),imshow(image3);title('阈值200的分割图像')
grid on;
axis on;

在这里插入图片描述
(3) 总结(总结直方图法步骤,对实验结果进行分析)
图像分割是图像识别的基础,对图像进行图像分割,将目标从背景区域中分离出,可以避免图像识别时在图像上进行盲目的搜索,大大提高图像识别的效率以及识别准确率。基于灰度直方图的阈值分割计算简单,适用于目标与背景分布于不同灰度范围的灰度图像,特别是遥感图像。

3.2 霍夫变换
3.2.1 调用霍夫变换函数检测直线和圆

如下图所示,调用 Matlab/Python+OpenCV中的霍夫变换函数,检测图像中的直线和圆。

在这里插入图片描述
(1) 主要调用的函数、功能及参数说明

函数名函数功能参数说明
imread(A)读取图片A:图片在文件夹的位置

(2) 源代码及实验结果(添加必要注释)

①直线检测代码及实验结果:

A= imread('lena.png');

I=rgb2gray(A);%灰度转化
 
BW = edge(I,'canny');%Canny方法提取图像边界,返回二值图像(边界1,否则0)
[H,T,R] = hough(BW);%计算二值图像的标准霍夫变换,H为霍夫变换矩阵,I,R为计算霍夫变换的角度和半径值
P = houghpeaks(H,3);%提取3个极值点
x = T(P(:,2)); 
y = R(P(:,1));
lines=houghlines(BW,T,R,P);%提取线段
 
subplot(1,2,1);imshow(A);title('原图')
subplot(1,2,2);imshow(I);title('直线检测')
hold on;
 
for k = 1:length(lines)
xy = [lines(k).point1; lines(k).point2];
plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');%画出线段
plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');%起点
plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');%终点
end

在这里插入图片描述
②圆形检测代码及实验结果:

rgb= imread('lena.png');
image = rgb2gray(rgb);
imshow(image)

d = imdistline(gca);
delete(d)
[centersBright,radiiBright,metricBright] = imfindcircles(rgb,[55 90],'ObjectPolarity','dark','Method','TwoStage','Sensitivity',0.94,'EdgeThreshold',0.1);
hBright = viscircles(centersBright, radiiBright,'Color','b');
b=length(radiiBright);
total_number=b;

在这里插入图片描述
③总结(总结霍夫变换检测步骤,并对实验结果进行分析)
霍夫变换的过程是在一个参数空间中通过计算累计结果的局部最大值得到一个符合该特定形状的集合作为霍夫变换结果,该方法可以进行圆,直线,椭圆等形状的检测。

3.2.2 实现极坐标系下的霍夫变换(参考图5,6)

在这里插入图片描述
⑴ 源代码及实验结果(添加必要注释)

A= imread('lena.png');
I=rgb2gray(A);%灰度转化
 
BW = edge(I,'canny');%Canny方法提取图像边界,返回二值图像(边界1,否则0)
[H,T,R] = hough(BW);%计算二值图像的标准霍夫变换,H为霍夫变换矩阵,I,R为计算霍夫变换的角度和半径值
 
subplot(1,2,1);imshow(A);title('原图')
subplot(1,2,2);imshow(H,[],'XData',T,'YData',R,'InitialMagnification','fit');%hough变换的图像
title('霍夫变换结果')
xlabel('\theta'), ylabel('\rho');
axis on,axis square,hold on;

在这里插入图片描述
⑵ 总结(总结极坐标下霍夫变换步骤,对实验结果进行分析)
图像x−yx−y坐标空间中,经过点(xi,yi)(xi,yi)的直线表示为:yi=axi+b(1),yi=axi+b(1)。其中,参数a为斜率,b为截矩。其中,参数a为斜率,b为截矩。通过点(xi,yi)点(xi,yi)的直线有无数条。变换到了参数平面a−ba−b。这个变换就是直角坐标中对于(xi,yi)(xi,yi)点的Hough变换。

3.3 区域生长法

分别使用不同生长准则实现区域生长算法(参考图7)
在这里插入图片描述
⑴ 源代码及实验结果(添加必要注释及结果图)

I=imread('lena.png');
 
if isinteger(I)
    I=im2double(I);
end
I = rgb2gray(I);
 
figure 
imshow(I)
[M,N]=size(I);
[y,x]=getpts; %单击取点后,按enter结束
x1=round(x);
y1=round(y);
seed=I(x1,y1); %获取中心像素灰度值
 
J=zeros(M,N);
J(x1,y1)=1;
 
count=1; %待处理点个数
threshold=0.15;
while count>0
    count=0;
    for i=1:M %遍历整幅图像
    for j=1:N
        if J(i,j)==1 %点在“栈”内
        if (i-1)>1&(i+1)<M&(j-1)>1&(j+1)<N %3*3邻域在图像范围内
            for u=-1:1 %8-邻域生长
            for v=-1:1
                if J(i+u,j+v)==0&abs(I(i+u,j+v)-seed)<=threshold
                    J(i+u,j+v)=1;
                    count=count+1;  %记录此次新生长的点个数
                end
            end
            end
        end
        end
    end
    end
end
 
subplot(1,2,1),imshow(I);title('原图')
subplot(1,2,2),imshow(J);title('区域生长实现')

在这里插入图片描述

4. 实验小结

①分析和总结全局阈值分割的几种实验结果,能够得到哪些启发或结论?
答:在上面的图像分割中,通过不同的阈值处理方法,得到良好的图像分割结果。不难发现, 对于不同的噪声环境和光照影响等等,一种单一的阈值分割方法往往无法出色的完成任务。
在今后的实验中,要合理的根据自己的图像样本来选择合理的算法。例如是否需要对图像进行平滑去噪,是否需要图像分区来使光照近似均匀。不仅要掌握上面的处理方法,也明白了为什么对上面的图像进行这样的处理和分析。
②当图片过曝或者过暗造成霍夫变换检测效果不理想时,可以采用哪些图像处理方法提升效果?
答:依赖直方图来调整图像强度值
③查阅相关资料,了解更多的图像分割方法,并从原理和结果等方面对比它们之间的异同。
答:
(1)基于阚值的分割方法是按照原图像的灰度特征划分出一个或者几个灰度阈值将原图像的每个像素的灰度值与灰度阈值进行比较,继而确定每个像素应该位于哪个区域。
(2)基于边缘的图像分割
边缘是指一个区域的结束与另一个区域的开始,也就是说图像边缘代表的是两个不同的区域边界线上的一些像素的集合,它一般代表着图像的灰度、纹路、颜色发生了一些突变,是图像局部特征不连续的体现。基于边缘的图像分割方法一般是基于图像灰度值检测的分割方法,即图像边缘是图像灰度值发生突变的一个转折,图像边缘有两个要素:幅度与方向。沿着边缘的方向,灰度值的变化比较小,垂直于边缘的方向,灰度值的变化比较大。因此我们可以对像素的灰度值进行求导来判断图像的边缘。
(3)基于区域的分割方法
区域生长指的是根据同一区域内像素具有一些相似的性质(灰度值、纹路、颜色)来聚集像素点的一种方法。我们可以从一个像素或者是一块很小的区域开始,将周围具有相同性质的像素或者区域划入到目前的区域当中,直到没有其他的像素或者是区域能够划入到当前区域为止,以此来实现区域不断增长的过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1881187.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据库】PostgreSQL数据库设计说明书(编制参考)

数据库设计说明书要点应包含&#xff1a;项目概述、数据库选型、逻辑设计、物理设计、数据安全与性能。简述项目需求与背景&#xff0c;选择适当的数据库系统&#xff0c;明确数据表结构、关系及索引设计&#xff0c;描述存储过程、触发器等逻辑组件。同时&#xff0c;强调数据…

使用 fvm 管理 Flutter 版本

文章目录 Github官网fvm 安装Mac/Linux 环境Windows 环境 fvm 环境变量fvm 基本命令 Github https://github.com/leoafarias/fvmhttps://github.com/flutter/flutter 官网 https://fvm.app/ fvm 安装 Mac/Linux 环境 Install.sh curl -fsSL https://fvm.app/install.sh …

探索ChatGPT是如何改变癌症护理

了解生成式人工智能&#xff08;尤其是 ChatGPT&#xff09;如何通过高级数据集成和个性化患者管理来增强诊断和治疗&#xff0c;从而改变癌症治疗。了解 Color Health 的创新副驾驶模型及其对早期检测和患者结果的影响。 近年来&#xff0c;人工智能与医疗保健的融合为癌症治疗…

Springboot ResourceLoader获取指定package目录下所有的类(get class in jar on Linux)

get class in jar on Linux Springboot ResourceLoader获取指定package目录下所有的类 PathMatchingResourcePatternResolver resolver new PathMatchingResourcePatternResolver();String pattern ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX ClassUtils.convertClas…

远程过程调用PRC

简介 远程过程调用&#xff08;Remote Procedure Call, RPC)&#xff0c;是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一个地址空间的子程序&#xff0c;且不需要考虑交互作用的细节。 RPC是一种服务器&#xff0c;客户端模式&#xff0c;是一个通过发送请…

[2024-6-30]如何获取OpenAI API Key/OpenAI密钥

一、前言 由于官网页面更新&#xff0c;获取路径与之前有所不同。 二、获取路径 1.点击Products&#xff0c;再点击API login 2.点击API 3. 如果需要登录&#xff0c;则登录 4.点击API keys&#xff0c;再点击Create new secret key

基于机器学习的制冷系统过充电和欠充电故障诊断(采用红外热图像数据,MATLAB)

到目前为止&#xff0c;制冷系统故障诊断方法已经产生很多种&#xff0c;概括起来主要有三大类&#xff1a;基于分析的方法&#xff0c;基于知识的方法和基于数据驱动的方法。基于分析的方法主要获得制冷系统的数学模型&#xff0c;通过残差来检测和诊断故障。如果存在残差且很…

LeetCode 1527, 54,114

目录 1527. 患某种疾病的患者题目链接表要求知识点思路代码 54. 螺旋矩阵题目链接标签思路代码 114. 二叉树展开为链表题目链接标签前序遍历思路代码 前驱思路代码 1527. 患某种疾病的患者 题目链接 1527. 患某种疾病的患者 表 表Patients的字段为patient_id、patient_name…

InnoDB 表空间1---独立表空间

表空间是一个抽象的概念&#xff0c;对于系统表空间来说&#xff0c;对应着文件系统中一个或多个实际文件&#xff1b;对于每个独立表空间来说&#xff0c;对应着文件系统中一个名为表名.ibd的实际文件。大家可以把表空间想象成被切分为许许多多个页的池子&#xff0c;当我们想…

香港回归庆典开序幕,蝴蝶效应集团齐献礼

6月29日,香港各界庆典委员会庆祝香港回归祖国27周年活动启动礼在维多利亚公园举行。香港特区行政长官李家超、中央政府驻港联络办主任郑雁雄、香港各界庆典委员会主席谭锦球和筹委会主席陈鸿道等出席并致辞。 作为香港物流行业推广的领军企业,香港蝴蝶效应集团也以优秀企业代表…

SSH 无密登录配置流程

一、免密登录原理 非对称加密&#xff1a; 由于对称加密的存在弊端&#xff0c;就产生了非对称加密&#xff0c;非对称加密中有两个密钥&#xff1a;公钥和私钥。公钥由私钥产生&#xff0c;但却无法推算出私钥&#xff1b;公钥加密后的密文&#xff0c;只能通过对应的私钥来解…

Redux实现Token持久化

业务背景: Token数据具有一定的时效时间&#xff0c;通常在几个小时&#xff0c;有效时间内无需重新获取&#xff0c;而基于Redux的存储方式又是基于内存的&#xff0c;刷新就会丢失&#xff0c;为了保持持久化&#xff0c;我们需要单独做处理 解决方案&#xff1a; 使用redu…

redis实战-短信登录

基于session的登录流程 session的登录流程图 1. 发送验证码 用户在提交手机号后&#xff0c;会校验手机号是否合法&#xff0c;如果不合法&#xff0c;则要求用户重新输入手机号 如果手机号合法&#xff0c;后台此时生成对应的验证码&#xff0c;同时将验证码进行保存&#x…

No module named ‘MySQLdb‘

python 运行代码的时候遇到No module named ‘MySQLdb’报错如何解决&#xff1f; 解决办法 如果没有安装可以先安装以下依赖库 pip install PyMySQL如果已经安装了PyMySQL&#xff0c;仍然报MySQLdb模块找不到&#xff0c;可以尝试安装以下依赖库。 pip install mysqlclient

LNMP架构搭建Discuz论坛

LNMP架构是一种用于搭建Web服务器环境的常用架构&#xff0c;由Linux、Nginx、MySQL和PHP组成 组成功能Linux作为操作系统的基础&#xff0c;提供稳定的环境Nginx作为反向代理服务器&#xff0c;处理客户端的请求并将他们转发给后端的应用服务器MySQL作为关系型数据库管理系统…

【驱动篇】龙芯LS2K0300之i2c设备驱动

实验背景 由于官方内核i2c的BSP有问题&#xff08;怀疑是设备树这块&#xff09;&#xff0c;本次实验将不通过设备树来驱动aht20&#xff08;i2c&#xff09;模块&#xff0c;大致的操作过程如下&#xff1a; 模块连接&#xff0c;查看aht20设备地址编写device驱动&#xff…

力扣931. 下降路径最小和

Problem: 931. 下降路径最小和 文章目录 题目描述思路复杂度Code 题目描述 思路 1.定义状态&#xff1a;我们定义dp[i][j]为从矩阵的第一行到达位置(i, j)的最小下降路径和。 2.初始化状态&#xff1a;对于矩阵的第一行&#xff0c;即i 0时&#xff0c;dp[0][j]就是矩阵的第一…

ESP8266[ 关于-巴发云MQTT/TCP:arduino 设置回调函数 ] 日志2024/6/29

ESP8266 [ 关于-巴发云MQTT/TCP:arduino 设置回调函数 ] 日志2024/6/29 arduino库:#include <PubSubClient.h> 回调函数 是其库设置好的 可以改名字 这里只写上关键代码 设置客户端为 A 关键代码: A.setCallback(回调名) //MQTT 回调处理mqttmsgg(自定义…

光速入门 Tailwind CSS

文章目录 入门安装IDE 设置使用预编译器生产环境优化 基础概念分层指令tailwindlayerapplyconfig 函数theme()screen() 基础案例怎么设置属性任意值&#xff1f;hover 父元素时&#xff0c;怎么选中子元素添加样式&#xff1f;添加 animation 动画 配置主题 Tailwind CSS 中文网…

Unity 数据持久化【PlayerPrefs】

1、数据持久化 文章目录 1、数据持久化PlayerPrefs基本方法1、PlayerPrefs概念2、存储相关3、读取相关4、删除数据思考 信息的存储和读取 PlayerPrefs存储位置1、PlayerPrefs存储的数据在哪个位置2、PlayerPrefs 数据唯一性思考 排行榜功能 2、Playerprefs实践1、必备知识点-反…