使用迭代的方法对图像全局的阈值进行估计,效果优于传统的双峰阈值分割。
算法流程:
- 给定初始值T0T_0T0,最好是全局灰度平均值
- 根据阈值T0T_0T0将图像分成两个部分,两个部分灰度均值分别为T1T_1T1 T2T_2T2
- 计算出一个新的阈值T=12(T1+T2){T = \frac{1}{2}(T_1 + T_2)}T=21(T1+T2)
- 令T0=TT_0 = TT0=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]

本文介绍了如何使用迭代方法估计图像全局阈值,以实现优于传统双峰阈值分割的效果。算法通过不断计算并更新阈值,直到达到预设的迭代次数或阈值变化小于某一阈值。提供了Python实现的递归代码示例。

9572

被折叠的 条评论
为什么被折叠?



