使用迭代的方法对图像全局的阈值进行估计,效果优于传统的双峰阈值分割。
算法流程:
- 给定初始值
T
0
T_0
T0,最好是全局灰度平均值
- 根据阈值
T
0
T_0
T0将图像分成两个部分,两个部分灰度均值分别为
T
1
T_1
T1
T
2
T_2
T2
- 计算出一个新的阈值
T
=
1
2
(
T
1
+
T
2
)
{T = \frac{1}{2}(T_1 + T_2)}
T=21(T1+T2)
- 令
T
0
=
T
T_0 = T
T0=T,重复1、2、3,直到阈值变化小于一定值或者达到设定迭代次数
python实现,使用递归方法,终止条件是达到迭代次数或者阈值变化小于一临界值
def Iterate_Thresh(img, initval, MaxIterTimes=20, thre=1):
""" 阈值迭代算法
Args:
img: 灰度图像
initval: 初始阈值
MaxIterTimes: 最大迭代次数,默认20
thre:临界差值,默认为1
Return:
计算出的阈值
"""
mask1, mask2 = (img > initval), (img <= initval)
T1 = np.sum(mask1 * img) / np.sum(mask1)
T2 = np.sum(mask2 * img) / np.sum(mask2)
T = (T1 + T2) / 2
if abs(T - initval) < thre or MaxIterTimes == 0:
return T
return Iterate_Thresh(img, T, MaxIterTimes - 1)
示例:
import cv2 as cv
import numpy as np
img = cv.imread('test.jpg', 0)
initthre = np.mean(img)
thresh = Iterate_Thresh(img, initthre, 50)
dst = cv.threshold(img, thresh, 255, cv.THRESH_BINARY)[1]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)