圖像分割中閾值的自動選取的研究及其算法完成
發(fā)表時間:2023-08-21 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]圖像分割是圖像處理這門學(xué)科中的基礎(chǔ)難題,基于閾值的分割則又是圖像分割的最基本的難題之一,其難點在于閾值的選取。事實證明,閾值的選擇的恰當(dāng)與否對分割的效果起著決定性的作用。由于閾值選取對圖像分割的基礎(chǔ)...
圖像分割是圖像處理這門學(xué)科中的基礎(chǔ)難題,基于閾值的分割則又是圖像分割的最基本的難題之一,其難點在于閾值的選取。事實證明,閾值的選擇的恰當(dāng)與否對分割的效果起著決定性的作用。由于閾值選取對圖像分割的基礎(chǔ)性,本文主要在【1】、【2】、【3】、【4】等的基礎(chǔ)上,對一些當(dāng)前流行的閾值選取算法做了探討、實現(xiàn)和比較。多閾值分割雖然能進(jìn)一步提高圖像分割的質(zhì)量,但由于它只是分割技巧的處理問題,而與單閾值分割并無本質(zhì)的區(qū)別。因此本文并不對多閾值分割進(jìn)行討論,而只考慮單閾值分割的情形。
1. 雙峰法
雙峰法的原理及其簡單:它認(rèn)為圖像由前景和背景組成,在灰度直方圖上,前后二景都形成高峰,在雙峰之間的最低谷處就是圖像的閾值所在。根據(jù)這一原理,我們給出了它的實現(xiàn),部分代碼如下(Pascal語言描述,以下同):
//intPeak、intPeak2、intValley:峰值和直方圖值
//intIndx::相應(yīng)的灰度值
intPeak,intIndx,intPeak2,intIndx2,intValley,intValleyIndx:integer;
//初始雙峰值
intPeak:=0;
intPeak2:=0;
//取得第一峰值
for intLoop:=0 to 255 do
if intPeak<=intGrayLevel[intLoop] then
begin
intPeak:=intGrayLevel[intLoop];
intIndx:=intLoop;
end;
//取得第二峰值
for intLoop:=0 to 255 do
Begin
if (intPeak2<=intGrayLevel[intLoop]) and (intLoop<>intIndx) then
begin
intPeak2:=intGrayLevel[intLoop];
intIndx2:=intLoop;
end
end;
//取得雙峰之間的谷值
intValley:=intSize;
if intIndx2<intIndx then
for intLoop:=intIndx2 to intIndx do
if intValley>intGrayLevel[intLoop] then
begin
intValley:=intGrayLevel[intLoop];
intValleyIndx:=intLoop;
end;
從分割的效果來看,當(dāng)前后景的對比較為強烈時,分割效果較好;否則基本無效。
2. 迭代法
迭代法是基于逼近的思想,其步驟如下:
1. 求出圖象的最大灰度值和最小灰度值,分別記為ZMAX和ZMIN,令初始閾值T0=(ZMAX+ZMIN)/2;
2. 根據(jù)閾值TK將圖象分割為前景和背景,分別求出兩者的平均灰度值ZO和ZB;
3. 求出新閾值TK+1=(ZO+ZB)/2;
4. 若TK=TK+1,則所得即為閾值;否則轉(zhuǎn)2,迭代計算。
以下給出迭代求閾值的部分實現(xiàn):
//閾值初始為0
intThresholdVal:=0;
intThresholdVal2:=0;
//總灰度值
intTotalGrayLevel:=0;
for intLoop:=0 to 255 do
if intGrayLevel[intLoop]<>0 then
intTotalGrayLevel:=intTotalGrayLevel+intLoop*intGrayLevel[intLoop];
//求出初始最大灰度值
for intLoop:=0 to 255 do
if intGrayLevel[intLoop]>0 then
begin
intLGrayLevel:=intLoop;
intThresholdVal:=intLoop;
break;
end;
//求出初始最小灰度值和初始閾值
for intLoop:=255 downto 0 do
if intGrayLevel[intLoop]>0 then
begin
intRGrayLevel:=intLoop;
intThresholdVal:=(intThresholdVal+intLoop)div 2;
break;
end;
//迭代求解
while intThresholdVal<>intThresholdVal2 do
begin
intThresholdVal2:=intThresholdVal;
intCount:=0;
intLGrayLevel:=0;
for intLoop:=0 to intThresholdVal do
if intGrayLevel[intLoop]<>0 then
begin
intCount:=intCount+intGrayLevel[intLoop];
intLGrayLevel:=intLGrayLevel+intLoop*intGrayLevel[intLoop];
end;
intRGrayLevel:=intTotalGrayLevel-intLGrayLevel;
intLGrayLevel:=intLGrayLevel div intCount;
intRGrayLevel:=intRGrayLevel div (intSize-intCount);
intThresholdVal:=(intLGrayLevel+intRGrayLevel)div 2;
end;
迭代所得的閾值分割的圖象效果良好;诘拈撝的軈^(qū)分出圖像的前景和背景的主要區(qū)域所在,但在圖像的細(xì)微處(如圖1中的淺色線條)還沒有很好的區(qū)分度。
但令人驚訝的是,對某些特定圖象,微小數(shù)據(jù)的變化卻會引起分割效果的巨大改變,兩者的數(shù)據(jù)只是稍有變化,但分割效果卻反差極大,個中原因還有待進(jìn)一步研究。
3. 大津法(OTSU法)
大津法由大津于1979年提出,對圖像Image,記t為前景與背景的分割閾值,前景點數(shù)占圖像比例為w0, 平均灰度為u0;背景點數(shù)占圖像比例為w1,平均灰度為u1。圖像的總平均灰度為:u=w0*u0+w1*u1。從最小灰度值到最大灰度值遍歷t,當(dāng)t使得值g=w0*(u0-u)2+w1*(u1-u)2 最大時t即為分割的最佳閾值。對大津法可作如下理解:該式實際上就是類間方差值,閾值t分割出的前景和背景兩部分構(gòu)成了整幅圖像,而前景取值u0,概率為w0,背景取值u1,概率為w1,總均值為u,根據(jù)方差的定義即得該式。因方差是灰度分布均勻性的一種度量,方差值越大,說明構(gòu)成圖像的兩部分差別越大,當(dāng)部分目標(biāo)錯分為背景或部分背景錯分為目標(biāo)都會導(dǎo)致兩部分差別變小,因此使類間方差最大的分割意味著錯分概率最小。
直接應(yīng)用大津法計算量較大,因此我們在實現(xiàn)時采用了等價的公式g=w0*w1*(u0-u1)2。部分計算過程如下:
//遍歷所有灰度值求Max g。
for intCurrentLevel:=0 to intArrLen do
begin
if intSclGrayLevel[intCurrentLevel]=0 then
continue
else
begin
//計算當(dāng)閾值為intCurrentLevel時的g
intCount:=0;
intSumPels:=0;
for intLoop:=0 to intCurrentLevel do
begin
intCount:=intCount+intSclGrayLevel[intLoop];
intSumPels:=intSumPels+intSumPelsArr[intLoop];
end;
w0:=intCount/intSize;
u0:=intSumPels/intCount;
w1:=1-w0;
if intSize-intCount<>0 then
u1:=(intTotalPels-intSumPels)/(intSize-intCount)
else
u1:=0;
RlTempO:=w0*w1*(u0-u1)*(u0-u1);
if RlTempO>RlMaxO then
begin
RlMaxO:=RlTempO;
Result:=intCurrentLevel;
end;
end;
我們在測試中發(fā)現(xiàn):大津法選取出來的閾值非常理想,對各種情況的表現(xiàn)都較為良好。雖然它在很多情況下都不是最佳的分割,但分割質(zhì)量通常都有一定的保障,可以說是最穩(wěn)定的分割。由上可知,大津算法是一種較為通用的分割算法。在它的思想的啟迪下,人們進(jìn)一步提出了多種類似的評估閾值的算法,具體可參加【5】、【6】等。
4. 灰度拉伸-一種改進(jìn)的大津法
大津法得到了廣泛的應(yīng)用,但有人發(fā)現(xiàn),大津法致命的缺陷是當(dāng)目標(biāo)物與背景灰度差不明顯時,會出現(xiàn)無法忍受的大塊黑色區(qū)域,甚至?xí)䜩G失整幅圖像的信息。為了解決這個問題,有人提出了灰度拉伸的增強大津法。這種方法的原理其實就是在大津法的基礎(chǔ)上通過增加灰度的級數(shù)來增強前后景的灰度差,從而解決問題;叶仍黾拥姆椒ㄊ怯迷械幕叶燃壋松贤粋系數(shù),從而擴大灰度的級數(shù),特別地,當(dāng)乘上的系數(shù)為1時,這就是大津法的原型,因此,大津法可以看做是這種方法的一個特例。
在實現(xiàn)中,我們實現(xiàn)了多種灰度拉伸,發(fā)現(xiàn)對不同的圖像,當(dāng)遇上不同的拉伸系數(shù)時,分割效果也相差甚遠(yuǎn)。
5. Kirsh算子
在【4】中提出了基于Kirsh算子的分割方法,其思想為:對數(shù)字圖像的每個像素i,考慮它的八個鄰點的灰度值,以其中三個相鄰點的加權(quán)和減去剩下五個鄰點的加權(quán)和得到差值,令三個鄰點繞該像素點不斷移位,取此八個差值的最大值作為Kirsh算子。即:設(shè)Si為三鄰點之和,Ti為五鄰點之和,則Kirsh算子定義為K(i)=max{1,max〔5Si-3Ti〕}如取閾值THk,則當(dāng)K(i)>THk時,像素i為階躍邊緣點。此外,【4】的作者認(rèn)為:假設(shè)圖像大小為H×W個像素點,其邊緣點像素一般不會超過5×H個。基于這一假設(shè),該文作者提出:(對一幅圖像)用Kirsh算法,取某一較低的初始閾值THk(以保證目標(biāo)和背景間灰度變化很小的圖像邊緣也能被取出),對于每個像素點i計算其Kirsh算子,如果K(i)>THk,則i為邊緣點,邊緣點數(shù)N(初始值為0)加1,一旦邊緣點數(shù)超過5×H ,而i還小于整幅圖像的像素數(shù),說明閾值取得太低,致使許多不是邊緣點的像素也被取出,因此需提高閾值。如此反復(fù),即可獲得分割圖像所需的閾值。
但在實現(xiàn)中,本文作者發(fā)現(xiàn),【4】中的敘述頗有值得探討之處,如在H×W圖像中,H和W之間的關(guān)系是完全對稱的,兩者之間如何抉擇?此外,在求Kirsh算子K(i)=max{1,max〔5Si-3Ti〕}時也頗有疑慮之處,由其求得的結(jié)果分割圖像效果并不明顯。基于對稱性和歸一化的考慮,筆者把Kirsh算子改為:K(i)=max{1,max abs(5Si-3Ti) div 15 },并根據(jù)在實際運行中的效果,對W和H的選取為:if W>H then use 5*H else use 5*W。在實際應(yīng)用中表明,修改后的分割質(zhì)量顯著提高。但與【4】文中作者聲稱的效果及其示例相比,仍有相當(dāng)?shù)木嚯x,特別是它不能解決前后景對比不強烈時的分割情形。但當(dāng)前后背景對比十分強烈且集中時,Kirsh算子法卻會有十分突出的表現(xiàn)。參考文獻(xiàn)
【1】 崔屹,數(shù)字圖像處理技術(shù)與應(yīng)用,電子工業(yè)出版社,1997
【2】 付忠良,圖像閾值選取方法,計算機應(yīng)用,2000
【3】 吳冰、秦志遠(yuǎn),自動確定圖像二值化最佳閾值的新方法,繪測學(xué)院學(xué)報,2000
【4】 曹莉華,圖像邊緣提取中的一種動態(tài)閾值獲取法,小型微型計算機系統(tǒng),1997
【5】 付忠良,基于圖像差距度量的閾值選取方法,計算機研究與發(fā)展,2001
【6】 付忠良,一些新的圖像閾值選取方法,計算機應(yīng)用,2001
【7】 Kenneth.R.Castleman著,朱志剛等譯,數(shù)字圖像處理,電子工業(yè)出版社,1998