OTSU算法也稱最大類間差法,,有時也稱之為大津算法,被認(rèn)為是圖像分割中閾值選取的最佳算法,,計算簡單,,不受圖像亮度和對比度的影響,因此在 數(shù)字圖像處理上得到了廣泛的應(yīng)用,。它是按圖像的灰度特性,將圖像分成背景和前景兩部分,。背景和前景之間的類間方差越大,說明構(gòu)成圖像的兩部分的差別越大, 當(dāng)部分前景錯分為背景或部分背景錯分為前景都會導(dǎo)致兩部分差別變小。因此,使類間方差最大的分割意味著錯分概率最小,。
設(shè)灰度圖像灰度級是L,,則灰度范圍為[0,L-1],利用OTSU算法計算圖像的最佳閾值為:
t = Max[w0(t) *
(u0(t) - u)^2 + w1(t) * (u1(t) - u)^2)]
其中的變量說明:當(dāng)分割的閾值為t時,,w0為背景比例,,u0為
背景均值,w1為前景比例,,u1為前景均值,,u為整幅圖像的均值。
使以上表達(dá)式值最大的t,,即為分割圖像的最佳閾值,。
以下是一段在OpenCV中 實現(xiàn)的C語言程序,即一個使用OTSU算法提取圖像閾值的函數(shù),,輸入?yún)?shù)為一個圖像指針,,返回分割該圖像的最佳閾值。
01 |
int otsuThreshold(IplImage
*frame) |
02 |
{ |
03 |
int width = frame->width; |
04 |
int height = frame->height; |
05 |
int pixelCount[GrayScale]; |
06 |
float pixelPro[GrayScale]; |
07 |
int i, j, pixelSum = width *
height, threshold = 0; |
08 |
uchar*
data = (uchar*)frame->imageData; |
09 |
10 |
for (i = 0; i < GrayScale; i++) |
11 |
{ |
12 |
pixelCount[i] = 0; |
13 |
pixelPro[i] = 0; |
14 |
} |
15 |
16 |
//統(tǒng)計灰度級中每個像素在整幅圖像中的
個數(shù) |
17 |
for (i = 0; i < height; i++) |
18 |
{ |
19 |
for (j = 0;j < width;j++) |
20 |
{ |
21 |
pixelCount[( int )data[i *
width + j]]++; |
22 |
} |
23 |
} |
24 |
|
25 |
//計算每個像素在整幅圖像中的比例 |
26 |
for (i = 0; i <
GrayScale; i++) |
27 |
{ |
28 |
pixelPro[i] = ( float )pixelCount[i] / pixelSum; |
29 |
} |
30 |
31 |
//遍歷灰度級[0,255] |
32 |
float w0, w1, u0tmp, u1tmp, u0,
u1, u, |
33 |
deltaTmp,
deltaMax = 0; |
34 |
for (i = 0; i < GrayScale; i++) |
35 |
{ |
36 |
w0 = w1 = u0tmp = u1tmp = u0 = u1 = u = deltaTmp = 0; |
37 |
for (j = 0; j <
GrayScale; j++) |
38 |
{ |
39 |
if (j <= i) //背景部
分 |
40 |
{ |
41 |
w0 += pixelPro[j]; |
42 |
u0tmp += j * pixelPro[j]; |
43 |
} |
44 |
else //前景部分 |
45 |
{ |
46 |
w1 += pixelPro[j]; |
47 |
u1tmp += j * pixelPro[j]; |
48 |
} |
49 |
} |
50 |
u0 = u0tmp / w0; |
51 |
u1 = u1tmp / w1; |
52 |
u = u0tmp + u1tmp; |
53 |
deltaTmp = |
54 |
w0 * pow ((u0 - u), 2) + w1 * pow ((u1 - u), 2); |
55 |
if (deltaTmp > deltaMax) |
56 |
{ |
57 |
deltaMax =
deltaTmp; |
58 |
threshold = i; |
59 |
} |
60 |
} |
61 |
return threshold; |
62 |
} |