阈值分割
图像基于阈值分割的二值化处理。
前言
全部代码请查看GitHub
上次做了图像物体边缘检测,不过由于课程并没有讲完,只做了部分,待总结。这次做的是图像分割中的阈值分割。
阈值分割是一种图像分割方法,用于分割不同物体,比如说前景和背景的分割、图片中关键信息的提取(如下图,来自网络)。本次实验是针对8位灰度图的二值化处理。
音乐
古风,善。
实验内容
要求:在直方图上标记出计算出的阈值、生成二值化后的图像
- 给定阈值T
- 双峰法(极小点阈值法)(选做——就是不做)
- 迭代阈值法
- Otsu(大津算法)
实验过程
0x01 先晒原图
- 原图
然后转换为8位灰度图,对8位灰度图进行二值化处理。
- 转8位灰度图
0x02 人为观察直方图给定阈值T进行二值化
最简单了,权当练手。
方法就是对8位灰度图每个像素进行如下处理:
- 灰度大于T,灰度设为255
- 灰度小于T,灰度设为0
结果如下:
相应的直方图,灰色线条为所选的阈值,图像从下向上灰度增加
这样看来是有一定问题的,并没有完全将前景和背景分割出来。
0x03 使用迭代法进行二值化处理
该算法适用于背景和对象在图像中占据的面积相近的情况。
算法思想:利用平均灰度作为指标,将图片分为低灰度和高灰度两部分,根据两部分平均灰度求原图“新平均灰度”并比较两个平均灰度,如果满足误差条件,即停止迭代。
具体步骤:
- 选择图像灰度的中值(我选的是平均灰度)作为初始阈值$T_i=T_0$。
- 利用阈值Ti把图像分割成两部分区域,$R_1$和$R_2$,并计算其灰度均值$\mu_1$和$\mu_2$
- 计算新的阈值$T_{i+1}=\frac{1}{2}\times(\mu_1+\mu_2)$
- 重复步骤2、3,直到$T_{i+1}$和$T_i$的值差别小于某个给定值
结果如下:
相应的直方图,灰色线条为所选的阈值,图像从下向上灰度增加
这样看来是有一定问题的,并没有完全将前景和背景分割出来。
0x04 otsu大津算法
算法思想:针对二值化,将图片区域分为两类,根据两类的类间方差最大(或者类内方差最小)来进行分割。针对多类分割也是同理。当然我自己还没有完全搞懂为啥是这个情况,数学是硬伤,太菜了。
二值化类间方差公式
类内方差的最小化与类间方差的最大化是一致的优化目标。
$$
\sigma^2=\omega_1\omega_2\times(\mu_1-\mu_2)^2
$$
- $\mu_1$和$\mu_2$分别是两个类的平均灰度
- $\omega_1$和$\omega_2$分别是两个类的像素占比,即概率
具体步骤:
采取类间方差最大的方法来进行二值化
- 初始化类间方差$\omega^2=0$
- 初始化阈值$i=1$
- 求得阈值$i$下的类间方差$\omega^2_i$
- 如果$\omega^2_i\gg\omega^2$则替换之
- 增加阈值$i=i+1$
- 重复3、4、5步
结果如下:
相应的直方图,灰色线条为所选的阈值,图像从下向上灰度增加
效果较好,这也是为什么当前仍然使用这个算法的原因。
总结
本次实验对阈值分割有了一定的了解,针对二值化做了实验,使用了迭代和otsu两种算法进行二值化处理,学到了不少,但是其中的原理还是没有搞清楚,希望以后能有机会深入研究一下。