目录
一、基本概念
1.什么是图像分割?
图像分割是指把图像分成各个具有相应特性的区域并提取出感兴趣的目标的技术和过程。
特性可以是灰度、颜色、纹理等;目标可以对应单个区域,也可以对应多个区域。
2.分类
- 按幅度不同来分割各个区域:幅度分割
- 按边缘来划分各个区域:边缘检测
- 按形状不同来分割各个区域:区域分割
灰度图像的分割通常基于图像亮度的两个基本特性:不连续性和相似性。区域内部的像素一般具有灰度相似性,而区域之间的边界上一般具有灰度不连续性。
由此衍生出的图像分割方法有:间断检测、阈值分割法和区域分割法。
二、点检测与线检测
利用区域之间的不连续性分割涉及:
- 间断检测——检测点、线和边缘
- 边缘组装——组合成边界
- 门限处理——在边缘检测时,需要定义区分不同区域的特征,那么特征值的分界点就是一个门限。
1.点检测
利用如图所示模板,若,则表明模板中心是一个孤立的点;
其中,R为滤波结果;T为非负阈值。
- 如果一个孤立点与它周围的点不同,则可以使用该模板进行检测;
- 如果模板相应R=0,则表示在灰度级上为常数的区域。
-1 | -1 | -1 |
-1 | 8 | -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 |
2 | 2 | 2 |
-1 | -1 | -1 |
-1 | -1 | 2 |
-1 | 2 | -1 |
2 | -1 | -1 |
-1 | 2 | -1 |
-1 | 2 | -1 |
-1 | 2 | -1 |
2 | -1 | -1 |
-1 | 2 | -1 |
-1 | -1 | 2 |
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 图像边缘的判据
边缘检测最常用的方法是检测亮度值的不连续性,这种不连续在数学上用一阶和二阶微分来刻画。
- 在边缘处,图像的一阶导数的幅度值较大,并在其附近形成一个峰值,其峰值的大小和极性反映了边缘点的强度和方向。
- 图像的二阶导数在边缘处取零值,且在零值的左右两侧分别存在极性相反的两个波峰;其波峰的大小和走向反映了边缘点的强度和方向。
3.6 一阶微分边缘检测算子
- 梯度算子
- Roberts算子
- Sobel算子
- Prewitt算子
3.7 二阶微分边缘检测算子
- 拉普拉斯算子
- LOG算子(马尔算子/墨西哥草帽)
- DOG算子
- 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),则.
- 阈值分割算法的核心就在于阈值的确定;
- 依据阈值的不同选取方法,可分为全局阈值和局部阈值;
- 全局阈值分割是利用全局信息对整幅图像求出最优分割阈值,可以是单阈值也可以是多阈值;
- 局部阈值分割是把原始的整幅图像分成几个小的字图像,再对每个子图像应用全局阈值分割分别求最优分割阈值。
4.1 全局阈值分割
4.1.1 数据拟合法选取阈值
连续曲线拟合图像的灰度直方图,选取极小值点作为最优阈值;
极小值点满足:.
该方法适用于具有良好双峰性质的图像,但需要用到数值逼近等运算,算法很复杂。
4.1.2 基于误分率最小的阈值选取
有时目标与背景的灰度值有部分交错,用一个全局阈值并不能将其分开,此时基于使图像误分割概率最小的原则选取最优阈值。
4.1.3 迭代法选取阈值
自适应获取全局阈值:
(1)求出图像的最大灰度值和最小灰度值,分别记为、,令初始阈值;
(2)根据阈值将图像分割为前景和背景,分别求出两者的平均灰度值ZO和ZB;
(3)求出新阈值;
(4)若,则所得即为阈值;否则转(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('分割结果');