图像二值化----otsu(最大类间方差法、大津算法)(二)
轉(zhuǎn)自:http://blog.stevenwang.name/ostu-threshold-56002.html
?
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ù)為一個圖像指針,返回分割該圖像的最佳閾值。
int otsuThreshold(IplImage *frame)
{int width = frame->width;int height = frame->height;int pixelCount[GrayScale];float pixelPro[GrayScale];int i, j, pixelSum = width * height, threshold = 0;uchar* data = (uchar*)frame->imageData;for(i = 0; i < GrayScale; i++){pixelCount[i] = 0;pixelPro[i] = 0;}//統(tǒng)計灰度級中每個像素在整幅圖像中的個數(shù)for(i = 0; i < height; i++){for(j = 0;j < width;j++){pixelCount[(int)data[i * width + j]]++;}}//計算每個像素在整幅圖像中的比例for(i = 0; i < GrayScale; i++){pixelPro[i] = (float)pixelCount[i] / pixelSum;}//遍歷灰度級[0,255]float w0, w1, u0tmp, u1tmp, u0, u1, u, deltaTmp, deltaMax = 0;for(i = 0; i < GrayScale; i++){w0 = w1 = u0tmp = u1tmp = u0 = u1 = u = deltaTmp = 0;for(j = 0; j < GrayScale; j++){if(j <= i) //背景部分{w0 += pixelPro[j];u0tmp += j * pixelPro[j];}else //前景部分{w1 += pixelPro[j];u1tmp += j * pixelPro[j];}}u0 = u0tmp / w0;u1 = u1tmp / w1;u = u0tmp + u1tmp;deltaTmp = w0 * pow((u0 - u), 2) + w1 * pow((u1 - u), 2);if(deltaTmp > deltaMax){deltaMax = deltaTmp;threshold = i;}}return threshold;
}
總結(jié)
以上是生活随笔為你收集整理的图像二值化----otsu(最大类间方差法、大津算法)(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图像处理-仿射变换 AffineTran
- 下一篇: OpenCV编程案例:使用轮廓函数检测连