最大類間方差法是由日本學者大津(nobuyuki otsu)於2023年提出的,是一種自適應的閾值確定的方法,又叫大津法,簡稱otsu。它是按影象的灰度特性,將影象分成背景和目標2部分。背景和目標之間的類間方差越大,說明構成影象的2部分的差別越大,當部分目標錯分為背景或部分背景錯分為目標都會導致2部分差別變小。因此,使類間方差最大的分割意味著錯分概率最小。對於影象i(x,y),前景(即目標)和背景的分割閾值記作,屬於前景的畫素點數占整幅影象的比例記為,其平均灰度;背景畫素點數占整幅影象的比例為,其平均灰度為。影象的總平均灰度記為,類間方差記為。
假設影象的背景較暗,並且影象的大小為,影象中畫素的灰度值小於閾值的畫素個數記作,畫素灰度大於閾值的畫素個數記作,則有:
採用遍歷的方法得到使類間方差最大的閾值,即為所求。
**區
opencv**:
int myotsu(const iplimage *frame) //大津法求閾值
; float pixelpro[grayscale]=;
int i, j, pixelsum = width * height, threshold = 0;
uchar* data = (uchar*)frame->imagedata;
//統計每個灰度級中畫素的個數
for(i = 0; i < height; i++) }
//計算每個灰度級的畫素數目佔整幅影象的比例
for(i = 0; i < grayscale; i++)
//遍歷灰度級[0,255],尋找合適的threshold
float w0, w1, u0tmp, u1tmp, u0, u1, deltatmp, deltamax = 0;
for(i = 0; i < grayscale; i++)
else //前景部分
}u0 = u0tmp / w0;
u1 = u1tmp / w1;
deltatmp = (float)(w0 *w1* pow((u0 - u1), 2)) ;
if(deltatmp > deltamax)
}return threshold;
}
matlab **1
function binariedimage=ostu(scoreimage)
scoreimage=double(scoreimage);
[height,length]=size(scoreimage);
totalpixel=height*length;
% maxpixnumber=max(max(scoreimage));
% 這個地方為了以後計算方便 就不這樣計算了 而是預設最大的為255
pixelcount=zeros(1,256);%統計各個畫素值的個數
% 0-256
for i=1:length
for j=1:height
number=scoreimage(j,i)+1;
pixelcount(number)=pixelcount(number)+1;
endend%概率
pf=pixelcount/totalpixel;
%前向累計概率密度函式
cpf=zeros(1,256);
cpf(1)=pf(1);
for i=2:256
cpf(i)=cpf(i-1)+pf(i);
end%後向累計概率密度函式
bpf=zeros(1,256);
bpf(256)=pf(256);
for j=256:-1:2
bpf(j-1)=bpf(j)+pf(j-1);
end
%前向累計期望
meanforward=zeros(1,256);
meanforward(1)=1;
for i=2:256
meanforward(i)=meanforward(i-1)*(cpf(i-1)/cpf(i))+(pf(i)/cpf(i))*i;
end%後向累計期望
meanback=zeros(1,256);
meanback(max(max(scoreimage)))=max(max(scoreimage));
for i=max(max(scoreimage)):-1:2
meanback(i-1)=meanback(i)*(bpf(i)/bpf(i-1))+(pf(i-1)/bpf(i-1))*(i-1);
enddelta=cpf.*bpf.*(meanforward-meanback).^2;
[value,index]=max(delta);
% 返回的是邏輯的影象
binariedimage=scoreimage>index;
matlab **2
function binariedimage=ostu(scoreimage)
[height,length]=size(scoreimage);
totalnum=height*length;
pixelcount=zeros(1,256);%統計各個畫素值的個數
for i=1:length
for j=1:height
number=scoreimage(j,i)+1;
pixelcount(number)=pixelcount(number)+1;
endendpf=pixelcount/totalnum;
deltamax=0;
a=1:256;
maxmax=max(max(scoreimage));
for i=1:maxmax
w1=sum(pf(1:i));
w2=1-w1;
mean1=sum(pf(1:i).*a(1:i))/sum(pf(1:i));
mean2=sum(pf(i+1:maxmax).*a(i+1:maxmax))/sum(pf(i+1:maxmax));
delta=w1*w2*(mean1-mean2)^2;
if delta>deltamax
deltamax=delta;
threshold=i;
endend% 返回的是邏輯的影象
binariedimage=scoreimage>threshold;
最大類間方差法otsu (大津演算法)
效能 類間方差法對噪音和目標大小十分敏感,它僅對類間方差為單峰的影象產生較好的分割效果。當目標與背景的大小比例懸殊時,類間方差準則函式可能呈現雙峰或多峰,此時效果不好,但是類間方差法是用時最少的。公式推導 記t為前景與背景的分割閾值,前景點數佔影象比例為w0,平均灰度為u0 背景點數佔影象比例為w1...
opencv 最大類間方差(大津法OTSU)
參考 otsu 大津演算法 最近在做字元識別,看了很多資料,發現在對影象進行預處理過程中,對影象進行二值化是乙個必不可少的方式。如何才能有效的將目標字元表現出來,opencv提供的閾值化方法有threshold和adaptivethreshold,但這需要自己進行引數調整。在同學那裡了解到乙個很有效...
Otsu最大類間方差法
otsu最大類間方差法 最大類間方差法,是由日本學者otsu在1979年提出的一種對影象進行 二值化的高效演算法。1.otsu最大類間方差法原理 利用閾值將 原影象分成前景 背景兩個影象,當取最佳閾值時,背景應該與前景差別最大,關鍵在於如何選擇衡量差別的標準,而在otsu演算法中這個衡量差別的標準就...