OTSU演算法提取映像閾值的C語言實現10 CommentsPosted on 三月 6 2010
OTSU演算法也稱最大類間差法,有時也稱之為大津演算法,被認為是映像分割中閾值選取的最佳演算法,計算簡單,不受映像亮度和對比的影響,因此在數位影像處理上得到了廣泛的應用。它是按映像的灰階特性,將映像分成背景和前景兩部分。背景和前景之間的類間方差越大,說明構成映像的兩部分的差別越大,當部分前景錯分為背景或部分背景錯分為前景都會導致兩部分差別變小。因此,使類間方差最大的分割意味著錯分機率最小。
設灰階映像灰階級是L,則灰階範圍為[0,L-1],利用OTSU演算法計算映像的最佳閾值為:
t = Max[w0(t) * (u0(t) - u)^2 + w1(t) * (u1(t) - u)^2)]
其中的變數說明:當分割的閾值為t時,w0為背景比例,u0為背景均值,w1為前景比例,u1為前景均值,u為整幅映像的均值。
使以上運算式值最大的t,即為分割映像的最佳閾值。
以下是一段在OpenCV中實現的C語言程式,即一個使用OTSU演算法提取映像閾值的函數,輸入參數為一個映像指標,返回分割該映像的最佳閾值。
view source
print?
01 |
int otsuThreshold(IplImage *frame)
|
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;
|
10 |
for (i = 0; i < GrayScale; i++)
|
17 |
for (i = 0; i < height; i++)
|
19 |
for (j = 0;j < width;j++)
|
21 |
pixelCount[( int )data[i * width + j]]++;
|
26 |
for (i = 0; i < GrayScale; i++)
|
28 |
pixelPro[i] = ( float )pixelCount[i] / pixelSum;
|
32 |
float
w0, w1, u0tmp, u1tmp, u0, u1, u, |
33 |
deltaTmp, deltaMax = 0;
|
34 |
for (i = 0; i < GrayScale; i++)
|
36 |
w0 = w1 = u0tmp = u1tmp = u0 = u1 = u = deltaTmp = 0;
|
37 |
for (j = 0; j < GrayScale; j++)
|
42 |
u0tmp += j * pixelPro[j];
|
47 |
u1tmp += j * pixelPro[j];
|
54 |
w0 *
pow ((u0 - u), 2) + w1 *
pow ((u1 - u), 2);
|
55 |
if (deltaTmp > deltaMax)
|
--End--
作者:Steven Wang | 可以轉載, 轉載時務必以超連結形式標明文章原始出處和作者資訊及著作權聲明
網址:http://blog.stevenwang.name/ostu-threshold-56002.html