图像处理系列之图像分割

1.阈值分割

1.1全局阈值

全局阈值又称简单阈值,是最简单的一种阈值分割方法。设定一个阈值,整副图像根据与该阈值的大小关系进行灰度值的改变。在opencv中使用cv2.threshold()函数实现全局阈值分图像。需传入四个参数,分别为输入图像、阈值、高于(有时是低于)阈值后赋给像素的新值、像素赋值方法。赋值方法共有五种,如下所示。
cv2.THRESH_BINARY(当像素高于阈值时,赋予后面的新值)
cv2.THRESH_BINARY_INV(黑白二值翻转)
cv2.THRESH_TRUNC(得到的图像为多像素值)
cv2.THRESH_TOZERO(当像素高于阈值时像素设置为自己提供的像素值(一般是255以便接近二值图像便于处理),低于阈值时不作处理)
cv2.THRESH_TOZERO_INV(当像素低于阈值时设置为自己提供的像素值,高于阈值时不作处理)

1.2 自适应阈值

相比于简单粗暴的全局阈值,自适应阈值在图像的每个不同的区域上计算该区域的相应阈值并进行图像的分割。即在同一副图像中采用若干不同的阈值。输入的参数为输入图像、像素上限、自适应方法、赋值方法、邻域大小、常数。其中自适应方法有如下两种:
1.cv2.ADPTIVE_THRESH_MEAN_C:阈值取自相邻区域的平均值
2.cv2.ADPTIVE_THRESH_GAUSSIAN_C:阈值取值相邻区域的加权和,权重为一个高斯窗口。
赋值方法只有cv2.THRESH_BINARY和cv2.THRESH_BINARY_INV两种。最后一个参数常数的作用是:阈值就等于平均值或者加权平均值减去这个常数。
3.OTSU(大津算法)
当图像的灰度直方图呈现双峰时,说明图像中将背景与前景目标很明显的分开了。此时可以使用大津算法轻易获得前景目标。大津算法会根据前景目标与背景的灰度差别通过最大类方差法自动返回一个最佳阈值,并将图像划分为前景与背景两部分。但是如果图像的灰度直方图不是双峰,则划分效果可能比较差。在opencv中仍然使用cv2.Threshold()函数。只不过在赋值方法后面要加上+cv2.THRESH_OTSU语句。在输入阈值时输入0,而所计算得到的最佳阈值会被赋给语句前面的ret参数。

2.边缘分割

边缘即为图像中亮度发生突变的像素集合。图像边缘有两个要素,即方向和幅度。沿着边缘走向的像素值变化比较平缓;而沿着垂直于边缘的走向,像素值则变化得比较大。因此,根据这一变化特点,通常会采用一阶和二阶导数来描述和检测边缘。图像中的边缘检测可以通过对灰度值求导数来确定,而导数可以通过微分算子计算来实现。常用的一阶检测算子有Roberts算子、Prewitt算子、Sobel算子和canny算子,二阶检测算子有Laplace算子。目前多数算子主要是通过卷积模板对图像进行卷积操作,对灰度新值进行判断并提取边缘。提取边缘的方法 按照求导的不同可以分为一阶和二阶的边缘检测。
图像中的边缘一般是灰度值变化较为剧烈的地方。而这类点体现在导数上即其一阶导数是极值点,二阶导数是零点。所以,一阶和二阶的边缘检测算法即通过卷积核对图像卷积后的结果检测该点是否是极值点或过零点,以判断是否是图像边缘。两种算法各有利弊,一阶检测出的边缘较宽,二阶检测出的较细;二阶导数对于细节以及噪声较为敏感。下面分别介绍一阶和二阶算法中较为典型的两种。

2.1canny边缘检测

