最大類間方差法 大津法,OTSU

2021-05-26 19:29:53 字數 3258 閱讀 1685

最大類間方差法是由日本學者大津(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演算法中這個衡量差別的標準就...