版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系我們

[科普中國(guó)]-圖像二值化

科學(xué)百科
原創(chuàng)
科學(xué)百科為用戶提供權(quán)威科普內(nèi)容,打造知識(shí)科普陣地
收藏

簡(jiǎn)介

將256個(gè)亮度等級(jí)的灰度圖像通過適當(dāng)?shù)拈撝颠x取而獲得仍然可以反映圖像整體和局部特征的二值化圖像。在數(shù)字圖像處理中,二值圖像占有非常重要的地位,首先,圖像的二值化有利于圖像的進(jìn)一步處理,使圖像變得簡(jiǎn)單,而且數(shù)據(jù)量減小,能凸顯出感興趣的目標(biāo)的輪廓。其次,要進(jìn)行二值圖像的處理與分析,首先要把灰度圖像二值化,得到二值化圖像。

所有灰度大于或等于閾值的像素被判定為屬于特定物體,其灰度值為255表示,否則這些像素點(diǎn)被排除在物體區(qū)域以外,灰度值為0,表示背景或者例外的物體區(qū)域。

原理圖像的二值化處理就是將圖像上的點(diǎn)的灰度值為0或255,也就是將整個(gè)圖像呈現(xiàn)出明顯的黑白效果。即將256個(gè)亮度等級(jí)的灰度圖像通過適當(dāng)?shù)拈撝颠x取而獲得仍然可以反映圖像整體和局部特征的二值化圖像。在數(shù)字圖像處理中,二值圖像占有非常重要的地位,特別是在實(shí)用的圖像處理中,以二值圖像處理實(shí)現(xiàn)而構(gòu)成的系統(tǒng)是很多的,要進(jìn)行二值圖像的處理與分析,首先要把灰度圖像二值化,得到二值化圖像,這樣子有利于在對(duì)圖像做進(jìn)一步處理時(shí),圖像的集合性質(zhì)只與像素值為0或255的點(diǎn)的位置有關(guān),不再涉及像素的多級(jí)值,使處理變得簡(jiǎn)單,而且數(shù)據(jù)的處理和壓縮量小。為了得到理想的二值圖像,一般采用封閉、連通的邊界定義不交疊的區(qū)域。所有灰度大于或等于閾值的像素被判定為屬于特定物體,其灰度值為255表示,否則這些像素點(diǎn)被排除在物體區(qū)域以外,灰度值為0,表示背景或者例外的物體區(qū)域。1

如果某特定物體在內(nèi)部有均勻一致的灰度值,并且其處在一個(gè)具有其他等級(jí)灰度值的均勻背景下,使用閾值法就可以得到比較的分割效果。如果物體同背景的差別表現(xiàn)不在灰度值上(比如紋理不同),可以將這個(gè)差別特征轉(zhuǎn)換為灰度的差別,然后利用閾值選取技術(shù)來分割該圖像。動(dòng)態(tài)調(diào)節(jié)閾值實(shí)現(xiàn)圖像的二值化可動(dòng)態(tài)觀察其分割圖像的具體結(jié)果。

程序?qū)崿F(xiàn)OpenCVOpenCV中有兩個(gè)函數(shù)可以實(shí)現(xiàn)圖片的二值化:

(1)cvThreshold( dst, dst,230 , 255, CV_THRESH_BINARY_INV);

(2)cvAdaptiveThreshold( dst, dst, 255, CV_ADAPTIVE_THRESH_MEAN_C,CV_THRESH_BINARY, 9, -10);

方法(1)是手動(dòng)指定一個(gè)閾值,以此閾值來進(jìn)行二值化處理。其中的第四個(gè)參數(shù)決定了該方法的結(jié)果:

threshold_type=CV_THRESH_BINARY:

dst(x,y) = max_value, if src(x,y)>threshold 0, otherwise.

threshold_type=CV_THRESH_BINARY_INV:

dst(x,y) = 0, if src(x,y)>threshold; dst(x,y) = max_value, otherwise.

threshold_type=CV_THRESH_TRUNC:

dst(x,y) = threshold, if src(x,y)>threshold; dst(x,y) = src(x,y), otherwise.

threshold_type=CV_THRESH_TOZERO:

dst(x,y) = src(x,y), if (x,y)>threshold ; dst(x,y) = 0, otherwise.

threshold_type=CV_THRESH_TOZERO_INV:

dst(x,y) = 0, if src(x,y)>threshold ; dst(x,y) = src(x,y), otherwise.

值得一說的是threshold_type可以使用CV_THRESH_OTSU類型,這樣該函數(shù)就會(huì)使用大律法OTSU得到的全局自適應(yīng)閾值來進(jìn)行二值化圖片,而參數(shù)中的threshold不再起 作用。比如:cvThreshold( dst, dst,300 , 255, CV_THRESH_OTSU | CV_THRESH_BINARY_INV);這種方法對(duì)于灰度直方圖呈現(xiàn)二峰特征的圖片處理起來效果很好。

方法(2)是一個(gè)自適應(yīng)閾值二值化方法,通過設(shè)定最后兩個(gè)參數(shù)來調(diào)整效果。

Matlabfunction level = Mygraythresh(I) %GRAYTHRESH Global image threshold using Otsu's method. % LEVEL = Mygraythresh(I) computes a global threshold (LEVEL) that can be % used to convert an intensity image to a binary image with IM2BW. LEVEL % is a normalized intensity value that lies in the range [0, 1]. % GRAYTHRESH uses Otsu's method, which chooses the threshold to minimize % the intraclass variance of the thresholded black and white pixels. % % Example % ------- % I = imread('coins.png'); % level = Mygraythresh(I); % BW = im2bw(I,level); % figure, imshow(BW) % % See also IM2BW. %I=rgb2gray(I); I=im2uint8(I(:)); depth=256; counts=imhist(I,depth); w=cumsum(counts); ut=counts .* (1:depth)'; u=cumsum(ut); MAX=0; level=0; for t=1:depth u0=u(t,1)/w(t,1); u1=(u(depth,1)-u(t,1))/(w(depth,1)-w(t,1)); w0=w(t,1); w1=w(depth,1)-w0; g=w0*w1*(u1-u0)*(u1-u0); if g > MAX MAX=g; level = t; end end level=level/256; 算法比較1:OTSUOTSU的中心思想是閾值T應(yīng)使目標(biāo)與背景兩類的類間方差最大。對(duì)于一幅圖像,設(shè)當(dāng)前景與背景的分割閾值為t時(shí),前景點(diǎn)占圖像比例為w0,均值為u0,背景點(diǎn)占圖像比例為w1,均值為u1。則整個(gè)圖像的均值為u = w0*u0+w1*u1。建立目標(biāo)函數(shù)g(t)=w0*(u0-u)^2+w1*(u1-u)^2,g(t)就是當(dāng)分割閾值為t時(shí)的類間方差表達(dá)式。OTSU算法使得g(t)取得全局最大值,當(dāng)g(t)為最大時(shí)所對(duì)應(yīng)的t稱為最佳閾值。OTSU算法又稱為最大類間方差法。2

int Threshold(int *hist) //compute the threshold{float u0, u1;float w0, w1;int count0;int t, maxT;float devi, maxDevi = 0; //方差及最大方差int i;int sum = 0;for (i = 0; i imageData+(i+1)*wide;pPreLine=src->imageData+(i-1)*wide;for(j=1;jimageData+i*wide;for(j=0;jthreshold?255:0;}}

評(píng)論
科普cuili007
學(xué)士級(jí)
好的
2023-01-03