matlab图像处理--Otsu阈值分割

原文:https://blog.csdn.net/weixin_41721222/article/details/80207909 


Otsu算法:取一个最优阈值把原图像分为前景色(A部分)与背景色(B部分),两部分的类间方差越大,说明两部分差别越大,便能有效的分割图像。所以该算法最关键的是找到最优阈值。

方差:    例如  1,2,3,4,5

 

              先求均值:1/5(1+2+3+4+5)=3

 

              方差=1/5[(1-3)^2+(2-3)^2+(3-3)^2+(4-3)^2+(5-3)^2]=

              (上式能把1/5分别带入相乘)

类间方差:与方差相似,求不同部分之间的方差      

               例如1,2,3,4,5。把1,2,3当成一个A部分,4,5当成B部分,由方差可知,需要得到总均值,A部分所有比例,B部分所占比例,A部分值(即均值),B部分值(即均值)

              PA(A比例)=3/5           PB(B比例)=2/5

              ave_all(总均值)=3       ave_A(A均值)=1/3(1+2+3)       ave_B(B均值)=1/2(4+5) 

              类间方差=PA*(ave_A-ave_all)^2+PB*(ave_B-ave_all)^2(Otsu算法)

 

公式代码如下:

 

close;clear;clc;
I=im2double(imread('coins.png'));  %变为双精度,即0-1
subplot(221);imhist(I);            %显示灰度直方图
[M,N]=size(I);                     %得到图像行列像素
number_all=M*N;                    %总像素值
hui_all=0;                         %预设图像总灰度值为0
ICV_t=0;                           %预设最大方差为0
%得到图像总灰度值
for i=1:M
    for j=1:N
        hui_all=hui_all+I(i,j);
    end
end
all_ave=hui_all*255/number_all;   %图像灰度值的总平均值
 
 
%t为某个阈值,把原图像分为A部分(每个像素值>=t)与B部分(每个像素值<t)
for t=0:255                       %不断试探最优t值
    hui_A=0;                      %不断重置A部分总灰度值
    hui_B=0;                      %不断重置B部分总灰度值
    number_A=0;                   %不断重置A部分总像素
    number_B=0;                   %不断重置B部分总像素
    for i=1:M                     %遍历原图像每个像素的灰度值
        for j=1:N
            if (I(i,j)*255>=t)    %分割出灰度值》=t的像素
                number_A=number_A+1;  %得到A部分总像素
                hui_A=hui_A+I(i,j);   %得到A部分总灰度值
            elseif (I(i,j)*255<t) %分割出灰度值《t的像素
                number_B=number_B+1;  %得到B部分总像素
                hui_B=hui_B+I(i,j);   %得到B部分总灰度值
            end
        end
    end
    PA=number_A/number_all;            %得到A部分像素总数与图像总像素的比列
    PB=number_B/number_all;            %得到B部分像素总数与图像总像素的比列
    A_ave=hui_A*255/number_A;          %得到A部分总灰度值与A部分总像素的比例
    B_ave=hui_B*255/number_B;          %得到B部分总灰度值与B部分总像素的比例
    ICV=PA*((A_ave-all_ave)^2)+PB*((B_ave-all_ave)^2);  %Otsu算法
    if (ICV>ICV_t)                     %不断判断,得到最大方差
        ICV_t=ICV;
        k=t;                           %得到最大方差的最优阈值
    end
end
k                                      %显示阈值


 

在MATLAB中自带Otsu算法,调用即可  

 

    k=graythresh(I)               %I为灰度图像。k为最优阈值,其大小在[0,1]之间 ,为双精度类型         

    代码如下:

 close;clear;clc;
I=im2double(imread('coins.png'));
k=graythresh(I);              %得到最优阈值
J=im2bw(I,k);                  %转换成二值图,k为分割阈值
subplot(121);imshow(I); 
subplot(122);imshow(J);   

--------------------- 

 

  • 2
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值