目录
Otsu's Method,也称为最大类间方差法,是图像处理领域中广泛使用的一种自动阈值选取方法,特别适用于二值化处理。该方法由日本学者 Nobuyuki Otsu 于1979年提出,主要应用于将灰度图像分割为前景和背景两个类别,目标是找到一个最佳阈值,使得两类像素的类间方差最大,从而达到良好的图像分割效果。
1.OTSU原理
首先,我们定义几个基本概念:
灰度直方图:表示图像中每个灰度级出现的频数。假设图像有L个可能的灰度级,则直方图可表示为hi,其中i=0,1,...,L−1,且∑i=0L−1hi=N,N为图像总像素数。
前景像素(foreground)和背景像素(background):根据所选阈值t,灰度值小于等于t的像素被视为背景,大于t的像素被视为前景。
类间方差(Between-class Variance,σB2):衡量前景和背景两部分像素灰度值分布的差异程度,其计算公式为:
Otsu算法的核心思想是寻找一个阈值t,使得类间方差B2(t)最大化。具体步骤如下:
-
计算图像的灰度直方图:统计图像中每个灰度级的像素个数,并归一化为概率分布。
-
计算类间方差:对于每一个可能的阈值t,计算前景和背景的类间方差。类内方差最小化也是达到类间方差最大化的间接途径。类内方差定义为:设图像尺寸是MxN,其二值化的的阈值为k,该阈值将图像分成背景和前景两个区域,其中背景区域的像素数量是N0,前景区域的像素数量为N1。背景像素点的占比设为w0,灰度均值为u0,前景像素点的占比设为w1,灰度均值为u1。整幅图像的灰度均值为u uu,则:
其中,ω1(t) 和ω2(t) 分别是阈值t 处前景和背景的权重(像素占比),μ1(t) 和 μ2(t) 分别是前景和背景的平均灰度。最大化类间方差等同于最小化类内方差的倒数
-
选择最佳阈值:遍历所有可能的阈值 t,找到使类间方差 σB2(t) 最大的那个阈值。
-
应用阈值:使用选定的阈值t 将图像进行二值化,即将灰度值大于 t 的像素归为前景,小于或等于t 的像素归为背景。
2.MATLAB核心程序
% 定义OTSU算法函数,用于图像二值化处理
function image = otsu(image)
% 获取图像的行数和列数
[rows, cols] = size(image);
% 设定最大灰度值
maxValue = 255;
% 初始化灰度直方图数组
histogram = zeros(maxValue, 1, 'double');
% 计算每个灰度级的像素数量
for row = 1:rows
for col = 1:cols
% 当前像素的灰度值加1(因索引从1开始)
i = image(row,col)+1;
histogram(i) = histogram(i) + 1;
end
end
% 将直方图数量转换为概率
pixels = sum(histogram);
for i = 1:maxValue
histogram(i) = histogram(i) / pixels;
end
% 计算所有可能阈值的类间方差
icVar = zeros(maxValue,1,'double');
for t = 1:maxValue
[w0, w1] = calculateWeights(histogram, t); % 计算两个类的权重
var0 = var(histogram(1:t-1)); % 类0的方差
var1 = var(histogram(t:maxValue)); % 类1的方差
icVar(t) = w0*var0 + w1*var1; % 类间方差
end
% 找到最小类间方差对应的阈值
threshold = 0;
variance = 100000;
for t = 1:maxValue
if icVar(t) < variance
threshold = t;
variance = icVar(t);
end
end
% 使用找到的阈值对图像进行二值化处理
image = binariseImage(image, threshold);
% 内部函数:计算两个类的权重
function [w0, w1] = calculateWeights(histogram, threshold)
w0 = 0;
w1 = 0;
for j = 1:(threshold-1)
w0 = w0 + histogram(j); % 累积累类0的权重
end
for j = threshold:length(histogram)
w1 = w1 + histogram(j); % 累积累类1的权重
end
end
end % 结束主函数
4090
3.仿真结果
Otsu算法因其简单有效,在图像预处理和特征提取中广泛应用。然而,它假设图像由两个明显的类构成,且类间方差与类内方差之间存在显著差异,因此在类分布不均衡或存在多重峰值的图像上可能表现不佳。尽管如此,通过调整和扩展,Otsu算法仍能适应更多复杂场景,是图像分割领域的一个基础而强大的工具。