目录
分割将一副图像细分为其组成区域或对象,细分的程度取决于特定的问题,即当分割出想要的区域时就应该及时停止分割。
可以使用如下掩膜进行对图像进行卷积运算,并寻找最大的那些响应,即为图像中的点。
-1 | -1 | -1 |
-1 | 8 | -1 |
-1 | -1 | -1 |
与点同理,可对掩膜处理后的输出进行阈值处理,即可得到线,不过直线具有方向,因此通常需要四种掩膜,来分别检测四个方向(分别为水平,45°,垂直,-45°)。
-1 | -1 | -1 | -1 | -1 | 2 | -1 | 2 | -1 | 2 | -1 | -1 | |||
2 | 2 | 2 | -1 | 2 | -1 | -1 | 2 | -1 | -1 | 2 | -1 | |||
-1 | -1 | -1 | 2 | -1 | -1 | -1 | 2 | -1 | -1 | -1 | 2 |
获得边缘:接着设定一个梯度阈值,使得两梯度和 高于该阈值的位置用255代替,而低于阈值的位置则用0代替,即可得到最终的图像边缘。
图像中的边缘上的像素可能由于噪声,不均匀光照等原因而产生断裂或亮度不连续,难以产生良好的边缘效应,这时需要采用链接过程来将像素组装为边缘,一种常见的方法为Hough变换。
朴素做法可能是通过找每一对点确定的线,来找出所有的线,再进行判断比较,但这种方法的时间复杂度为O(n^2),所以一般不采用。
而Hough变换将点从xy空间变换到直线(L=ax+b)的参数ab空间。经过一点的直线有无数多条,因此每个点对应到参数空间中就为一条曲线。但是这种情况下也有问题,若直线为垂直,则a为无穷大,无法表示。因此,还需要直线表示形式转化为,从而将参数空间转化为极坐标。
接着,可将空间量化为一个个方格,量化的细度决定了点共线的精度。原图像上的一个点,可以为参数空间中的一批方格进行投票,最终可抽象出一个稀疏矩阵,具有空间存储和计算时间的优点。最后需要做峰值检测,找到投票数最大的几个方格,即为原图像上多点的交线。由于量化和图像边缘不直的原因,峰值可能存在于多个单元,可采用非极大值抑制进行处理。
还有一种分割方法是通过观察灰度图像的直方图,挖掘其中特殊的两个模式,可以找到一个阈值,来将其区分开来。
固定阈值的matlab实现非常简单,只需要Img(Img > threshold) = 255以及令Img(Img <= threshold) = 0 即可实现。
OTSU法是一种自适应阈值的方法。
总体思想就是利用贝叶斯理论,找到一种分类结果,使得整幅图像像素分类误差最小化。阅读论文后,我觉得它的计算大致分为三个步骤:1)对灰度等级进行归一化:设整张图片中每个灰度等级对应的数量为,令等于,其中N为总像素数;2)计算类间方差:论文中引入作为当阈值设置为k时的判别度量,其中,,分别为灰度直方图的第0阶和1阶累计矩,为整张图的灰度均值;3)根据类间方差最大化选择阈值,也就是求解最优化式子:,直接遍历每个,寻找最优值即可。
OTSU算法其实就是用了方差分析的思想,因为二值化处理本质上是分类问题,那么通过阈值区分开的两个类别,类间方差应该越大越好,OTSU算法就是通过遍历每一个阈值,并计算对应的类间方差,选择其中类间方差最大的阈值作为整张图像的自适应阈值,就可以近似认为该阈值为根据全局灰度信息确定的最佳分割阈值。