使用Matlab/Python实现Otsu算法
摘要
Otsu算法[1]是在1979年提出的, 它通过最大化类间方差来对图像进行分割。换句话说, Otsu算法是一种非参数分割方法, 根据像素的强度将图像分成不同的区域。本文将分为两个部分来介绍Otsu算法, 首先通过回顾文献中数学公式理解Otsu算法的原理, 最后再使用Matlab/Python实现其细节。
数学描述[2]
假设 是一个 大小的图像的像素强度级别:
其中, 表示图像像素的总数, 表示强度级别 的像素数, 所有强度级别的概率分布由 表示。
考虑二分类问题时, 假设存在一个阈值 , 其中 介于 和 之间, 那么图像可以根据 分为两个类别, 第一个类别 包含所有像素强度级别在 ~ 之间的像素,而 包含剩余的像素。
其中, 和 分别表示 和 的累积概率分布。
其中, 和 分别表示 和 的平均像素强度。 表示从 ~ 的平均像素强度。 表示整个图像的平均像素强度。因此, 最大化类别间方差的目标函数如下所示:
根据上述公式, 我们可以在 ~ 中找到一个 来最大化 , 从而实现有效的图像分割。
代码实现
function fit = otsu(N, level, x, prob)
fit = zeros(1, N);
for j = 1:N
fit(j) = sum(prob(1:x(j, 1) - 1)) * (sum((1:x(j, 1) - 1) .* ...
prob(1:x(j, 1) - 1) / sum(prob(1:x(j, 1) - 1))) - ...
sum((1:255) .* prob(1:255)) ) ^ 2;
for jlevel = 2:level - 1
fit(j) = fit(j) + sum(prob(x(j, jlevel - 1):x(j, jlevel) - 1)) * ...
(sum((x(j, jlevel - 1):x(j, jlevel) - 1) .* ...
prob(x(j, jlevel - 1):x(j, jlevel) - 1) / ...
sum(prob(x(j, jlevel - 1):x(j, jlevel) - 1))) - ...
sum((1:255) .* prob(1:255))) ^ 2;
end
fit(j) = fit(j) + sum(prob(x(j, level - 1):255)) * ...
(sum((x(j, level - 1):255) .* prob(x(j, level - 1):255) / ...
sum(prob(x(j, level - 1):255))) - sum((1:255) .* prob(1:255))) ^ 2;
if isnan(fit(j)) || isinf(fit(j))
fit(j) = eps;
end
end
fit = fit';
end
import numpy as np
from typing import List, Tuple
def otsu(N: int, level: int, x: np.ndarray, prob: np.ndarray) -> np.ndarray:
fit = np.zeros(N)
total_mean = np.sum(np.arange(256) * prob[:256])
for j in range(N):
fit[j] = 0
thresholds = [0] + x[j, :].tolist() + [256]
for i in range(1, len(thresholds)):
start, end = thresholds[i-1], thresholds[i]
local_prob = prob[start:end]
if np.sum(local_prob) == 0:
continue
local_mean = np.sum(np.arange(start, end) * local_prob) / np.sum(local_prob)
fit[j] += np.sum(local_prob) * (local_mean - total_mean) ** 2
if np.isnan(fit[j]) or np.isinf(fit[j]):
fit[j] = np.finfo(float).eps
return fit
参考文献
Otsu, N. A threshold selection method from gray-level histograms. IEEE transactions on systems, 9, 62-66 (1979). ↩︎
Wang, Z., Mo, Y. & Cui, M. An Efficient Multilevel Threshold Image Segmentation Method for COVID-19 Imaging Using Q-Learning Based Golden Jackal Optimization. J Bionic Eng, 20, 2276–2316 (2023). ↩︎