实验环境 windows11 matlab2022a
实验有借鉴部分,注意!!!
一.实验目的:
1.了解图像分割中的基本概念以及相关知识;
2.掌握几种经典边缘检测算子的基本原理、实现步骤;
3.理解阈值分割、区域分割等基本原理、实现步骤;
4.理解区域生长法的基本原理、实现方法。
二.实验原理:
基于边界的图像分割:
1. 点检测
g = abs(imfilter(tofloat(f), w)) >= T;
f 是输入图像,w 是适合点检测的模板,g 是包含检测点的图像。imfilter 把输出转换为输入所属的类,如果输入是整数类,并且 abs 操作不接受整数数据,那么在滤波操作中用 tofloat(f)来防止对数值的过早截取。输出图像 g 是 logical 类;值是 0 和 1。如果 T 值没有给出,那么通常基于滤波结果来选取。在那种情况下,先前的一串指令分成三个基本步骤:1) 计算滤波后的图像 abs(imfilter(tofloat(f),w));2) 从滤波后的图像的数据中找出 T 的值;3) 把滤波后的图像与T做比较。
点检测的另一种方法是在大小为 m×n 的所有邻点中寻找一些点,最大值和最小值的差超出了 T 的值,使用而二维顺序统计滤波器可以完成这个目的:
g = ordfilt2(f, m*n, ones(m, n)) − ordfilt2(f, 1, ones(m, n));
g = g >= T;
2.线检测
g = imfilter(tofloat(f), w);
其中w为线检测模板:
如果图中的第一个模板在图像上移动,就会对水平线(一个像素宽)的响应更强烈。对于恒定的背景,当线通过模板的中间一行时可能产生更大的响应。同样,图 中的第 2 个模板对+45°线响应最好,第 3 个模板对垂直线响应最好,第 4 个模板对
–45°线响应最好。注意,每个模板的优先方向都用比其他可能方向要大的系数加权。每个模板的系数之和为 0,这表明在恒定亮度区域中,模板的响应为 0。若每方向模板都应用于同一图像,其中一方向模板在图像中心点响应比其他模板在图像中心点响应都大,我们就说那个点与模板 i 方向的线更相关。
3.边缘检测
(1)[g,t]=edge(f, 'method', parameters)
f 是输入图像,method 是以下列出方法中的一种,parameters 是下边说明
的附加参数。输出 g 是在 f 中被检测到的边缘点的位置为 1,而在其他地方为 0 的逻辑数组。
参数 t 是可选择的;由 edge 给出阈值,以决定哪个梯度值足够大到可以被称作边缘点。
Sobel 边缘检测算子
Sobel 检测算子的一般调用语法是:
[g,t] = edge(f, 'sobel', T, dir);
其中 f 是输入图像,T 是指定的阈值,dir 是指定的检测边缘的首选方向:’horizontal’、‘vertical’或’both’(默认值)。
(2) Prewitt 边缘检测算子
一般调用语法是:
[g,t] = edge(f, 'prewitt', T, dir);
1
这个函数的参数和 Sobel 参数相同。Prewitt 检测算子相比 Sobel 检测算子在计算上要简单
一点,但是比较容易产生噪声。
(3) Roberts 边缘检测算子
一般调用语法是:
[g,t] = edge(f, 'roberts', T, dir);
这个函数的参数和 Sobel 参数相同。Roberts 检测算子是数字图像处理中最古老的边缘检测
算子中的一种,并且也是最简单的一种。因为在部分功能上有限制,所以这
种检测算子的使用明显少于其他几种算子(比如,Roberts 检测算子是非对称的,而且不能检测
诸如 45°倍数的边缘)。然而,在简单和速度为主导因素的情况下,Roberts 检测算子还是经常
用在硬件实现方面。
(4) LoG 检测算子
LoG 检测算子的一般调用语法是:
[g,t ]= edge(f, 'log', T, sigma);
其中的 sigma 是标准差,其他参数和前边解释过的一样。sigma 的默认值是 2。和以前一
样,edge 忽略一切不比 T 强的边缘。如果 T 值没有给出或为空[ ],edge 会自动选值。将 T
设置为 0,将产生封闭的轮廓,这是我们熟知的 LoG 方法的典型特征。
(5)零交叉检测算子
这种检测算子基于的概念与 LoG 方法相同,但是卷积使用特殊的滤波函数 H 来完成,调用
语法为:
[g,t] = edge(f, 'zerocross', T, H);
其他参数和 LoG 解释的一样。
(6) Canny 检测算子
Canny检测算子(Canny[1986])是 edge 函数中最强的边缘检测算子。Canny检测算子的语法是:
[g,t] = edge(f, 'canny', T, sigma);
在这里,T 是向量。T=[T 1 ,T 2 ],包含在前边步骤 3)的两个阈值,sigma 是平滑滤波器的
标准差。如果 t 包括在输出参量中,t 就是二元矢量,其中包含该算法用到的两个阈值。语法
中的其余参数和其他方法中解释的一样,包括:如果 T 没有指定,就自动计算阈值。sigma 的
默认值是 1。
阀值分割技术:
阈值分割技术是比较经典和流行的图像分割方法之一,也是最简单的图像分割方法。这种方法的关键在于寻找适当的灰度阈值,通常是根据图像的灰度直方图来选取。它是用一个或几个阈值将图像的灰度级分为几个部分,认为属于同一个部分的像素是同一个物体。它不仅仅极大的压缩数据量,而且也大大简化了图像信息的分析和处理步骤。阈值分割特别适合于目标和和背景处于不同灰度级范围的图像。该方法的最大特点是计算简单,在重视运动效率的场合中,它得到了广泛的运用。
阈值法又分为全局阈值法和局部阈值法,全局阈值法是指利用全局信息对整幅图像求出最优分割阈值,可以是单一或多个阈值;局部阈值法是将整幅图像划分为若干区域,再对各个区域使用全局阈值法分别求出最优分割阈值。
基于区域的图像分割
区域分割技术:
基于区域的分割是以直接寻找区域为基础的分割技术,实际上类似基于边界的图像分割技术一样利用了对象与背景灰度分布的相似性。
区域生长法:
若没有像素满足加入到某个区域的条件时,则区域停止生长,终止规则的制定需要先验知识或先验模型。
区域生长法算法
基于区域灰度差的区域生长法
这是一种以像素为基本单位进行操作的方法,具体步骤如下:
1.对图像进行逐行扫描,找出尚没有归属的图像
2.以该像素为中心检查它的领域像素,即将领域中的像素逐个与它比较,若灰度差小于阈值T TT,则将它们合并
3.以新合并的像素为中心,回到步骤2检查新像素的邻域,直到区域无法进一步扩张
4.重复步骤1~3,直到不能找出没有归属的像素则结束整个生长过程
区域生长法的实现主要包括3个步骤:
1.选取合适的种子像素;
2.确定像素合并的相似性准则;
3.确定终止生长过程的准则。
改进方法的思路:
1.求出所有领域的平均灰度差,并合并具有最小灰度差的邻接区域
2.考虑区域生长的历程
3.考虑生长形状
三、实验内容步骤:
1.首先读入图像并且灰度化:
然后调用函数使用roberts算子和prewitt算子:
调用函数使用sobel、canny、log算子:
显示处理结果:
观察图像,ganny算子处理的图像细节最多,其次是log算子处理的图像,两者的边缘定位精度都很高。对于另外3个处理的图像,Roberts算子的边缘定位显示更为集中,而另外两个图像的两边会有部分边缘定位点,图像边缘定位不集中,图像边缘处理水平不高。
2.
先读入图像:
然后先进行边缘检测,这里建议使用canny算子
然后进行霍夫变换,变换完成之后输出图像:
之后进行特征点提取,标出点和线段:
后面进行函数变换,对寻找的点和线段进行操作。
将起点变成黄色,终点变成蓝色,线段变成红色。
输出图像:
图像中显示的直线有11条。
3.边界跟踪
首先读入图像:
读入图像之后建议不要使用算子进行边界处理,建议使用有限门界二值图像处理。
图像处理之后需要计算边界起始点的列坐标和行坐标,标量的连接符也需要设定。
注意,需要设定轮廓的跟踪线段长度(建议设置越大越好)
轮廓跟踪线段长度设定后,使用bwtracboundary函数划线
效果图:
划线使用了plot函数,这里的线段使用绿色画出。线段宽度为默认值”LineWidth”是0.5。
4.双峰法实现图像分割:
读入图像并显示灰度直方图:
这里的谷底值选用174,在168到178之间的一个值。
然后调用函数:
函数第一个参数可以使用中值滤波后的图像,也可以使用原图。第二个参数使用选择的值除去255即可。
输出图像:
5.Otsu算法与迭代阀值法处理图像分割
先读入图像,灰度化之后将图像类型转换为浮点数方便后面使用
然后使用Otsu算法处理图像,注意,需要使用之前转换过类型的图像,否则显示的图像是黑色。
然后使用迭代阀值法:
先选用一个均值作为临时阀值,这里使用mean函数。
然后进行循环,定义小于阀值的区域和大于阀值的区域,然后再计算阀值均值得到新的阀值。
判断阀值时候收敛,这是这个循环的退出条件,然后更新阀值:
退出循环之后,定义小于阀值的部分为0,大于阀值的部分为1,然后输出图像:
结果显示:
经过比较,发现经过迭代处理的图像灰度会深于Otsu算法处理的图像,而经过Otsu算法处理过的图像会白于迭代处理的图像。在细节方面,Otsu算法的图像细节上会优于迭代处理处理的图像,但Ostu图像在处理图像时会有一定的图像细节缺失。
6.图像的区域增长算法:
先读入灰度图像,然后转变图像的类型
考虑到是生长,需要手动确定点的坐标才好确定生长的范围:
获得生长点的坐标之后,算出中心灰度值,并用点的坐标生成一个矩阵。
首先设置将要处理的点数为1(一定有一个),
设置限制条件,如果没有达到条件就停止生长。
如果满足的像素点大于0,那么先遍历全部的图像,,如果判断出像素点在设置的矩阵范围之内,那么就可以使这个点在这个范围之内生长:
在生长的过程中需要不断判断生长有没有超过界限,如果不在这个生长范围之内就会退出循环(像素点的灰度值也在考虑范围之内)。然后记录生长点的个数。
显示图像: