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

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

算法流程:

  1. 给定初始值 T 0 T_0 T0,最好是全局灰度平均值
  2. 根据阈值 T 0 T_0 T0将图像分成两个部分,两个部分灰度均值分别为 T 1 T_1 T1 T 2 T_2 T2
  3. 计算出一个新的阈值 T = 1 2 ( T 1 + T 2 ) {T = \frac{1}{2}(T_1 + T_2)} T=21(T1+T2)
  4. 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
    Iterate_Thresh(img, T, MaxIterTimes - 1)
    
    return T

示例:

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]
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页