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

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);   

猜你喜欢

转载自blog.csdn.net/weixin_41721222/article/details/80207909