图像分割

目录

一、基本概念

1.什么是图像分割?

2.分类

二、点检测与线检测

1.点检测

2.线检测

三、边缘检测

3.1 区别“边缘”与“线”

3.2 什么是边缘检测?

3.3 图像边缘的分类

3.4 图像边缘的描述

3.5 图像边缘的判据

3.6 一阶微分边缘检测算子

3.7 二阶微分边缘检测算子

3.7.1 Canny 边缘检测

3.8 边缘检测MATLAB实现

四、基于灰度阈值的图像分割

4.1 全局阈值分割

4.1.1 数据拟合法选取阈值

4.1.2 基于误分率最小的阈值选取

4.1.3 迭代法选取阈值

4.1.4 OTSU算法选取阈值

4.2 多阈值分割


一、基本概念

1.什么是图像分割?

图像分割是指把图像分成各个具有相应特性的区域并提取出感兴趣的目标的技术和过程。

特性可以是灰度、颜色、纹理等;目标可以对应单个区域,也可以对应多个区域。

2.分类

  • 按幅度不同来分割各个区域:幅度分割
  • 按边缘来划分各个区域:边缘检测
  • 按形状不同来分割各个区域:区域分割

   灰度图像的分割通常基于图像亮度的两个基本特性:不连续性相似性。区域内部的像素一般具有灰度相似性,而区域之间的边界上一般具有灰度不连续性。

由此衍生出的图像分割方法有:间断检测、阈值分割法和区域分割法。

二、点检测与线检测

利用区域之间的不连续性分割涉及:

  • 间断检测——检测点、线和边缘
  • 边缘组装——组合成边界
  • 门限处理——在边缘检测时,需要定义区分不同区域的特征,那么特征值的分界点就是一个门限。

1.点检测

    利用如图所示模板,若|R|\geq T,则表明模板中心是一个孤立的点; 

    其中,R为滤波结果;T为非负阈值。

  • 如果一个孤立点与它周围的点不同,则可以使用该模板进行检测;
  • 如果模板相应R=0,则表示在灰度级上为常数的区域。
-1-1-1
-18-1
-1-1-1

点检测在MATLAB中的具体实现:

