MATLAB實現OTSU


@

1.OTSU算法原理簡述:

最大類間方差是由日本學者大津(Nobuyuki Otsu)於1979年提出,是一種自適應的閾值確定方法。算法假設圖像像素能夠根據閾值,被分成背景[background]和目標[objects]兩部分。然后,計算該最佳閾值來區分這兩類像素,使得兩類像素區分度最大。

公式: 記 M = 256 單通道灰度分級 Sum = 像素總數

在這里插入圖片描述

2.MATLAB實現代碼

clc
clear  
x=imread('radiogirl.jpg');   
   a=x;
   subplot(211);  
   imshow(a,[]);  
   %[count x]=imhist(a);   
   [m,n]=size(a);   
   N=m*n;   
   L=256;   

for i=1:L  
    count(i)=length(find(a==(i-1)));  
    f(i)=count(i)/(N);  %每個灰度對應的概率,i=1,對應灰度值為0(i-1)
end  

for i=1:L   
    if count(i)~=0   
        st=i-1;   %開始的灰度值
        break;   
    end   
end   
for i=L:-1:1   
    if count(i)~=0   
        nd=i-1;   %結束的灰度值
        break;   
    end   
end   

p=st;   q=nd-st+1;   
u=0;   
for i=1:q   
    u=u+f(p+i)*(p+i-1);  %u是像素的平均值    
    ua(i)=u;           %ua(i)是前i+p個像素的平均灰度值  (前p個無取值) 
end;   

for i=1:q   
    w(i)=sum(f(1+p:i+p));  %w(i)是前i個像素的累加概率,對應公式中P0 
end;   

w=w+eps;  
   %對照sigmaB的公式寫出目標函數。實際是遍歷所有值
d=(w./(1-w)).*(ua./w-u).^2;
[y,tp]=max(d);  %可以取出數組的最大值及取最大值的點   
th=tp+p;  


subplot(212);  
imshow(im2bw(a,th/255),[]);  title('自己的最大類間方差');

subplot(211);  
imshow(im2bw(x,graythresh(x)),[]);  title('matlab自帶');

結果
在這里插入圖片描述
可以看到自己編寫的與matlab自帶效果相同。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM