MatLab编程实现Otsu方法的最优全局阈值处理

目录

一、什么是Otsu算法?

二、核心原理

三、变量定义与编写思想

3.1首先出待处理图像归一化直方图分量:

 3.2任选一个阈值T(方便遍历从1开始)​编辑

3.3求出C1、C2对应的累计概率:

3.4求阈值对应直方图累加均值

 3.5求整个图像平均灰度(可在任意步骤求解)

 3.6类间方差最大值

 四、代码实现

 五、实验结果展示

图一        阈值分割结果

图二        原图直方图


一、什么是Otsu算法?

简单点说是基于图像的全局灰度数组找到一个灰度阈值,利用该阈值对图像进行二值化处理的算法即Otsu算法,听着很厉害吧?其实很简单。

二、核心原理

这个算法的核心就是如何找到该阈值,依据什么来确定这个二值化的阈值呢?既然是基于全局的,那么必然要了解该图像全局统计特性,所以该阈值是实际上求解的是类间方差最大值,求出该值就能找到灰度阈值。

三、变量定义与编写思想

3.1首先出待处理图像归一化直方图分量:

 3.2任选一个阈值T(方便遍历从1开始)

3.3求出C1、C2对应的累计概率:

3.4求阈值对应直方图累加均值

 3.5求整个图像平均灰度(可在任意步骤求解)

 3.6类间方差最大值

 四、代码实现

clear; clc; close all;
I = imread('polymersomes.tif'); 
[h,w]=size(I);
xs=zeros(1,256);
kt=10;
for i=1:h
    for j=1:w
       k=I(i,j);
       xs(k+1)=xs(k+1)+1;                
    end
end
%%
pi=zeros(1,255);
mG=0;
%mG
 for i = 1:255
        pi(i)=xs(i)/h/w;
        mG=mG+i*pi(i);
 end

sigmb=zeros(1,255);
for kt = 1:255
    mk=0;p1=0;
 %P1(k)
 for i = 1:255
     if(i<=kt)
        p1 = p1+pi(i);
     end
 end
 %求m(k)
         for i = 1:kt
             mk = mk+i*pi(i);
         end
p2=1-p1;
sigmb(kt)=((mG*p1-mk)^2)/p1/p2;
end
%%
[m,sigm]=max(sigmb);
I2=im2bw(I,sigm/255);
figure,imshow(I2);
histogram(I);xlim([0,255]);

 五、实验结果展示

待处理图片学过数图都应该有,这里就不给了(是一个聚合细胞的光学显微镜图像),最后大部分图片来自数图课PPt,代码原创,复制慎用,如有错误请大佬指正。

图一        阈值分割结果

图二        原图直方图

  • 7
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
1. 全局阈值处理 全局阈值处理是指将整个图像分成两个部分:背景和物体。在MATLAB中,可以通过以下代码实现全局阈值处理: ```matlab % 读取图像 I = imread('test.jpg'); % 灰度化 I = rgb2gray(I); % 计算全局阈值 level = graythresh(I); % 二值化 BW = imbinarize(I, level); % 显示结果 imshow(BW); ``` 2. OTSU阈值处理 OTSU阈值处理是一种自适应阈值处理方法,可以自动计算最佳阈值。在MATLAB中,可以通过以下代码实现OTSU阈值处理: ```matlab % 读取图像 I = imread('test.jpg'); % 灰度化 I = rgb2gray(I); % 计算OTSU阈值 level = graythresh(I); % 二值化 BW = imbinarize(I, level); % 显示结果 imshow(BW); ``` 3. 迭代式阈值处理 迭代式阈值处理是指通过不断迭代计算阈值,以达到更好的二值化效果。在MATLAB中,可以通过以下代码实现迭代式阈值处理: ```matlab % 读取图像 I = imread('test.jpg'); % 灰度化 I = rgb2gray(I); % 初始化阈值 T = mean2(I); % 迭代计算阈值 done = false; while ~done % 根据当前阈值计算背景和前景像素的平均值 fg = I > T; bg = I <= T; u1 = mean2(I(fg)); u2 = mean2(I(bg)); % 更新阈值 Tnext = (u1 + u2) / 2; % 判断是否收敛 done = abs(T - Tnext) < 0.5; T = Tnext; end % 二值化 BW = imbinarize(I, T); % 显示结果 imshow(BW); ``` 在上面的代码中,我们首先初始化阈值为图像的平均灰度值,然后不断迭代计算背景和前景像素的平均值,并更新阈值,直到阈值收敛。最后将图像二值化并显示结果。需要注意的是,迭代式阈值处理的计算量较大,适合处理较小的图像。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

电赛小板凳

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

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

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

打赏作者

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

抵扣说明:

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

余额充值