Canny边缘检测算法是当前应用较为广泛的边缘检测方法。于1986年提出。主要分为以下四个步骤。
1) 高斯滤波
为了避免图像中噪声对边缘检测的影响,首先对图像进行高斯滤波处理。和通常意义上的高斯滤波处理相同,采用高斯卷积核进行图像卷积运算完成高斯滤波。
2)计算梯度强度和梯度方向
连续函数可以使用导数表示数据的变化。图像作为离散数据的集合,其灰度值的变化可以通过差分值表示。对于一个像素点来说,应计算8邻域的梯度,即水平、竖直方向以及对角方向。在Canny算法中采用sobel算子来计算梯度。Sobel算子认为邻域像素对于当前像素的影响不是等价的,距离越远,则影响越小。sobel的卷积核也是根据这样的思想决定各个位置像素的加权值的。通过两个卷积核在图像上分别进行卷积操作,并将加权相乘后的结果相加从而得到像素点在x以及y方向的梯度大小,并最终得到整个图像的梯度幅值矩阵。对角方向的梯度通过勾股定理得到。梯度方向则可以通过三角公式计算得到。
3)非极大值抑制
为了更精确地检测边缘,我们要将梯度数值较小的点去除,从而提高边缘检测的准确性。将像素点的梯度值与其梯度方向上的邻域点梯度值进行比较,若不是极大值,则抑制为0,若是极大值则保留。通过这种方式可以使得检测出的边缘更加精细。
4)双阈值筛选边缘
完成梯度计算后,应决定哪些可以作为边缘。Canny算法采用双阈值进行筛选。若梯度值大于阈值A,则认为是强边缘并保留,若大于B且小于A,则认为是弱边缘,若小于阈值B,则认为是非边缘并抑制。为了查看弱边缘是否是真实边缘,检测其8邻域是否存在强边缘,若有则认为其也是边缘,若没有则抑制为0。
在opencv中使用cv2.Canny()函数实现canny算法。其中的参数为:输入图像、MINXAL、MAXVAL、sobel卷积核大小,默认为3。
写一个小程序,可以通过调节滑动条来设置阈值 minVal 和 maxVal 进而来进行 Canny 边界检测。就会理解阈值的重要性了。

2.2Laplace边缘检测

Laplace边缘检测属于通过求二阶微分的方式进行检测。与一阶微分不同,二阶微分关注的是图像中的‘过零点’。若图像中像素存在突变,一阶微分中呈现的是极值,二阶微分则是一个‘过零点’。通过二阶的laplace算子在图像上进行卷积运算,确定过零点的位置。这种基于过零点检测的方式所检测到的边缘点相对较少,这样也有利于后面图像的处理。但二阶微分对于噪声较为敏感,所以通常先对图像进行平滑处理。一般采用高斯滤波完成低通滤波操作。即使用高斯型拉普拉斯算子(Laplacian of a Gaussian,LoG)。在opencv中要实现LOG可以通过高斯滤波以及拉普拉斯梯度检测结合的方式完成LOG边缘检测。

3.区域分割

3.1区域生长

通过区域生长的方法对图像进行分割指的是指定一个生长点,对生长点的邻域像素按照指定的规则进行合并,若满足规则便将像素合并进区域内,按照这种方式不断对新的区域进行迭代扩充,直到没有像素进入生长区域为止。划分规则可以依据灰度值、纹理、颜色等进行制定。比如可以规定生长机制为:生长点8邻域内的像素值与生长点灰度值相差不超过某个阈值,小于该阈值则合并进生长区域内,然后对新进入的像素再次执行生长规则,不断完成扩充。区域生长的好坏关键在于:1.生长点的选择2.生长机制的制定3.终止规则的制定。区域生长算法需要自己编写代码实现,经过实际运行试验,区域分割效果并不乐观,并且由于需要大量的迭代运算,导致运行时间较长。区域生长算法一般用于医学图像的分割。

3.2区域分裂合并

区域分类合并算法可以看成是区域生长的逆过程。区域分裂首先将图像等分成多个子区域,将每一个子区域带入判定规则中进行判定是否满足条件,对不满足条件的子区域进一步等分并对新生成的各个子区域进行判定,重复执行以上操作,直到所有新生成的子区域都满足条件为止;完成区域分裂后,需要对所有子区域进行合并,对满足判定规则的相邻区域进行合并,进行合并的相邻区域可以是不同大小的,直到所有相邻区域之间均不满足判定条件为止。常用的区域分裂方法是四叉树法。

4.分水岭分割

分水岭分割把灰度图像看成是由多个盆地组成的图像,每一个盆地由空间邻域上灰度值相近的像素点组成,盆地的最低点即为灰度值最低点,分割即为向各个盆地灌水的过程,当两个盆地中的水即将汇合的时候,形成的汇合区域即为分水岭,最终结果就是形成了多个封闭性的轮廓区域。所形成的分水岭事实上就是附近的极大值点。Opencv中使用cv2.watershed()函数实现分水岭算法。传入的两个参数分别是原图像以及掩膜图形。掩膜图形需要对原图进行一些类处理后得到。通过滤波、二值化、边缘提取得到前景图像后,提取轮廓并对轮廓进行标记,标记后的轮廓图像即为要输入的掩膜图像。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值