OTSU演算法提取映像閾值的C語言實現

來源:互聯網
上載者:User

 

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)
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     //統計灰階級中每個像素在整幅映像中的個數
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 }

--End--

作者:Steven Wang | 可以轉載, 轉載時務必以超連結形式標明文章原始出處和作者資訊及著作權聲明

網址:http://blog.stevenwang.name/ostu-threshold-56002.html
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.