w=[-1 -1 -1;-1 8 -1;-1 -1 -1];
g=abs(imfilter(double(f),w);
T=max(g(:));   %可以视情况调整
g=g>=T;
figure;
imshow(g);title('点检测结果');

2.线检测

线检测需要考虑方向性,

水平
-1-1-1
222
-1-1-1

 

 

 

 

+45度
-1-12
-12-1
2-1-1

 

 

 

 

竖直
-12-1
-12-1
-12-1

 

 

 

 

-45度
2-1-1
-12-1
-1-12

 

 

 

 

MATLAB实现:

w=[2 -1 -1;-1 2 -1;-1 -1 2];

g=imfilter(double(f),w);
figure;
imshow(g,[]);title('线检测图像')

三、边缘检测

3.1 区别“边缘”与“线”

  • 边缘——图像局部区域特征不相同的那些区域间的分界线
  • 线——具有很小宽度的其中间区域具有相同的图像特征的边缘对

3.2 什么是边缘检测?

图像灰度发生跳变的地方是“边缘”;

基于灰度图像像素的灰度值在空间的不连续性对图像作出的一种分割。

3.3 图像边缘的分类

3.4 图像边缘的描述

  • 方向
  • 幅度

沿边缘走向方向,其幅度值变化较平缓,而沿垂直于边缘走向方向其幅度值变化较剧烈。

3.5 图像边缘的判据

边缘检测最常用的方法是检测亮度值的不连续性,这种不连续在数学上用一阶和二阶微分来刻画。

  1. 在边缘处,图像的一阶导数的幅度值较大,并在其附近形成一个峰值,其峰值的大小和极性反映了边缘点的强度和方向。
  2. 图像的二阶导数在边缘处取零值,且在零值的左右两侧分别存在极性相反的两个波峰;其波峰的大小和走向反映了边缘点的强度和方向。

3.6 一阶微分边缘检测算子

  1. 梯度算子
  2. Roberts算子
  3. Sobel算子
  4. Prewitt算子

3.7 二阶微分边缘检测算子

  1. 拉普拉斯算子
  2. LOG算子(马尔算子/墨西哥草帽)
  3. DOG算子
  4. canny边缘检测

3.7.1 Canny 边缘检测

1.Canny边缘检测的基本原理

  • 图像边缘检测必须满足的两个条件:(1)能有效地抑制噪声;(2)必须尽量精确确定边缘的位置
  • 根据对信噪比与定位乘积进行测度,得到最优化逼近算子;
  • 先平滑后求导数

2.什么才算是“最优边缘检测”?

  • 弱边缘也有强相应——算法应尽可能多地标识出图像中的实际边缘;
  • 良好的定位——标识出的边缘应尽可能接近实际图像中的边缘;
  • 一个边缘只有一次检测

3.Canny边缘检测算法的步骤

  • 去噪——使用高斯滤波器平滑图像;
  • 用一阶偏导的有限差分来计算梯度的幅值与方向;
  • 对梯度幅值进行非极大值抑制;(保证定位精确,且边缘足够细)
  • 使用双阈值算法检测和连接边缘。(保证边缘识别的准确率)

3.8 边缘检测MATLAB实现

BW=edge(I,method,threshold,direction,'nothinning');
BW=edge(I,method,threshold,direction,sigma);

其中,I为检测图像;BW为输出结果;method为检测算子类型('Canny','log','Prewitt','Roberts','Sobel','zerocross'等);

           threshold为阈值;direction用于指定图像的方向;'nothnning'表明不需要对图像进行细化处理;

           sigma用于指定LOG算子、Canny算子中的高斯核标准差。

clear;clc;close all
I=imread('circuit.tif');
subplot(221);
imshow(I);title('原图');

subplot(222);
BW1=edge(I,'Canny');
imshow(BW1);title('Canny算子检测结果');

subplot(223);
BW2=edge(I,'Prewitt');
imshow(BW2);title('Prewitt算子检测结果');

subplot(224);
BW3=edge(I,'log');
imshow(BW3);title('LOG算子检测结果');

Canny算子与LOG算子相比,其对细节的处理更好,不会将一些不属于边缘的干扰点算作边缘,而且所得边缘更连续。

四、基于灰度阈值的图像分割

  • 最简单的阈值分割是:首先按照一定准则确定阈值T,以此准则将原始图像f(x,y)分成目标和背景两个部分,设分割后的图像为g(x,y),则g(x,y)=\left\{\begin{matrix} b_0, & f(x,y)<T\\ b_1,&f(x,y)\geq T) \end{matrix}\right..
  • 阈值分割算法的核心就在于阈值的确定;
  • 依据阈值的不同选取方法,可分为全局阈值和局部阈值;
  • 全局阈值分割是利用全局信息对整幅图像求出最优分割阈值,可以是单阈值也可以是多阈值;
  • 局部阈值分割是把原始的整幅图像分成几个小的字图像,再对每个子图像应用全局阈值分割分别求最优分割阈值。

4.1 全局阈值分割

4.1.1 数据拟合法选取阈值

连续曲线拟合图像的灰度直方图,选取极小值点作为最优阈值;

极小值点满足:\frac{\partial h(z)}{\partial z}=0, \frac{\partial^{2}h(z)}{\partial x^{2}}>0.

该方法适用于具有良好双峰性质的图像,但需要用到数值逼近等运算,算法很复杂。

4.1.2 基于误分率最小的阈值选取

有时目标与背景的灰度值有部分交错,用一个全局阈值并不能将其分开,此时基于使图像误分割概率最小的原则选取最优阈值。

4.1.3 迭代法选取阈值

自适应获取全局阈值:

(1)求出图像的最大灰度值和最小灰度值,分别记为Z_{max}Z_{min}},令初始阈值T_0=(Z_{max}+Z_{min})/2;

