图像处理:迭代阈值分割算法实现(python)

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

使用迭代的方法对图像全局的阈值进行估计,效果优于传统的双峰阈值分割。

算法流程:

  1. 给定初始值T0T_0T0,最好是全局灰度平均值
  2. 根据阈值T0T_0T0将图像分成两个部分,两个部分灰度均值分别为T1T_1T1 T2T_2T2
  3. 计算出一个新的阈值T=12(T1+T2){T = \frac{1}{2}(T_1 + T_2)}T=21(T1+T2)
  4. 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]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值