1. 程式人生 > >基於Otsu的全域性閾值處理的實現

基於Otsu的全域性閾值處理的實現

基於Otsu的全域性閾值處理又稱最大類間方差法,即在對影象進行閾值分割時,選定的分割閾值應使前景區域的平均灰度,背景區域的平均灰度與整幅影象的平均灰度之間差別最大,這種差異用區域的方差來表示

設影象中灰度為i的畫素數為ni,灰度範圍為[0,L-1], 總的畫素數為

這裡寫圖片描述

各灰度值出現的概率為

這裡寫圖片描述

對於Pi

這裡寫圖片描述

把圖中的畫素用閾值T分為兩類C0和C1,C0由灰度值在[0,T-1]的畫素組成,C1由灰度值在[T,L-1]的畫素組成,則區域C0和C1的概率分別為

這裡寫圖片描述

區域C0和C1的平均灰度分別為:

這裡寫圖片描述

U是整幅影象的平均灰度

這裡寫圖片描述

兩個區域的總方差為:

這裡寫圖片描述

讓T在[0,L-1]範圍內依次取值,使區域方差最大的T值便是最佳區域分割閾值

Matlab程式碼實現

I=imread('car.jpg');   %讀入影象
I=I(:,:,1);
figure(1);
imshow(I);
[m,n]=size(I);
[counts,x]=imhist(I,256);  %灰度級為[0,255]
[Q,~]=size(x)
Pi=counts/m/n;
Variance=zeros(1,Q);       %存放區域方差
for k =1:Q-1
    P0=sum(Pi(1:k))
    P1=sum(Pi(k+1:Q))

    Mu0=(1/P0)*([1:k]*counts(1:k));
    Mu1=(1/P1)*([k+1
:Q]*counts(k+1:Q)); Mu=P0*Mu0+P1*Mu1; variance=P0*P1*(Mu0-Mu1)^2; Variance(k)= variance; end [m1,n1]=max(Variance); I1=im2bw(I,n1/255); figure(2); imshow(I1)

執行結果:T=n1=137

原圖

這裡寫圖片描述

以上是關於Otsu的全域性閾值處理的實現,歡迎大家一起交流學習