(2)根据阈值T_K将图像分割为前景和背景,分别求出两者的平均灰度值ZO和ZB;

(3)求出新阈值T_{K+1}=(ZO+ZB)/2;

(4)若T_K=T_{K+1},则所得即为阈值;否则转(2)

对于直方图双峰明显、谷底较深的图像,迭代法可以较快收敛,但对直方图不明显或图像目标和背景比例差异悬殊的图像,迭代法不如OTSU算法。

I=imread('coins.png');
figure
subplot(121);
imshow(I);title('原图');
I=double(I);
T=(min(I(:))+max(I(:)))/2;
done=false;
i=0;
while ~done
    r1=find(I<=T);
    r2=find(I>T);
    Tnew=(mean(I(r1))+mean(I(r2)))/2;
    done=abs(Tnew-T)<1; %if T==Tnew?
    T=Tnew;
    i=i+1;
end
I(r1)=0;
I(r2)=1;
subplot(122);
imshow(I);title('分割结果');

4.1.4 OTSU算法选取阈值

又称最大类间方差阈值选择法,是一种自适应的阈值确定方法。按图像的灰度特性将图像分成背景和目标两部分,背景与目标之间的类间方差越大,说明构成图像的两部分的差别越大。当部分目标错分为背景或部分背景错分为目标时都会导致两部分的差别变小。因此,使用类间方差最大的分割,意味着错分概率最小。

I=imread('coins.png');
level=graythresh(I);
BW=im2bw(I,level);
subplot(121);
imshow(I);title('原图');
subplot(122);
imshow(BW);title('OTSU算法分割结果');

4.2 多阈值分割

  • 先将图片用与像素位置有关的一组阈值对图像各个部分进行分割;
  • 在各部分上采用全局阈值的方法进行图像分割。
I=imread('toyobjects.png');
figure
subplot(121);
imshow(I);title('原图');

thresh=multithresh(I,2);  %生成两个阈值
seg_I=imquantize(I,thresh);  %使用两个阈值分割图像
subplot(122);
imshow(seg_I,[]);title('分割结果');

 

 

 

  • 14
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
PyTorch是一个流行的深度学习框架,可以用于训练和部署图像分割模型。图像分割是将图像中的每个像素分类到特定的类别或分割区域的任务。在图像分割中,模型通过学习像素级别的特征来确定每个像素所属的类别或分割区域。 在PyTorch中,有许多用于图像分割的模型和库可供使用。例如,引用中提到的segmentation_models_pytorch库是一个优秀的图像分割库,它提供了许多常用的图像分割模型,如Unet、FPN、PSPNet等。这些模型在不同的数据集上进行了训练,并且可以根据实际需求进行微调或迁移学习。 具体来说,图像分割模型使用卷积神经网络(CNN)来提取图像中的特征,并使用这些特征来预测每个像素的类别或分割区域。常用的模型结构包括Unet、FCN、DeepLab等。这些模型通常由编码器和解码器组成。编码器负责提取图像的低级和高级特征,解码器则根据这些特征生成像素级别的预测结果。 训练图像分割模型通常需要大量的标注数据集,其中每个像素都有相应的标签。这些数据集可以包含多个类别,如引用中提到的21个类别,其中一个类别是背景类。模型通过将输入图像传递给网络,并使用与标签进行比较的损失函数来进行训练。训练过程中的优化器和学习率策略也会影响模型的性能。 在使用PyTorch进行图像分割时,通常需要进行数据预处理和增强操作,如引用中提到的albumentations库。这些操作可以提高模型的鲁棒性和泛化能力。 总结来说,图像分割是将图像中的每个像素分类到特定的类别或分割区域的任务。PyTorch是一款流行的深度学习框架,可以用于训练和部署图像分割模型。在PyTorch中,有许多优秀的图像分割库和模型可供使用,如segmentation_models_pytorch和albumentations。训练图像分割模型需要大量的标注数据集,并使用卷积神经网络来提取特征和预测每个像素的类别或分割区域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值