基于OSTU算法的图像分割matlab仿真

目录

1.OTSU原理

2.MATLAB核心程序

3.仿真结果


       Otsu's Method,也称为最大类间方差法,是图像处理领域中广泛使用的一种自动阈值选取方法,特别适用于二值化处理。该方法由日本学者 Nobuyuki Otsu 于1979年提出,主要应用于将灰度图像分割为前景和背景两个类别,目标是找到一个最佳阈值,使得两类像素的类间方差最大,从而达到良好的图像分割效果。

1.OTSU原理

首先,我们定义几个基本概念:

灰度直方图:表示图像中每个灰度级出现的频数。假设图像有L个可能的灰度级,则直方图可表示为hi​,其中i=0,1,...,L−1,且∑i=0L−1​hi​=N,N为图像总像素数。

前景像素(foreground)和背景像素(background):根据所选阈值t,灰度值小于等于t的像素被视为背景,大于t的像素被视为前景。

类间方差(Between-class Variance,σB2​):衡量前景和背景两部分像素灰度值分布的差异程度,其计算公式为:

Otsu算法的核心思想是寻找一个阈值t,使得类间方差B2​(t)最大化。具体步骤如下:

  1. 计算图像的灰度直方图:统计图像中每个灰度级的像素个数,并归一化为概率分布。

  2. 计算类间方差:对于每一个可能的阈值t,计算前景和背景的类间方差。类内方差最小化也是达到类间方差最大化的间接途径。类内方差定义为:设图像尺寸是MxN,其二值化的的阈值为k,该阈值将图像分成背景和前景两个区域,其中背景区域的像素数量是N0​,前景区域的像素数量为N1​。背景像素点的占比设为w0​,灰度均值为u0​,前景像素点的占比设为w1​,灰度均值为u1​。整幅图像的灰度均值为u uu,则:


其中,ω1​(t) 和ω2​(t) 分别是阈值t 处前景和背景的权重(像素占比),μ1​(t) 和 μ2​(t) 分别是前景和背景的平均灰度。最大化类间方差等同于最小化类内方差的倒数

  1. 选择最佳阈值:遍历所有可能的阈值 t,找到使类间方差 σB2​(t) 最大的那个阈值。

  2. 应用阈值:使用选定的阈值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算法仍能适应更多复杂场景,是图像分割领域的一个基础而强大的工具。

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值