本节介绍数字图像处理中的迭代法阈值分割,针对灰度图进行自动寻找阈值。收敛证明目前未找到相关资料。

1. 迭代法阈值分割步骤

(1) 选取初始分割阈值,通常可选图像灰度平均值 \(T\)
(2) 根据阈值 \(T\) 将图像像素分割为背景和前景,分别求出两者的平均灰度 \(T_0\)\(T_1\)
(3) 计算新的阈值 \(T' = \frac{T_0 + T_1}{2}\)
(4) 若 \(T == T'\),则迭代结束,\(T\) 即为最终阈值。否则令 \(T = T'\),转第 (2) 步。

2. 效果

drawing

3. Python实现

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

def show(img):
    if img.ndim == 2:
        plt.imshow(img, cmap='gray', vmin=0, vmax=255)
    else:
        img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
        plt.imshow(img)
    plt.show()

img = cv.imread('pic/eagle500x500.jpg', 0)

T = img.mean()

while True:
    t0 = img[img < T].mean()
    t1 = img[img >= T].mean()
    t  = (t0 + t1) / 2
    if abs(T - t) < 1:
        break
    T = t
T = int(T)

print(f"Best threshold = {T}")
th, img_bin = cv.threshold(img, T, 255, 0)
show(img_bin)

说明:

  1. 未经许可,谢绝转载。
  2. 本教程为《数字图像处理Python OpenCV实战》的配套代码相关内容。
    免费视频教程为0-6章(标题号≤6),可在此处点击观看。
    所有课件及源代码可在此处下载:
    链接:https://pan.baidu.com/s/198PySe_vebO3e06idHSQ6g
    提取码:11o4
    有问题可在QQ群(1079300899)指出,进群答案:数字图像处理。在本文评论指出可能导致回复很晚。