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

图像处理 同时被 3 个专栏收录
2 篇文章 0 订阅
5 篇文章 0 订阅
2 篇文章 0 订阅

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

算法流程:

  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 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]
  • 5
    点赞
  • 0
    评论
  • 12
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论
请先登录 后发表评论~
©️2021 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页

打赏作者

HawaiiHello

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值